2012-05-28 15 views
9

Я использую BulletSharp, распределение C# библиотеки пули. Я получаю некоторое подпрыгивание в объекте, который якобы имеет реституцию 0.0f.Как я могу настроить свой физический объект?

У меня есть один динамический цилиндр (что скоро будет сеткой), падая на два статических цилиндра. Как так:

starting object positions

цилиндр сверху часто отскакивает вокруг дико, как правило, отскакивая в сторону.

Вот код, я использую, чтобы создать сцену:

 //now figure out bulletsharp stuff... 
     CollisionConfiguration collConfig = new DefaultCollisionConfiguration(); 
     Dispatcher collDispatch = new CollisionDispatcher(collConfig); 

     BroadphaseInterface broadphase = new DbvtBroadphase(); 
     ConstraintSolver sol = new SequentialImpulseConstraintSolver(); 
     world = new DiscreteDynamicsWorld(collDispatch, broadphase, sol, collConfig); 

     world.Gravity = new Vector3(0.0f, -10.0f, 0.0f); 

     //log (moving object) 
     MotionState still = new DefaultMotionState(); 
     CylinderShape shape = new CylinderShapeZ(0.5f, 1.0f, 1.0f); 
     still.WorldTransform = Matrix.Translation(0.0f, 0.4f, 0.0f); 
     RigidBodyConstructionInfo constructInfo = new RigidBodyConstructionInfo(1.0f, still, shape); 
     logBody = new RigidBody(constructInfo); 
     logBody.SetDamping(0.04f, 0.1f); 
     world.AddRigidBody(logBody); 

     //rollers (static objects) 
     CylinderShape r1s = new CylinderShapeZ(0.1f, 1.0f, 1.0f); 
     MotionState r1m = new DefaultMotionState(); 
     r1m.WorldTransform = Matrix.Translation(-0.2f, -0.4f, 0.0f); 
     RigidBodyConstructionInfo r1ci = new RigidBodyConstructionInfo(0.0f, r1m, r1s); 
     r1 = new RigidBody(r1ci); 
     world.AddRigidBody(r1); 

     CylinderShape r2s = new CylinderShapeZ(0.1f, 1.0f, 1.0f); 
     MotionState r2m = new DefaultMotionState(); 
     r2m.WorldTransform = Matrix.Translation(0.2f, -0.4f, 0.0f); 
     RigidBodyConstructionInfo r2ci = new RigidBodyConstructionInfo(0.0f, r2m, r2s); 
     r2 = new RigidBody(r2ci); 
     world.AddRigidBody(r2); 

И каждый кадр я использую world.StepSimulation(0.05f, 100, 0.0005f); обновить моделирование физики.

У меня отсутствуют какие-либо очевидные настройки? Почему моя симуляция делает это?

Небольшое обновление: я успешно сделал аналогичную симуляцию в материалах Blender Blender. Там не было подпрыгивания ... Я не знаю, какая разница между этим и этим.

+0

Можете ли вы добавить реституцию к падающему объекту? – MoonKnight

+0

Добавление реституции только к падающему объекту не оказало заметной разницы. Установка реституции на 0,1 для всех трех объектов, похоже, немного уменьшилась, но в зависимости от размера шага моделирования. Все еще было немного подпрыгивать, иногда отскакивая. – tugs

ответ

4

Вы не добавили Инерцию в свою модель. Это должно замедлить дрожание и не должно приводить к реверберации, которая заканчивается в нем, отскакивая от роликов. Вам нужно добавить его для всех трех объектов, включая Zero на роликах. Попробуйте это и дайте мне знать, как это работает:

//now figure out bulletsharp stuff... 
CollisionConfiguration collConfig = new DefaultCollisionConfiguration(); 
Dispatcher collDispatch = new CollisionDispatcher(collConfig); 

BroadphaseInterface broadphase = new DbvtBroadphase(); 
ConstraintSolver sol = new SequentialImpulseConstraintSolver(); 
world = new DiscreteDynamicsWorld(collDispatch, broadphase, sol, collConfig); 

world.Gravity = new Vector3(0.0f, -10.0f, 0.0f); 

//log (moving object) 
Vector3 cylinderInertia; 
MotionState still = new DefaultMotionState(); 
CylinderShape shape = new CylinderShapeZ(0.5f, 1.0f, 1.0f); 
still.WorldTransform = Matrix.Translation(0.0f, 0.4f, 0.0f); 
shape.CalculateLocalInertia(1.0f, out cylinderInertia);  
RigidBodyConstructionInfo constructInfo = new RigidBodyConstructionInfo(1.0f, still, shape, cylinderInertia); 
logBody = new RigidBody(constructInfo); 
logBody.SetDamping(0.04f, 0.1f); 
world.AddRigidBody(logBody); 

//rollers (static objects) 
CylinderShape r1s = new CylinderShapeZ(0.1f, 1.0f, 1.0f); 
MotionState r1m = new DefaultMotionState(); 
r1m.WorldTransform = Matrix.Translation(-0.2f, -0.4f, 0.0f); 
RigidBodyConstructionInfo r1ci = new RigidBodyConstructionInfo(0.0f, r1m, r1s, Vector3.Zero); 
r1 = new RigidBody(r1ci); 
world.AddRigidBody(r1); 

CylinderShape r2s = new CylinderShapeZ(0.1f, 1.0f, 1.0f); 
MotionState r2m = new DefaultMotionState(); 
r2m.WorldTransform = Matrix.Translation(0.2f, -0.4f, 0.0f); 
RigidBodyConstructionInfo r2ci = new RigidBodyConstructionInfo(0.0f, r2m, r2s, Vector3.Zero); 
r2 = new RigidBody(r2ci); 
world.AddRigidBody(r2); 

 Смежные вопросы

  • Нет связанных вопросов^_^