如何在Bullet Physics中控制玩家角色?

4
我不确定如何在Bullet中控制玩家角色。我阅读的方法是使用提供的btKinematicCharacterController。我还看到了使用演示中的btDynamicCharacterController的方法。然而,在手册中指出,运动学控制器存在一些问题。这仍然是首选路径吗?如果是,是否有任何教程或文档可以参考?我找到的只有来自演示代码的片段和与Ogre一起使用控制器的用法,而我不使用Ogre。
如果这不是应该采用的方法,那就指点一下正确的解决方案。我是Bullet的新手,想要一个简单明了的解决方案。目前我使用的是btKinematicCharacterController的乱搭乱凑的代码。
以下是我用来设置控制器的代码:
playerShape = new btCapsuleShape(0.25, 1);
ghostObject= new btPairCachingGhostObject();
ghostObject->setWorldTransform(btTransform(btQuaternion(0,0,0,1),btVector3(0,20,0)));
physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
ghostObject->setCollisionShape(playerShape);
ghostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
controller = new btKinematicCharacterController(ghostObject,playerShape,0.5);
physics.getWorld()->addCollisionObject(ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
physics.getWorld()->addAction(controller);

这是我用来获取控制器位置的代码:
trans = controller->getGhostObject()->getWorldTransform();
camPosition.z = trans.getOrigin().z();
camPosition.y = trans.getOrigin().y()+0.5;
camPosition.x = trans.getOrigin().x();

我控制它的方式是通过setWalkDirection()和jump()(如果canJump()为真)。

现在的问题是,角色有点抽搐,然后穿过了静态地面。显然这不是预期的结果。这是因为缺少刚体吗?如何集成它?

实际上,现在它只是像应该一样掉下来,但是然后慢慢地沉入地面。

我已经将这行代码移动到动态世界创建之后。

physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());

现在它是这样的:
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());

我也使用了从Blender导入的.bullet文件,如果这有关的话。
问题出在bullet文件上,已经修复了(碰撞盒没有起作用)。然而,我仍然经常遇到抖动、无法偶尔向上迈步、从高处瞬间跌落等问题。
1个回答

1
我的回答在这里告诉你我和提问者都使用了什么方法,并且效果很好。 避免使用Bullet发生地面碰撞 不幸的是,Bullet中的角色控制器实现非常“基础”。要获得良好的角色控制器,您需要投入更多的精力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接