hi guys. I'm a newbie and learning physx 3.2.2.
Now i meet a problem that I use PxTriangleMesh function to create a simple cube. We have also used PxSphereGeometry function and created a sphere. We create also a plane. The sphere can successfully drops down, touch the plane and stop, but the cube which created by triangle mesh directly fall down and over the plane. There may be something wrong with the collision detection part but I don't know why and how.
Here is the code that create the cube with triangle mesh:
// create triangle mesh
PxTransform transform(PxVec3(0.0f, 15.0f, 0.0f), PxQuat::createIdentity());
PxRigidDynamic *actor = gPhysicsSDK->createRigidDynamic(transform);
//actor->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC,true);
if (!actor)
cerr<<"create actor failed!"<<endl;
PxTriangleMeshDesc meshDesc;
PxVec3 data[8]={
PxVec3(-1.0,-1.0,-1.0),
PxVec3(1.0,-1.0,-1.0),
PxVec3(-1.0,1.0,-1.0),
PxVec3(1.0,1.0,-1.0),
PxVec3(-1.0,-1.0,1.0),
PxVec3(1.0,-1.0,1.0),
PxVec3(-1.0,1.0,1.0),
PxVec3(1.0,1.0,1.0)
};
PxU32 indices[12*3] = {
1,2,3,
0,2,1,
5,7,6,
4,5,6,
5,4,1,
1,4,0,
1,3,5,
3,7,5,
3,2,7,
2,6,7,
2,0,6,
4,6,0
};
meshDesc.points.count = 8;
meshDesc.points.stride = sizeof(PxVec3);
meshDesc.points.data = data;
meshDesc.triangles.count = 12;
meshDesc.triangles.stride = 3 * sizeof(PxU32);
meshDesc.triangles.data = indices;
meshDesc.flags = PxMeshFlags(0);
PxToolkit::MemoryOutputStream writeBuffer;
PxCookingParams cookingP;
cookingP.suppressTriangleMeshRemapTable = true;
cookingP.buildTriangleAdjacencies = true;
cooking->setParams(cookingP);
bool status = cooking->cookTriangleMesh(meshDesc, writeBuffer);
if(!status)
cerr<<"fail cooking";
PxToolkit::MemoryInputData readBuffer(writeBuffer.getData(), writeBuffer.getSize());
PxTriangleMesh* triangleMesh = gPhysicsSDK->createTriangleMesh(readBuffer);
PxTriangleMeshGeometry geom(triangleMesh);
PxShape *aTriMeshShape = actor->createShape(geom, *mMaterial,PxTransform(PxVec3(0.0f, 0.0f, 0.0f), PxQuat::createIdentity()));
actor->setAngularDamping(0.0);
actor->setLinearVelocity(PxVec3(0,-1.0,0));
actor->setLinearVelocity(PxVec3(0,-1.0f,0), true);
actor->userData = (void*) 1;
actor->setRigidDynamicFlag(PxRigidDynamicFlag::eUSE_KINEMATIC_TARGET_FOR_SCENE_QUERIES,true);
actor->setActorFlag(PxActorFlag::eVISUALIZATION,true);
gScene->addActor(*actor);