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:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user