Use proper rotation for computing local aabb for convex cast shape.

Propagate hit point from convex caster to world callback [work in progress].
This commit is contained in:
johnmccutchan
2007-12-07 21:22:38 +00:00
parent 68af58c09d
commit 513a055035
7 changed files with 33 additions and 32 deletions

View File

@@ -39,7 +39,8 @@ public:
btVector3 source[NUMRAYS_IN_BAR]; btVector3 source[NUMRAYS_IN_BAR];
btVector3 dest[NUMRAYS_IN_BAR]; btVector3 dest[NUMRAYS_IN_BAR];
btVector3 direction[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]; btVector3 normal[NUMRAYS_IN_BAR];
int frame_counter; int frame_counter;
@@ -153,11 +154,13 @@ public:
cw->convexTest (&boxShape, source[i], dest[i], cb); cw->convexTest (&boxShape, source[i], dest[i], cb);
if (cb.HasHit ()) 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] = cb.m_hitNormalWorld;
normal[i].normalize (); normal[i].normalize ();
} else { } else {
hit[i] = dest[i]; hit_com[i] = dest[i];
hit_surface[i] = dest[i];
normal[i] = btVector3(1.0, 0.0, 0.0); normal[i] = btVector3(1.0, 0.0, 0.0);
} }
@@ -195,20 +198,21 @@ public:
for (int i = 0; i < NUMRAYS_IN_BAR; i++) for (int i = 0; i < NUMRAYS_IN_BAR; i++)
{ {
glVertex3f (source[i][0], source[i][1], source[i][2]); 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); glColor3f (1.0, 1.0, 1.0);
glBegin (GL_LINES); glBegin (GL_LINES);
btScalar normal_scale = 10.0; // easier to see if this is big
for (int i = 0; i < NUMRAYS_IN_BAR; i++) for (int i = 0; i < NUMRAYS_IN_BAR; i++)
{ {
glVertex3f (hit[i][0], hit[i][1], hit[i][2]); glVertex3f (hit_surface[i][0], hit_surface[i][1], hit_surface[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] + normal_scale * normal[i][0], hit_surface[i][1] + normal_scale * normal[i][1], hit_surface[i][2] + normal_scale * normal[i][2]);
} }
glEnd (); glEnd ();
glColor3f (0.0, 1.0, 1.0); glColor3f (0.0, 1.0, 1.0);
for (int i = 0; i < NUMRAYS_IN_BAR; i++) for (int i = 0; i < NUMRAYS_IN_BAR; i++)
{ {
drawCube (hit[i]); drawCube (hit_com[i]);
} }
glEnable (GL_LIGHTING); glEnable (GL_LIGHTING);
} }
@@ -339,6 +343,7 @@ void ConcaveConvexcastDemo::initPhysics()
} }
startTransform.setIdentity(); startTransform.setIdentity();
//startTransform = btTransform(btQuaternion (btVector3(1,1,1), 1.5));
staticBody = localCreateRigidBody(mass, startTransform,groundShape); staticBody = localCreateRigidBody(mass, startTransform,groundShape);
staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT);

View File

@@ -378,13 +378,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
btConvexShape* convexShape = (btConvexShape*) collisionShape; btConvexShape* convexShape = (btConvexShape*) collisionShape;
btVoronoiSimplexSolver simplexSolver; btVoronoiSimplexSolver simplexSolver;
#define USE_SUBSIMPLEX_CONVEX_CAST 1 btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver);
#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
if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
{ {
@@ -404,7 +398,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
collisionObject, collisionObject,
0, 0,
castResult.m_normal, castResult.m_normal,
btVector3(6,6,6), // FIXME need real hitpoint castResult.m_hitPoint,
castResult.m_fraction castResult.m_fraction
); );
@@ -423,9 +417,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btTransform worldTocollisionObject = colObjWorldTransform.inverse();
btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin(); btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin();
btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin(); btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin();
btTransform rotationXform; // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation
btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
rotationXform.setIdentity (); // FIXME!!!
//ConvexCast::CastResult //ConvexCast::CastResult
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
@@ -480,9 +473,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
btTransform worldTocollisionObject = colObjWorldTransform.inverse(); btTransform worldTocollisionObject = colObjWorldTransform.inverse();
btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin(); btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin();
btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin(); btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin();
btTransform rotationXform; // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation
btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
rotationXform.setIdentity (); // FIXME!!!
//ConvexCast::CastResult //ConvexCast::CastResult
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
@@ -518,7 +510,6 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
bool normalInWorldSpace = false; bool normalInWorldSpace = false;
return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace); return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace);
} }
return hitFraction; return hitFraction;

View File

@@ -262,23 +262,23 @@ public:
btVector3 m_hitPointWorld; btVector3 m_hitPointWorld;
btCollisionObject* m_hitCollisionObject; 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 //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_closestHitFraction = convexResult.m_hitFraction;
m_hitCollisionObject = rayResult.m_hitCollisionObject; m_hitCollisionObject = convexResult.m_hitCollisionObject;
if (normalInWorldSpace) if (normalInWorldSpace)
{ {
m_hitNormalWorld = rayResult.m_hitNormalLocal; m_hitNormalWorld = convexResult.m_hitNormalLocal;
} else } else
{ {
///need to transform normal into worldspace ///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); m_hitPointWorld = convexResult.m_hitPointLocal;
return rayResult.m_hitFraction; return convexResult.m_hitFraction;
} }
}; };

View File

@@ -174,6 +174,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
result.m_fraction = lastLambda; result.m_fraction = lastLambda;
n = pointCollector.m_normalOnBInWorld; n = pointCollector.m_normalOnBInWorld;
result.m_normal=n;//.setValue(1,1,1);// = n; result.m_normal=n;//.setValue(1,1,1);// = n;
result.m_hitPoint = pointCollector.m_pointInWorld;
return true; return true;
} }
c = pointCollector.m_pointInWorld; c = pointCollector.m_pointInWorld;
@@ -189,6 +190,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
result.m_fraction = lambda; result.m_fraction = lambda;
result.m_normal = n; result.m_normal = n;
result.m_hitPoint = c;
return true; return true;
} }

View File

@@ -50,6 +50,7 @@ public:
virtual ~CastResult() {}; virtual ~CastResult() {};
btVector3 m_normal; btVector3 m_normal;
btVector3 m_hitPoint;
btScalar m_fraction; btScalar m_fraction;
btTransform m_hitTransformA; btTransform m_hitTransformA;
btTransform m_hitTransformB; btTransform m_hitTransformB;

View File

@@ -148,6 +148,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
//degeneracy, report a hit //degeneracy, report a hit
result.m_fraction = lastLambda; result.m_fraction = lastLambda;
result.m_normal = n; result.m_normal = n;
result.m_hitPoint = pointCollector.m_pointInWorld;
return true; return true;
} }
c = pointCollector.m_pointInWorld; c = pointCollector.m_pointInWorld;
@@ -165,6 +166,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
result.m_fraction = lastLambda; result.m_fraction = lastLambda;
result.m_normal = n; result.m_normal = n;
result.m_hitPoint = c;
return true; return true;
} }
} }

View File

@@ -118,7 +118,7 @@ btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape*
void void
btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, int triangleIndex) 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; btVoronoiSimplexSolver simplexSolver;
@@ -148,7 +148,7 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
castResult.m_normal.normalize(); castResult.m_normal.normalize();
reportHit (castResult.m_normal, reportHit (castResult.m_normal,
btVector3(6,6,6), castResult.m_hitPoint,
castResult.m_fraction, castResult.m_fraction,
partId, partId,
triangleIndex); triangleIndex);