避免与Bullet发生地面碰撞

时间:2014-09-01 12:15:33

标签: c++ game-engine bulletphysics

我正在尝试使用Bullet物理引擎来创建3D世界。

我的角色身上有一个胶囊形状,我的地面是由一些静态集团组成的,这是一个用来说明我的话语的模式: enter image description here

当我的角色从一个区块跑到另一个区块时出现问题:子弹检测到碰撞,我的角色开始在y轴上跳跃一点。

我该如何避免这个问题?

2 个答案:

答案 0 :(得分:15)

我为克服这个问题所做的工作如下:

我没有将胶囊滑到地面上,而是在弹簧顶部安装了一个动态的胶囊。 我将弹簧实施为几个来自胶囊底部的射线模型。 弹簧的长度大约是半米或更短,它将拉动并推动胶囊进出地面。 抓握/拉动非常重要,因此角色不会意外跳跃。 弹簧刚度控制着你有多大的摆动。

这具有以下效果

  • 由于胶囊漂浮
  • ,因此无法与地板上的几何体边缘发生意外碰撞
  • 隐含地执行楼梯和斜坡。春天只是" step"走上楼梯台阶,推开角色舱。
  • 实施跳跃只是释放弹簧在地面上的抓地力并让身体产生冲动。
  • 自动显示跳跃或跌倒后的着陆角色"膝盖弯曲"如你所料
  • 一般的垂直运动的愉快平滑。喜欢在电梯平台等。
  • 由于抓地力拉到地面,即使在下坡行驶时,角色也不会开始飞行"飞行"正如你在某些游戏中遇到的那样(我觉得这很烦人)。
  • 躲避角色=减少弹簧和/或胶囊的长度。
  • 滑下坡?您可以通过检查弹簧撞击的射线投射的地板区域的角度来完全控制它。

我不得不玩弹簧的刚度,弹簧的长度,握把的长度等等,但最后我很高兴这很简单但很有效。

答案 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并在pGroundbtBvhTriangleMeshShape的地方添加此代码:

// Enable custom material callback
pGround->setCollisionFlags(pGround->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);

btTriangleInfoMap* triangleInfoMap = new btTriangleInfoMap();
btGenerateInternalEdgeInfo(pGroundShape, triangleInfoMap);

或者您可以在InternalEdgeDemo中打开Bullet示例,了解如何详细实施。