我正在尝试使用Bullet物理引擎来创建3D世界。
我的角色身上有一个胶囊形状,我的地面是由一些静态集团组成的,这是一个用来说明我的话语的模式:
当我的角色从一个区块跑到另一个区块时出现问题:子弹检测到碰撞,我的角色开始在y轴上跳跃一点。
我该如何避免这个问题?
答案 0 :(得分:15)
我为克服这个问题所做的工作如下:
我没有将胶囊滑到地面上,而是在弹簧顶部安装了一个动态的胶囊。 我将弹簧实施为几个来自胶囊底部的射线模型。 弹簧的长度大约是半米或更短,它将拉动并推动胶囊进出地面。 抓握/拉动非常重要,因此角色不会意外跳跃。 弹簧刚度控制着你有多大的摆动。
这具有以下效果
我不得不玩弹簧的刚度,弹簧的长度,握把的长度等等,但最后我很高兴这很简单但很有效。
答案 1 :(得分:0)
您的问题来电者"内部边缘碰撞"。我刚刚在一小时前找到解决方案。 如果你正在为你的世界使用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);
或者您可以在InternalEdgeDemo
中打开Bullet
示例,了解如何详细实施。