From 513a055035562746c1988e8c67adb11275ff81ba Mon Sep 17 00:00:00 2001 From: johnmccutchan Date: Fri, 7 Dec 2007 21:22:38 +0000 Subject: [PATCH] Use proper rotation for computing local aabb for convex cast shape. Propagate hit point from convex caster to world callback [work in progress]. --- .../ConcaveConvexcastDemo.cpp | 19 ++++++++++------- .../CollisionDispatch/btCollisionWorld.cpp | 21 ++++++------------- .../CollisionDispatch/btCollisionWorld.h | 16 +++++++------- .../btContinuousConvexCollision.cpp | 2 ++ .../NarrowPhaseCollision/btConvexCast.h | 1 + .../NarrowPhaseCollision/btGjkConvexCast.cpp | 2 ++ .../btRaycastCallback.cpp | 4 ++-- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp index d70110e52..a9393b658 100644 --- a/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp +++ b/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp @@ -39,7 +39,8 @@ public: btVector3 source[NUMRAYS_IN_BAR]; btVector3 dest[NUMRAYS_IN_BAR]; btVector3 direction[NUMRAYS_IN_BAR]; - btVector3 hit[NUMRAYS_IN_BAR]; + btVector3 hit_com[NUMRAYS_IN_BAR]; + btVector3 hit_surface[NUMRAYS_IN_BAR]; btVector3 normal[NUMRAYS_IN_BAR]; int frame_counter; @@ -153,11 +154,13 @@ public: cw->convexTest (&boxShape, source[i], dest[i], cb); if (cb.HasHit ()) { - hit[i] = cb.m_hitPointWorld; + hit_surface[i] = cb.m_hitPointWorld; + hit_com[i].setInterpolate3(source[i], dest[i], cb.m_closestHitFraction); normal[i] = cb.m_hitNormalWorld; normal[i].normalize (); } else { - hit[i] = dest[i]; + hit_com[i] = dest[i]; + hit_surface[i] = dest[i]; normal[i] = btVector3(1.0, 0.0, 0.0); } @@ -195,20 +198,21 @@ public: for (int i = 0; i < NUMRAYS_IN_BAR; i++) { glVertex3f (source[i][0], source[i][1], source[i][2]); - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit_com[i][0], hit_com[i][1], hit_com[i][2]); } glColor3f (1.0, 1.0, 1.0); glBegin (GL_LINES); + btScalar normal_scale = 10.0; // easier to see if this is big for (int i = 0; i < NUMRAYS_IN_BAR; i++) { - glVertex3f (hit[i][0], hit[i][1], hit[i][2]); - glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + glVertex3f (hit_surface[i][0], hit_surface[i][1], hit_surface[i][2]); + glVertex3f (hit_surface[i][0] + normal_scale * normal[i][0], hit_surface[i][1] + normal_scale * normal[i][1], hit_surface[i][2] + normal_scale * normal[i][2]); } glEnd (); glColor3f (0.0, 1.0, 1.0); for (int i = 0; i < NUMRAYS_IN_BAR; i++) { - drawCube (hit[i]); + drawCube (hit_com[i]); } glEnable (GL_LIGHTING); } @@ -339,6 +343,7 @@ void ConcaveConvexcastDemo::initPhysics() } startTransform.setIdentity(); + //startTransform = btTransform(btQuaternion (btVector3(1,1,1), 1.5)); staticBody = localCreateRigidBody(mass, startTransform,groundShape); staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index b01f66949..cf83dbf0b 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -378,13 +378,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt btConvexShape* convexShape = (btConvexShape*) collisionShape; btVoronoiSimplexSolver simplexSolver; -#define USE_SUBSIMPLEX_CONVEX_CAST 1 -#ifdef USE_SUBSIMPLEX_CONVEX_CAST - btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver); -#else - //btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); - //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); -#endif //#USE_SUBSIMPLEX_CONVEX_CAST + btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) { @@ -404,7 +398,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt collisionObject, 0, castResult.m_normal, - btVector3(6,6,6), // FIXME need real hitpoint + castResult.m_hitPoint, castResult.m_fraction ); @@ -423,9 +417,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin(); btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin(); - btTransform rotationXform; - - rotationXform.setIdentity (); // FIXME!!! + // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation + btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis()); //ConvexCast::CastResult struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback @@ -480,9 +473,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin(); btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin(); - btTransform rotationXform; - - rotationXform.setIdentity (); // FIXME!!! + // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation + btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis()); //ConvexCast::CastResult struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback @@ -518,7 +510,6 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt bool normalInWorldSpace = false; - return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace); } return hitFraction; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h index 52b173702..73b5e8017 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h @@ -262,23 +262,23 @@ public: btVector3 m_hitPointWorld; btCollisionObject* m_hitCollisionObject; - virtual btScalar AddSingleResult(LocalConvexResult& rayResult,bool normalInWorldSpace) + virtual btScalar AddSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) { //caller already does the filter on the m_closestHitFraction - btAssert(rayResult.m_hitFraction <= m_closestHitFraction); + btAssert(convexResult.m_hitFraction <= m_closestHitFraction); - m_closestHitFraction = rayResult.m_hitFraction; - m_hitCollisionObject = rayResult.m_hitCollisionObject; + m_closestHitFraction = convexResult.m_hitFraction; + m_hitCollisionObject = convexResult.m_hitCollisionObject; if (normalInWorldSpace) { - m_hitNormalWorld = rayResult.m_hitNormalLocal; + m_hitNormalWorld = convexResult.m_hitNormalLocal; } else { ///need to transform normal into worldspace - m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal; + m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal; } - m_hitPointWorld.setInterpolate3(m_convexFromWorld,m_convexToWorld,rayResult.m_hitFraction); - return rayResult.m_hitFraction; + m_hitPointWorld = convexResult.m_hitPointLocal; + return convexResult.m_hitFraction; } }; diff --git a/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp b/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp index c6a2b396d..562c0dc47 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp @@ -174,6 +174,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact( result.m_fraction = lastLambda; n = pointCollector.m_normalOnBInWorld; result.m_normal=n;//.setValue(1,1,1);// = n; + result.m_hitPoint = pointCollector.m_pointInWorld; return true; } c = pointCollector.m_pointInWorld; @@ -189,6 +190,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact( result.m_fraction = lambda; result.m_normal = n; + result.m_hitPoint = c; return true; } diff --git a/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h b/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h index cc80f0aa8..ae35d5236 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h +++ b/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h @@ -50,6 +50,7 @@ public: virtual ~CastResult() {}; btVector3 m_normal; + btVector3 m_hitPoint; btScalar m_fraction; btTransform m_hitTransformA; btTransform m_hitTransformB; diff --git a/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp b/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp index da2a02b98..c9e690ab7 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp @@ -148,6 +148,7 @@ bool btGjkConvexCast::calcTimeOfImpact( //degeneracy, report a hit result.m_fraction = lastLambda; result.m_normal = n; + result.m_hitPoint = pointCollector.m_pointInWorld; return true; } c = pointCollector.m_pointInWorld; @@ -165,6 +166,7 @@ bool btGjkConvexCast::calcTimeOfImpact( result.m_fraction = lastLambda; result.m_normal = n; + result.m_hitPoint = c; return true; } } diff --git a/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp b/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp index e0ca5b684..4f4391ff4 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp @@ -118,7 +118,7 @@ btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape* void btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, int triangleIndex) { - btTriangleShape triangleShape (triangle[0], triangle[1], triangle[2]); + btTriangleShape triangleShape (triangle[0], triangle[1], triangle[2]); btVoronoiSimplexSolver simplexSolver; @@ -148,7 +148,7 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, castResult.m_normal.normalize(); reportHit (castResult.m_normal, - btVector3(6,6,6), + castResult.m_hitPoint, castResult.m_fraction, partId, triangleIndex);