2013-05-20 3 views
2

Я новичок в Bullet и всех материалах 3D и phisycs, поэтому не сердитесь :) Я не хочу создавать большую статическую жесткую сферу и немного динамичную внутри. Я хочу использовать большой, как бутылку, так что маленькая сфера может перемещаться внутри, но не может покидать сферу, кроме одной точки сверху. Я написал 2 модели в Blender (конечно, я сделал отверстие в большой сфере), создал мир и разместил объекты внутри. Но когда я запускаю приложение, маленькая сфера просто выкидывает из большой с экстремальной скоростью. Также я использую Bullet с библиотекой GDX для Android, если это помогает.Мяч в шаре с использованием Bullet

Этот код инициализирует мир.

public final btCollisionConfiguration collisionConfiguration; 
public final btCollisionDispatcher dispatcher; 
public final btBroadphaseInterface broadphase; 
public final btConstraintSolver solver; 
public final btCollisionWorld collisionWorld; 
public PerformanceCounter performanceCounter; 
public final Vector3 gravity; 

public int maxSubSteps = 5; 

public World() { 
    Vector3 gravity = new Vector3(0, -10, 0); 

    collisionConfiguration = new btDefaultCollisionConfiguration(); 
    dispatcher = new btCollisionDispatcher(collisionConfiguration); 
    broadphase = new btDbvtBroadphase(); 
    solver = new btSequentialImpulseConstraintSolver(); 
    collisionWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); 
    ((btDynamicsWorld)collisionWorld).setGravity(gravity); 
    this.gravity = gravity; 
} 

И некоторый код для создания большой сферы

final StillModel sphereS = ModelLoaderRegistry.loadStillModel(Gdx.files.internal("data/Ssphere.obj")); 
    sphereS.subMeshes[0].getMesh().scale(3f, 3f, 3f); 

    final BoundingBox sphereSBounds = new BoundingBox(); 
    sphereS.getBoundingBox(sphereSBounds); 
    final Constructor sphereSConstructor = new Constructor(sphereS, 0f, new btSphereShape(sphereSBounds.getDimensions().x)); 
    sphereSConstructor.bodyInfo.setM_restitution(1f); 
    world.addConstructor("sphereS", sphereSConstructor); 

код для маленькой сферы

final StillModel sphereModel =   ModelLoaderRegistry.loadStillModel(Gdx.files.internal("data/sphere.obj")); 
    sphereModel.subMeshes[0].getMesh().scale(0.8f, 0.8f, 0.8f); 
    final BoundingBox sphereBounds = new BoundingBox(); 
    sphereModel.getBoundingBox(sphereBounds); 

    final Constructor sphereConstructor = new Constructor(sphereModel, 0.25f, new btSphereShape(sphereBounds.getDimensions().x * 0.5f)); 
    sphereConstructor.bodyInfo.setM_restitution(1f); 
    world.addConstructor("sphere", sphereConstructor); 

Конструктор класса просто создает btRigidBodyConstructionInfo и btCollisionShape объекты, конструирует сферы и место там в Мир.

Итак, не могли бы вы рассказать мне, как я могу создать пустую сферу с шаром внутри?

P.S. Пожалуйста, не говори мне Google, я уже сделал это

P.P.S Извините за мой английский

+0

Пожалуй, мало думает, сфера подмигнули пулю;) Но более серьезно, как вы построить большой шар, он пустой внутри? – flup

+0

думаю. Раньше я читал некоторые руководства. Пример http://blog.pdark.de/2007/11/12/hollow-sphere-in-blender/ – massaraksh111

ответ

1

Поскольку ваша большая сфера не является выпуклой, вы не должны использовать btSphereShape для него. Вы можете попробовать btBvhTriangleMeshShape или некоторые другие не выпуклые фигуры.

Это немного сложнее построить, но при взгляде на некоторые примеры могут быть представлены идеи. Во всяком случае, нет простого способа получить то, что вы хотите, потому что это даже не обычная пустая сфера (я думаю, что используемая вами инфраструктура libgdx использует только вашу модель сферы для рендеринга).

1
Model sphere = modelBuilder.createSphere(-100f, 100f, 100f, 20, 20, new Material(ColorAttribute.createDiffuse(Color.BLUE)), 
      VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal); 

ModelInstance instance = new ModelInstance(sphere); 

btBvhTriangleMeshShape sphereShape = new btBvhTriangleMeshShape(instance.model.meshParts); 

btRigidBody.btRigidBodyConstructionInfo constructionInfo = new btRigidBody.btRigidBodyConstructionInfo(0, null, sphereShape, new Vector3(0,0,0)); 

btRigidBody body = new btRigidBody(constructionInfo); 

body.setCollisionFlags(body.getCollisionFlags()| btCollisionObject.CollisionFlags.CF_STATIC_OBJECT); 

dynamicsWorld.addRigidBody(body); 

работает