如何在子弹物理中控制玩家角色
How do you control a player character in Bullet Physics?
我不确定你应该如何控制Bullet中的玩家角色。我读到的方法是使用提供的btKinematicCharacterController。我还从演示中看到了使用btDynamicCharacterController的方法。然而,在手册中指出,运动学控制器有几个悬而未决的问题。这仍然是首选路径吗?如果是的话,有没有相关的教程或文档?我发现的只是演示中的代码片段,以及Ogre中控制器的使用,我没有使用。
如果这不是应该走的路,那么有人会给我指出正确的解决方案。我是子弹头的新手,想要一个简单明了的解决方案。我目前拥有的是一个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());
如果相关的话,我也在使用从blender导入的.bullet文件。
问题出在项目符号文件上,该文件已被修复(冲突框不起作用)。然而,我仍然会感到紧张,偶尔无法站起来,瞬间从高处往下走,以及其他问题。
我在这里对这个问题的回答告诉你什么对我很有效,显然对提问者也很有效。
避免与子弹发生地面碰撞
不幸的是,子弹头中的角色控制器实现非常"基本"。为了获得好的角色控制器,你需要投入这么多。
相关文章:
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 玩家加速穿越世界(C++)
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- C++:如何根据地形高度更新玩家身高?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 预测玩家输赢,博弈论问题
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- 如何控制玩家的绘画
- 如何在子弹物理中控制玩家角色