您的问题来电者“内部边缘碰撞”。几个小时前我刚刚找到了解决方案。
如果你的世界使用 btHeightfieldTerrainShape,那么你必须使用 btBvhTriangleMeshShape 来解决这个问题。
这就是答案。
添加此回调:
static bool CustomMaterialCombinerCallback(btManifoldPoint& cp,const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1)
{
btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1);
return true;
}
extern ContactAddedCallback gContactAddedCallback;
然后创建btBvhTriangleMeshShape 并添加此代码,其中pGround 是您的btBvhTriangleMeshShape:
// Enable custom material callback
pGround->setCollisionFlags(pGround->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
btTriangleInfoMap* triangleInfoMap = new btTriangleInfoMap();
btGenerateInternalEdgeInfo(pGroundShape, triangleInfoMap);
或者你可以打开Bullet中的InternalEdgeDemo的例子,看看具体如何实现。