2012-05-28 13 views
9

Ich verwende BulletSharp, eine C# -Distribution der Bullet-Bibliothek. Ich habe etwas in ein Objekt geworfen, das angeblich eine Restitution von 0.0f hat.Wie kann ich mein Physikobjekt zur Ruhe bringen?

Ich habe einen dynamischen Zylinder (was bald ein Gitter sein wird), das auf zwei statischen Zylindern ruht. Wie so:

starting object positions

Der Zylinder oben springt oft wild um, in der Regel auf der Seite abprallen.

Hier ist der Code, den ich mit der Szene einzurichten:

 //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); 

Und jedes Bild I world.StepSimulation(0.05f, 100, 0.0005f); verwenden, um die Physik-Simulation zu aktualisieren.

Fehle ich offensichtliche Einstellungen? Warum macht meine Simulation das?

Kleines Update: Ich habe erfolgreich eine ähnliche Simulation in Blender's Bullet Zeug gemacht. Es gab kein Aufprallen ... Ich weiß nicht, welchen Unterschied es zwischen dem und dem gibt.

+0

Können Sie dem fallenden Objekt Restitution hinzufügen? – MoonKnight

+0

Hinzufügen von Restitution nur zu dem fallenden Objekt ergab keinen nennenswerten Unterschied. Die Restitution auf 0,1 für alle drei Objekte schien sich etwas zu beruhigen, aber abhängig von der Simulationsschrittgröße. Es gab immer noch ein bisschen Prellen, gelegentlich abprallen. – tugs

Antwort

4

Sie haben Ihrem Modell keine Trägheit hinzugefügt. Das sollte das Zittern verlangsamen und sollte nicht das Reverb erzeugen, das damit endet, dass es von den Walzen abprallt. Sie müssen es für alle drei Objekte einschließlich der Null auf den Walzen hinzufügen. Versuchen Sie dies und lassen Sie mich wissen, wie es funktioniert:

//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);