我不知道你应该如何控制子弹中的玩家角色。我读到的方法是使用提供的 btKinematicCharacterController。我还从演示中看到了使用 btDynamicCharacterController 的方法。然而,手册中指出运动控制器有几个突出的问题。这仍然是首选路径吗?如果是这样,有这方面的教程或文档吗?我发现的只是演示中的代码片段,以及 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()为true)。
现在的问题是,角色有点兴奋,然后从静态地板上掉下来。显然这不是有意的。这是因为缺乏刚体吗?如何整合它?
事实上,现在它只是按其应有的方式掉落,但随后慢慢地沉入地板。
我已将这条线移至动态世界创建后的位置
physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
现在是这样的:
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
我还使用从搅拌机导入的 .bullet 文件(如果相关的话)。
问题出在子弹文件上,该文件现已修复(碰撞盒不起作用)。但还是会出现心慌、时不时爬不上去、从高处瞬间跳下来等问题。