- Added compressed/quantized AABB tree, 16 bytes per node, while supporting 32-bit (triangle) indices. Should be faster and smaller then original version (quantized aabb check is done in integer space)
Original aabb nodes are 44 bytes (with full floating point precision and additional part index) - added meter-unit scaling support in ColladaConverter.cpp
This commit is contained in:
@@ -17,6 +17,7 @@ subject to the following restrictions:
|
||||
//#define REGISTER_CUSTOM_COLLISION_ALGORITHM 1
|
||||
//#define USER_DEFINED_FRICTION_MODEL 1
|
||||
#define USE_CUSTOM_NEAR_CALLBACK 1
|
||||
//#define CENTER_OF_MASS_SHIFT 1
|
||||
|
||||
//following define allows to compare/replace Bullet's constraint solver with ODE quickstep
|
||||
//this define requires to either add the libquickstep library (win32, see msvc/8/libquickstep.vcproj) or manually add the files from Extras/quickstep
|
||||
@@ -46,6 +47,8 @@ float gCollisionMargin = 0.05f;
|
||||
|
||||
#include "GlutStuff.h"
|
||||
|
||||
btTransform comOffset;
|
||||
btVector3 comOffsetVec(0,2,0);
|
||||
|
||||
extern float eye[3];
|
||||
extern int glutScreenWidth;
|
||||
@@ -55,7 +58,7 @@ const int maxProxies = 32766;
|
||||
const int maxOverlap = 65535;
|
||||
|
||||
bool createConstraint = true;//false;
|
||||
bool useCompound = false;//true;//false;
|
||||
bool useCompound = false;
|
||||
|
||||
|
||||
|
||||
@@ -91,6 +94,7 @@ btCollisionShape* shapePtr[numShapes] =
|
||||
#endif
|
||||
|
||||
new btCylinderShape (btVector3(CUBE_HALF_EXTENTS-gCollisionMargin,CUBE_HALF_EXTENTS-gCollisionMargin,CUBE_HALF_EXTENTS-gCollisionMargin)),
|
||||
//new btSphereShape (CUBE_HALF_EXTENTS),
|
||||
//new btCapsuleShape(0.5*CUBE_HALF_EXTENTS-gCollisionMargin,CUBE_HALF_EXTENTS-gCollisionMargin),
|
||||
//new btCylinderShape (btVector3(1-gCollisionMargin,CUBE_HALF_EXTENTS-gCollisionMargin,1-gCollisionMargin)),
|
||||
//new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)),
|
||||
@@ -245,6 +249,48 @@ void CcdPhysicsDemo::clientMoveAndDisplay()
|
||||
|
||||
renderme();
|
||||
|
||||
|
||||
//render the graphics objects, with center of mass shift
|
||||
|
||||
updateCamera();
|
||||
|
||||
|
||||
#ifdef CENTER_OF_MASS_SHIFT
|
||||
btScalar m[16];
|
||||
|
||||
if (m_dynamicsWorld)
|
||||
{
|
||||
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
||||
btVector3 wireColor(1,0,0);
|
||||
for (int i=0;i<numObjects;i++)
|
||||
{
|
||||
btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i];
|
||||
btRigidBody* body = btRigidBody::upcast(colObj);
|
||||
|
||||
if (body && body->getMotionState())
|
||||
{
|
||||
btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState();
|
||||
btTransform offsetTrans = myMotionState->m_graphicsWorldTrans;
|
||||
|
||||
|
||||
btVector3 worldShift = offsetTrans.getBasis() * comOffsetVec;
|
||||
offsetTrans.setOrigin(offsetTrans.getOrigin() + worldShift);
|
||||
|
||||
|
||||
offsetTrans.getOpenGLMatrix(m);
|
||||
|
||||
btVector3 wireColor(1.f,1.0f,1.f); //wants deactivation
|
||||
|
||||
btSphereShape sphereTmp(CUBE_HALF_EXTENTS);
|
||||
|
||||
GL_ShapeDrawer::drawOpenGL(m,&sphereTmp,wireColor,0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif //CENTER_OF_MASS_SHIFT
|
||||
|
||||
|
||||
#ifdef USE_QUICKPROF
|
||||
btProfiler::endBlock("render");
|
||||
#endif
|
||||
@@ -363,13 +409,19 @@ void CcdPhysicsDemo::initPhysics()
|
||||
btCompoundShape* compoundShape = new btCompoundShape();
|
||||
btCollisionShape* oldShape = shapePtr[1];
|
||||
shapePtr[1] = compoundShape;
|
||||
btVector3 sphereOffset(0,0,2);
|
||||
|
||||
btTransform ident;
|
||||
ident.setIdentity();
|
||||
ident.setOrigin(btVector3(0,0,0));
|
||||
compoundShape->addChildShape(ident,oldShape);//
|
||||
ident.setOrigin(btVector3(0,0,2));
|
||||
compoundShape->addChildShape(ident,new btSphereShape(0.9));//
|
||||
comOffset.setIdentity();
|
||||
|
||||
#ifdef CENTER_OF_MASS_SHIFT
|
||||
comOffset.setOrigin(comOffsetVec);
|
||||
compoundShape->addChildShape(comOffset,oldShape);
|
||||
|
||||
#else
|
||||
compoundShape->addChildShape(tr,oldShape);
|
||||
tr.setOrigin(sphereOffset);
|
||||
compoundShape->addChildShape(tr,new btSphereShape(0.9));
|
||||
#endif
|
||||
}
|
||||
|
||||
for (i=0;i<gNumObjects;i++)
|
||||
|
||||
@@ -67,9 +67,11 @@ domMatrix_Array emptyMatrixArray;
|
||||
domNodeRef m_colladadomNodes[COLLADA_CONVERTER_MAX_NUM_OBJECTS];
|
||||
|
||||
|
||||
///This code is actually wrong: the order of transformations is lost, so we need to rewrite this!
|
||||
btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray,
|
||||
domRotate_Array& rotateArray,
|
||||
domTranslate_Array& translateArray
|
||||
domTranslate_Array& translateArray,
|
||||
float meterScaling
|
||||
)
|
||||
|
||||
{
|
||||
@@ -83,7 +85,7 @@ btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray,
|
||||
domMatrixRef matrixRef = matrixArray[i];
|
||||
domFloat4x4 fl16 = matrixRef->getValue();
|
||||
btVector3 origin(fl16.get(3),fl16.get(7),fl16.get(11));
|
||||
startTransform.setOrigin(origin);
|
||||
startTransform.setOrigin(origin*meterScaling);
|
||||
btMatrix3x3 basis(fl16.get(0),fl16.get(1),fl16.get(2),
|
||||
fl16.get(4),fl16.get(5),fl16.get(6),
|
||||
fl16.get(8),fl16.get(9),fl16.get(10));
|
||||
@@ -103,7 +105,8 @@ btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray,
|
||||
{
|
||||
domTranslateRef translateRef = translateArray[i];
|
||||
domFloat3 fl3 = translateRef->getValue();
|
||||
startTransform.getOrigin() += btVector3(fl3.get(0),fl3.get(1),fl3.get(2));
|
||||
btVector3 orgTrans(fl3.get(0),fl3.get(1),fl3.get(2));
|
||||
startTransform.getOrigin() += orgTrans*meterScaling;
|
||||
}
|
||||
return startTransform;
|
||||
}
|
||||
@@ -116,7 +119,8 @@ ColladaConverter::ColladaConverter()
|
||||
:m_collada(0),
|
||||
m_dom(0),
|
||||
m_filename(0),
|
||||
m_numObjects(0)
|
||||
m_numObjects(0),
|
||||
m_unitMeterScaling(1.f)
|
||||
{
|
||||
//Collada-m_dom
|
||||
m_collada = new DAE;
|
||||
@@ -179,6 +183,15 @@ bool ColladaConverter::convert()
|
||||
|
||||
//succesfully loaded file, now convert data
|
||||
|
||||
if (m_dom->getAsset() && m_dom->getAsset()->getUnit())
|
||||
{
|
||||
domAsset::domUnitRef unit = m_dom->getAsset()->getUnit();
|
||||
domFloat meter = unit->getMeter();
|
||||
printf("asset unit meter=%f\n",meter);
|
||||
m_unitMeterScaling = meter;
|
||||
|
||||
|
||||
}
|
||||
if ( m_dom->getAsset() && m_dom->getAsset()->getUp_axis() )
|
||||
{
|
||||
domAsset::domUp_axis * up = m_dom->getAsset()->getUp_axis();
|
||||
@@ -593,7 +606,8 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
|
||||
(
|
||||
emptyMatrixArray,
|
||||
attachRefBody->getRotate_array(),
|
||||
attachRefBody->getTranslate_array());
|
||||
attachRefBody->getTranslate_array(),
|
||||
m_unitMeterScaling);
|
||||
}
|
||||
|
||||
btTransform attachFrameOther;
|
||||
@@ -605,7 +619,8 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
|
||||
(
|
||||
emptyMatrixArray,
|
||||
attachBody1->getRotate_array(),
|
||||
attachBody1->getTranslate_array()
|
||||
attachBody1->getTranslate_array(),
|
||||
m_unitMeterScaling
|
||||
);
|
||||
}
|
||||
|
||||
@@ -718,7 +733,8 @@ void ColladaConverter::PreparePhysicsObject(struct btRigidBodyInput& input, bool
|
||||
startTransform = GetbtTransformFromCOLLADA_DOM(
|
||||
node->getMatrix_array(),
|
||||
node->getRotate_array(),
|
||||
node->getTranslate_array()
|
||||
node->getTranslate_array(),
|
||||
m_unitMeterScaling
|
||||
);
|
||||
|
||||
unsigned int i;
|
||||
@@ -994,7 +1010,7 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
{
|
||||
const domFloat4 planeEq = planeRef->getEquation()->getValue();
|
||||
btVector3 planeNormal(planeEq.get(0),planeEq.get(1),planeEq.get(2));
|
||||
btScalar planeConstant = planeEq.get(3);
|
||||
btScalar planeConstant = planeEq.get(3)*m_unitMeterScaling;
|
||||
rbOutput.m_colShape = new btStaticPlaneShape(planeNormal,planeConstant);
|
||||
}
|
||||
|
||||
@@ -1005,25 +1021,25 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
domBoxRef boxRef = shapeRef->getBox();
|
||||
domBox::domHalf_extentsRef domHalfExtentsRef = boxRef->getHalf_extents();
|
||||
domFloat3& halfExtents = domHalfExtentsRef->getValue();
|
||||
float x = halfExtents.get(0);
|
||||
float y = halfExtents.get(1);
|
||||
float z = halfExtents.get(2);
|
||||
float x = halfExtents.get(0)*m_unitMeterScaling;
|
||||
float y = halfExtents.get(1)*m_unitMeterScaling;
|
||||
float z = halfExtents.get(2)*m_unitMeterScaling;
|
||||
rbOutput.m_colShape = new btBoxShape(btVector3(x,y,z));
|
||||
}
|
||||
if (shapeRef->getSphere())
|
||||
{
|
||||
domSphereRef sphereRef = shapeRef->getSphere();
|
||||
domSphere::domRadiusRef radiusRef = sphereRef->getRadius();
|
||||
domFloat radius = radiusRef->getValue();
|
||||
domFloat radius = radiusRef->getValue()*m_unitMeterScaling;
|
||||
rbOutput.m_colShape = new btSphereShape(radius);
|
||||
}
|
||||
|
||||
if (shapeRef->getCylinder())
|
||||
{
|
||||
domCylinderRef cylinderRef = shapeRef->getCylinder();
|
||||
domFloat height = cylinderRef->getHeight()->getValue();
|
||||
domFloat height = cylinderRef->getHeight()->getValue()*m_unitMeterScaling;
|
||||
domFloat2 radius2 = cylinderRef->getRadius()->getValue();
|
||||
domFloat radius0 = radius2.get(0);
|
||||
domFloat radius0 = radius2.get(0)*m_unitMeterScaling;
|
||||
|
||||
//Cylinder around the local Y axis
|
||||
rbOutput.m_colShape = new btCylinderShape(btVector3(radius0,height,radius0));
|
||||
@@ -1117,7 +1133,7 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
domFloat fl1 = listFloats.get(index0+1);
|
||||
domFloat fl2 = listFloats.get(index0+2);
|
||||
k+=meshPart.m_triangleIndexStride;
|
||||
verts[i].setValue(fl0,fl1,fl2);
|
||||
verts[i].setValue(fl0*m_unitMeterScaling,fl1*m_unitMeterScaling,fl2*m_unitMeterScaling);
|
||||
}
|
||||
trimesh->addTriangle(verts[0],verts[1],verts[2]);
|
||||
}
|
||||
@@ -1143,7 +1159,8 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
} else
|
||||
{
|
||||
printf("static concave triangle <mesh> added\n");
|
||||
rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh);
|
||||
bool useQuantizedAabbCompression = false;
|
||||
rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh,useQuantizedAabbCompression);
|
||||
//rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh);
|
||||
//rbOutput.m_colShape = new btConvexTriangleMeshShape(trimesh);
|
||||
|
||||
@@ -1182,7 +1199,7 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
domFloat fl0 = listFloats.get(vertIndex);
|
||||
domFloat fl1 = listFloats.get(vertIndex+1);
|
||||
domFloat fl2 = listFloats.get(vertIndex+2);
|
||||
convexHull->addPoint(btPoint3(fl0,fl1,fl2));
|
||||
convexHull->addPoint(btPoint3(fl0,fl1,fl2) * m_unitMeterScaling);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1280,7 +1297,7 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
domFloat fl2 = listFloats.get(k+2);
|
||||
//printf("float %f %f %f\n",fl0,fl1,fl2);
|
||||
|
||||
convexHullShape->addPoint(btPoint3(fl0,fl1,fl2));
|
||||
convexHullShape->addPoint(btPoint3(fl0,fl1,fl2) * m_unitMeterScaling);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1328,7 +1345,7 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
domFloat fl2 = listFloats.get(k+2);
|
||||
//printf("float %f %f %f\n",fl0,fl1,fl2);
|
||||
|
||||
convexHullShape->addPoint(btPoint3(fl0,fl1,fl2));
|
||||
convexHullShape->addPoint(btPoint3(fl0,fl1,fl2)*m_unitMeterScaling);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1383,7 +1400,8 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
|
||||
localTransform = GetbtTransformFromCOLLADA_DOM(
|
||||
emptyMatrixArray,
|
||||
shapeRef->getRotate_array(),
|
||||
shapeRef->getTranslate_array()
|
||||
shapeRef->getTranslate_array(),
|
||||
m_unitMeterScaling
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ protected:
|
||||
class DAE* m_collada;
|
||||
class domCOLLADA* m_dom;
|
||||
const char* m_filename;
|
||||
float m_unitMeterScaling;
|
||||
|
||||
int m_numObjects;
|
||||
btRigidBody* m_rigidBodies[COLLADA_CONVERTER_MAX_NUM_OBJECTS];
|
||||
|
||||
@@ -149,7 +149,8 @@ void ConcaveDemo::initPhysics()
|
||||
indexStride,
|
||||
totalVerts,(btScalar*) &gVertices[0].x(),vertStride);
|
||||
|
||||
btCollisionShape* trimeshShape = new btBvhTriangleMeshShape(indexVertexArrays);
|
||||
bool useQuantizedAabbCompression = true;
|
||||
btCollisionShape* trimeshShape = new btBvhTriangleMeshShape(indexVertexArrays,useQuantizedAabbCompression);
|
||||
|
||||
|
||||
// btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50));
|
||||
@@ -159,6 +160,7 @@ void ConcaveDemo::initPhysics()
|
||||
btOverlappingPairCache* pairCache = new btAxisSweep3(worldMin,worldMax);
|
||||
btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver();
|
||||
m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver);
|
||||
m_dynamicsWorld->setDebugDrawer(&debugDrawer);
|
||||
|
||||
float mass = 0.f;
|
||||
btTransform startTransform;
|
||||
|
||||
@@ -185,7 +185,8 @@ const float TRIANGLE_SIZE=20.f;
|
||||
indexStride,
|
||||
totalVerts,(btScalar*) &gVertices[0].x(),vertStride);
|
||||
|
||||
groundShape = new btBvhTriangleMeshShape(indexVertexArrays);
|
||||
bool useQuantizedAabbCompression = true;
|
||||
groundShape = new btBvhTriangleMeshShape(indexVertexArrays,useQuantizedAabbCompression);
|
||||
|
||||
#endif //
|
||||
|
||||
|
||||
Reference in New Issue
Block a user