Use btContinuousConvexCollision instead of btGjkConvexCast (has issues in btCollisionWorld::objectQuerySingle)

Fixes in btHeightfieldTerrainShape, thanks Jay Lee.
This commit is contained in:
ejcoumans
2007-12-11 00:38:13 +00:00
parent a45912e39c
commit c1c01ff1a0
3 changed files with 117 additions and 113 deletions

View File

@@ -412,7 +412,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
btConvexShape* convexShape = (btConvexShape*) collisionShape; btConvexShape* convexShape = (btConvexShape*) collisionShape;
btVoronoiSimplexSolver simplexSolver; btVoronoiSimplexSolver simplexSolver;
btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult)) if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
{ {

View File

@@ -18,9 +18,11 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h" #include "LinearMath/btTransformUtil.h"
btHeightfieldTerrainShape::btHeightfieldTerrainShape(int width,int length,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges) btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
:m_width(width), : m_heightStickWidth(heightStickWidth),
m_length(length), m_heightStickLength(heightStickLength),
m_width((btScalar)heightStickWidth-1),
m_length((btScalar)heightStickLength-1),
m_maxHeight(maxHeight), m_maxHeight(maxHeight),
m_heightfieldDataUnknown(heightfieldData), m_heightfieldDataUnknown(heightfieldData),
m_useFloatData(useFloatData), m_useFloatData(useFloatData),
@@ -44,7 +46,7 @@ m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
{ {
halfExtents.setValue( halfExtents.setValue(
btScalar(m_maxHeight), btScalar(m_maxHeight),
btScalar(m_width), btScalar(m_width), //?? don't know if this should change
btScalar(m_length)); btScalar(m_length));
break; break;
} }
@@ -114,11 +116,11 @@ btScalar btHeightfieldTerrainShape::getHeightFieldValue(int x,int y) const
btScalar val = 0.f; btScalar val = 0.f;
if (m_useFloatData) if (m_useFloatData)
{ {
val = m_heightfieldDataFloat[(y*m_width)+x]; val = m_heightfieldDataFloat[(y*m_heightStickWidth)+x];
} else } else
{ {
//assume unsigned short int //assume unsigned short int
unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_width)+x]; unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_heightStickWidth)+x];
val = heightFieldValue* (m_maxHeight/btScalar(65535)); val = heightFieldValue* (m_maxHeight/btScalar(65535));
} }
return val; return val;
@@ -133,8 +135,8 @@ void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const
btAssert(x>=0); btAssert(x>=0);
btAssert(y>=0); btAssert(y>=0);
btAssert(x<m_width); btAssert(x<m_heightStickWidth);
btAssert(y<m_length); btAssert(y<m_heightStickLength);
btScalar height = getHeightFieldValue(x,y); btScalar height = getHeightFieldValue(x,y);
@@ -218,18 +220,18 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback
int startX=0; int startX=0;
int endX=m_width-1; int endX=m_heightStickWidth-1;
int startJ=0; int startJ=0;
int endJ=m_length-1; int endJ=m_heightStickLength-1;
switch (m_upAxis) switch (m_upAxis)
{ {
case 0: case 0:
{ {
quantizedAabbMin[1]+=m_width/2-1; quantizedAabbMin[1]+=m_heightStickWidth/2-1;
quantizedAabbMax[1]+=m_width/2+1; quantizedAabbMax[1]+=m_heightStickWidth/2+1;
quantizedAabbMin[2]+=m_length/2-1; quantizedAabbMin[2]+=m_heightStickLength/2-1;
quantizedAabbMax[2]+=m_length/2+1; quantizedAabbMax[2]+=m_heightStickLength/2+1;
if (quantizedAabbMin[1]>startX) if (quantizedAabbMin[1]>startX)
startX = quantizedAabbMin[1]; startX = quantizedAabbMin[1];
@@ -243,10 +245,10 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback
} }
case 1: case 1:
{ {
quantizedAabbMin[0]+=m_width/2-1; quantizedAabbMin[0]+=m_heightStickWidth/2-1;
quantizedAabbMax[0]+=m_width/2+1; quantizedAabbMax[0]+=m_heightStickWidth/2+1;
quantizedAabbMin[2]+=m_length/2-1; quantizedAabbMin[2]+=m_heightStickLength/2-1;
quantizedAabbMax[2]+=m_length/2+1; quantizedAabbMax[2]+=m_heightStickLength/2+1;
if (quantizedAabbMin[0]>startX) if (quantizedAabbMin[0]>startX)
startX = quantizedAabbMin[0]; startX = quantizedAabbMin[0];
@@ -260,10 +262,10 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback
}; };
case 2: case 2:
{ {
quantizedAabbMin[0]+=m_width/2-1; quantizedAabbMin[0]+=m_heightStickWidth/2-1;
quantizedAabbMax[0]+=m_width/2+1; quantizedAabbMax[0]+=m_heightStickWidth/2+1;
quantizedAabbMin[1]+=m_length/2-1; quantizedAabbMin[1]+=m_heightStickLength/2-1;
quantizedAabbMax[1]+=m_length/2+1; quantizedAabbMax[1]+=m_heightStickLength/2+1;
if (quantizedAabbMin[0]>startX) if (quantizedAabbMin[0]>startX)
startX = quantizedAabbMin[0]; startX = quantizedAabbMin[0];
@@ -290,7 +292,7 @@ void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback
for(int x=startX; x<endX; x++) for(int x=startX; x<endX; x++)
{ {
btVector3 vertices[3]; btVector3 vertices[3];
if (m_flipQuadEdges || (m_useDiamondSubdivision && ((j+x) & 1))) if (m_flipQuadEdges || (m_useDiamondSubdivision && !((j+x) & 1)))
{ {
//first triangle //first triangle
getVertex(x,j,vertices[0]); getVertex(x,j,vertices[0]);

View File

@@ -26,9 +26,11 @@ protected:
btVector3 m_localAabbMax; btVector3 m_localAabbMax;
///terrain data ///terrain data
int m_width; int m_heightStickWidth;
int m_length; int m_heightStickLength;
btScalar m_maxHeight; btScalar m_maxHeight;
btScalar m_width;
btScalar m_length;
union union
{ {
unsigned char* m_heightfieldDataUnsignedChar; unsigned char* m_heightfieldDataUnsignedChar;
@@ -58,7 +60,7 @@ protected:
} }
public: public:
btHeightfieldTerrainShape(int width,int height,void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges); btHeightfieldTerrainShape(int heightStickWidth,int heightStickHeight,void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges);
virtual ~btHeightfieldTerrainShape(); virtual ~btHeightfieldTerrainShape();