From c3ed55057ca287923ff2db1f512e347b109c8f9c Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Tue, 7 Nov 2006 02:32:52 +0000 Subject: - added linear limits to btGeneric6DofConstraint and made sure the linear axis are in local space of objectA - use microseconds instead of milliseconds for deltatime --- Demos/BasicDemo/BasicDemo.cpp | 6 +- Demos/BspDemo/BspDemo.cpp | 2 +- Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp | 2 +- Demos/ColladaDemo/ColladaDemo.cpp | 2 +- Demos/ConcaveDemo/ConcavePhysicsDemo.cpp | 2 +- Demos/ConstraintDemo/ConstraintDemo.cpp | 106 ++++++++++++++++++--- .../ConvexDecompositionDemo.cpp | 2 +- Demos/OpenGL/DemoApplication.cpp | 4 + .../UserCollisionAlgorithm.cpp | 2 +- Demos/VehicleDemo/VehicleDemo.cpp | 2 +- .../ConstraintSolver/btGeneric6DofConstraint.cpp | 55 +++++++++-- .../Dynamics/btDiscreteDynamicsWorld.cpp | 17 +++- 12 files changed, 163 insertions(+), 39 deletions(-) diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp index 0673e0636..8f4801759 100644 --- a/Demos/BasicDemo/BasicDemo.cpp +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -61,14 +61,14 @@ void BasicDemo::clientMoveAndDisplay() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //simple dynamics world doesn't handle fixed-time-stepping - float ms = m_clock.getTimeMilliseconds(); + float ms = m_clock.getTimeMicroseconds(); m_clock.reset(); - float minFPS = 1000.f/60.f; + float minFPS = 1000000.f/60.f; if (ms > minFPS) ms = minFPS; if (m_dynamicsWorld) - m_dynamicsWorld->stepSimulation(ms / 1000.f); + m_dynamicsWorld->stepSimulation(ms / 1000000.f); renderme(); diff --git a/Demos/BspDemo/BspDemo.cpp b/Demos/BspDemo/BspDemo.cpp index e40cdcd2d..43b514d3e 100644 --- a/Demos/BspDemo/BspDemo.cpp +++ b/Demos/BspDemo/BspDemo.cpp @@ -185,7 +185,7 @@ void BspDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); m_dynamicsWorld->stepSimulation(dt); diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp index 27aa231a3..16acde51b 100644 --- a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -160,7 +160,7 @@ void CcdPhysicsDemo::clientMoveAndDisplay() #endif //USE_KINEMATIC_GROUND - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); printf("dt = %f: ",dt); diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index 0e7956271..6e0d848ca 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -188,7 +188,7 @@ void ColladaDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); m_dynamicsWorld->stepSimulation(dt); diff --git a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp index 007d7fa1f..8efcec3d6 100644 --- a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp @@ -183,7 +183,7 @@ void ConcaveDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); m_dynamicsWorld->stepSimulation(dt); diff --git a/Demos/ConstraintDemo/ConstraintDemo.cpp b/Demos/ConstraintDemo/ConstraintDemo.cpp index a2ba68381..6c34f3acc 100644 --- a/Demos/ConstraintDemo/ConstraintDemo.cpp +++ b/Demos/ConstraintDemo/ConstraintDemo.cpp @@ -14,6 +14,7 @@ subject to the following restrictions: */ + #include "btBulletDynamicsCommon.h" #include "LinearMath/btIDebugDraw.h" @@ -45,8 +46,21 @@ int main(int argc,char** argv) return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo); } +btTransform sliderTransform; +btVector3 lowerSliderLimit = btVector3(-20,0,0); +btVector3 hiSliderLimit = btVector3(10,0,0); - +void drawLimit() +{ + btVector3 from = sliderTransform*lowerSliderLimit; + btVector3 to = sliderTransform*hiSliderLimit; + btVector3 color(255,0,0); + glBegin(GL_LINES); + glColor3f(color.getX(), color.getY(), color.getZ()); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} void ConstraintDemo::initPhysics() { @@ -56,6 +70,7 @@ void ConstraintDemo::initPhysics() //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); m_dynamicsWorld = new btDiscreteDynamicsWorld(); + m_dynamicsWorld->setDebugDrawer(&debugDrawer); btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); btTransform trans; @@ -63,17 +78,16 @@ void ConstraintDemo::initPhysics() trans.setOrigin(btVector3(0,20,0)); float mass = 0.f; - btRigidBody* body0 = localCreateRigidBody( mass,trans,shape); - trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0)); + //point to point constraint (ball socket) + { + btRigidBody* body0 = localCreateRigidBody( mass,trans,shape); + trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0)); - mass = 1.f; - btRigidBody* body1 = localCreateRigidBody( mass,trans,shape); - body1->setDamping(0.3,0.3); + mass = 1.f; + btRigidBody* body1 = localCreateRigidBody( mass,trans,shape); + body1->setActivationState(DISABLE_DEACTIVATION); + body1->setDamping(0.3,0.3); - - clientResetScene(); - - { btVector3 pivotInA(CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS); btVector3 axisInA(0,0,1); @@ -87,21 +101,80 @@ void ConstraintDemo::initPhysics() m_dynamicsWorld->addConstraint(p2p); } + + + + //create a slider, using the generic D6 constraint + { + mass = 1.f; + btVector3 sliderWorldPos(0,10,0); + btVector3 sliderAxis(0,0,1); + btScalar angle=SIMD_RADS_PER_DEG * 10.f; + btMatrix3x3 sliderOrientation(btQuaternion(sliderAxis ,angle)); + trans.setOrigin(sliderWorldPos); + trans.setBasis(sliderOrientation); + sliderTransform = trans; + + btRigidBody* body0 = localCreateRigidBody( mass,trans,shape); + body0->setActivationState(DISABLE_DEACTIVATION); + btRigidBody* fixedBody1 = localCreateRigidBody(0,trans,0); + + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInB = btTransform::getIdentity(); + + btGeneric6DofConstraint* slider = new btGeneric6DofConstraint(*body0,*fixedBody1,frameInA,frameInB); + slider->setLinearLowerLimit(lowerSliderLimit); + slider->setLinearUpperLimit(hiSliderLimit); + slider->setAngularLowerLimit(btVector3(1e30,0,0)); + slider->setAngularUpperLimit(btVector3(-1e30,0,0)); + + m_dynamicsWorld->addConstraint(slider); + + } + } void ConstraintDemo::clientMoveAndDisplay() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = float(m_clock.getTimeMicroseconds()) * 0.000001f; m_clock.reset(); - - m_dynamicsWorld->stepSimulation(dt); + //printf("dt = %f: ",dt); + + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 1; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + bool verbose = false; + if (verbose) + { + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } + } + } renderme(); + drawLimit(); + glFlush(); glutSwapBuffers(); } @@ -113,6 +186,11 @@ void ConstraintDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + m_dynamicsWorld->updateAabbs(); + + drawLimit(); + renderme(); glFlush(); diff --git a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp index 00c878d35..da1296fe4 100644 --- a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -294,7 +294,7 @@ void ConvexDecompositionDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMilliseconds() * 0.001f; + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); m_dynamicsWorld->stepSimulation(dt); diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 2a711fe86..3055afe96 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -822,6 +822,10 @@ void DemoApplication::renderme() void DemoApplication::clientResetScene() { + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(1.f/60.f,0); + } int numObjects = m_dynamicsWorld->getNumCollisionObjects(); for (int i=0;i m_upperLimit[i]) + { + depth -= m_upperLimit[i]; + } else + { + if (depth < m_lowerLimit[i]) + { + depth -= m_lowerLimit[i]; + } else + { + continue; + } + } + } + } btScalar impulse = (tau*depth/timeStep - damping*rel_vel) * jacDiagABInv; + m_accumulatedImpulse[i] += impulse; - btVector3 impulse_vector = normal * impulse; + btVector3 impulse_vector = normalWorld * impulse; m_rbA.applyImpulse( impulse_vector, rel_pos1); m_rbB.applyImpulse(-impulse_vector, rel_pos2); - normal[i] = 0; + localNormalInA[i] = 0; } } diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index e5ce5141b..d605198c6 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -269,12 +269,19 @@ void btDiscreteDynamicsWorld::removeRigidBody(btRigidBody* body) void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body) { - body->setGravity(m_gravity); - bool isDynamic = !(body->isStaticObject() || body->isKinematicObject()); - short collisionFilterGroup = isDynamic? btBroadphaseProxy::DefaultFilter : btBroadphaseProxy::StaticFilter; - short collisionFilterMask = isDynamic? btBroadphaseProxy::AllFilter : btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter; + if (!body->isStaticOrKinematicObject()) + { + body->setGravity(m_gravity); + } - addCollisionObject(body,collisionFilterGroup,collisionFilterMask); + if (body->getCollisionShape()) + { + bool isDynamic = !(body->isStaticObject() || body->isKinematicObject()); + short collisionFilterGroup = isDynamic? btBroadphaseProxy::DefaultFilter : btBroadphaseProxy::StaticFilter; + short collisionFilterMask = isDynamic? btBroadphaseProxy::AllFilter : btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter; + + addCollisionObject(body,collisionFilterGroup,collisionFilterMask); + } } -- cgit v1.2.1