+ capsule should subtract margin, and take local scaling into account.

+ boxshape uses btFsels
+ add assert in btGjkPairDetector that the new non-virtual method produces the same result as old non-virtual
This commit is contained in:
erwin.coumans
2008-09-30 18:37:01 +00:00
parent 9f28b2bc12
commit 0ff15db3f3
2 changed files with 30 additions and 5 deletions

View File

@@ -67,9 +67,9 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
btConvexInternalShape* convexShape = (btConvexInternalShape*)this; btConvexInternalShape* convexShape = (btConvexInternalShape*)this;
const btVector3& halfExtents = convexShape->getImplicitShapeDimensions(); const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
return btVector3(localDir.getX() < 0.0f ? -halfExtents.x() : halfExtents.x(), return btVector3(btFsels(localDir.x(), halfExtents.x(), -halfExtents.x()),
localDir.getY() < 0.0f ? -halfExtents.y() : halfExtents.y(), btFsels(localDir.y(), halfExtents.y(), -halfExtents.y()),
localDir.getZ() < 0.0f ? -halfExtents.z() : halfExtents.z()); btFsels(localDir.z(), halfExtents.z(), -halfExtents.z()));
} }
break; break;
case TRIANGLE_SHAPE_PROXYTYPE: case TRIANGLE_SHAPE_PROXYTYPE:
@@ -173,8 +173,11 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
btVector3 pos(0,0,0); btVector3 pos(0,0,0);
pos[capsuleUpAxis] = halfHeight; pos[capsuleUpAxis] = halfHeight;
vtx = pos +vec*(radius); //vtx = pos +vec*(radius);
vtx = pos +vec*capsuleShape->getLocalScalingNV()*(radius) - vec * capsuleShape->getMarginNV();
newDot = vec.dot(vtx); newDot = vec.dot(vtx);
if (newDot > maxDot) if (newDot > maxDot)
{ {
maxDot = newDot; maxDot = newDot;
@@ -185,7 +188,8 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
btVector3 pos(0,0,0); btVector3 pos(0,0,0);
pos[capsuleUpAxis] = -halfHeight; pos[capsuleUpAxis] = -halfHeight;
vtx = pos +vec*(radius); //vtx = pos +vec*(radius);
vtx = pos +vec*capsuleShape->getLocalScalingNV()*(radius) - vec * capsuleShape->getMarginNV();
newDot = vec.dot(vtx); newDot = vec.dot(vtx);
if (newDot > maxDot) if (newDot > maxDot)
{ {

View File

@@ -18,7 +18,10 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" #include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" #include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h"
#if defined(DEBUG) || defined (_DEBUG) #if defined(DEBUG) || defined (_DEBUG)
#define TEST_NON_VIRTUAL 1
#include <stdio.h> //for debug printf #include <stdio.h> //for debug printf
#ifdef __SPU__ #ifdef __SPU__
#include <spu_printf.h> #include <spu_printf.h>
@@ -59,9 +62,18 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
localTransA.getOrigin() -= positionOffset; localTransA.getOrigin() -= positionOffset;
localTransB.getOrigin() -= positionOffset; localTransB.getOrigin() -= positionOffset;
btScalar marginA = m_minkowskiA->getMarginNonVirtual(); btScalar marginA = m_minkowskiA->getMarginNonVirtual();
btScalar marginB = m_minkowskiB->getMarginNonVirtual(); btScalar marginB = m_minkowskiB->getMarginNonVirtual();
#ifdef TEST_NON_VIRTUAL
btScalar marginAv = m_minkowskiA->getMargin();
btScalar marginBv = m_minkowskiB->getMargin();
btAssert(marginA == marginAv);
btAssert(marginB == marginBv);
#endif //TEST_NON_VIRTUAL
gNumGjkChecks++; gNumGjkChecks++;
#ifdef DEBUG_SPU_COLLISION_DETECTION #ifdef DEBUG_SPU_COLLISION_DETECTION
@@ -105,8 +117,17 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis(); btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis();
btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis(); btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis();
#ifdef TEST_NON_VIRTUAL
btVector3 pInAv = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA);
btVector3 qInBv = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB);
#endif
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA); btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB); btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
#ifdef TEST_NON_VIRTUAL
btAssert((pInAv-pInA).length() < 0.0001);
btAssert((qInBv-qInB).length() < 0.0001);
#endif //
btPoint3 pWorld = localTransA(pInA); btPoint3 pWorld = localTransA(pInA);
btPoint3 qWorld = localTransB(qInB); btPoint3 qWorld = localTransB(qInB);