我一直在使用Ogre3D和Bullet物理实现游戏中定向角色的实现问题。
我拥有的内容:角色正在移动的方向向量及其当前方向。
我需要什么:设置角色的方向以面对它移动的方式。
我有一段代码可以满足我的需求:
btTransform src = body->getCenterOfMassTransform();
btVector3 up = BtOgre::Convert::toBullet(Ogre::Vector3::UNIT_X);
btVector3 normDirection = mDirection.normalized();
btScalar angle = acos(up.dot(normDirection));
btVector3 axis = up.cross(normDirection);
src.setRotation(btQuaternion(axis, angle));
body->setCenterOfMassTransform(src);
“身体”是我试图定位的刚体。
这段代码有几个问题:
1)当改变方向时,它倾向于“抖动”,即它快速朝向一个方向,然后相反一秒左右,然后将其自身校正到它应该处于的方向。
2)大多数时候代码运行我从Bullet的btQuaternion上得到一个断言错误
assert(d != btScalar(0.0));
有人可以帮忙吗?
谢谢!
答案 0 :(得分:2)
我认为你不应该使用像'acos'这样的函数来处理这类事情,因为它可能会导致边界情况出现一些不一致,如上面提到的180 vs 0旋转。您还可以获得此类数据的高数值误差。
第二件事是 - 一般来说 - 你应该避免在物理引擎中设置明确的位置和旋转,而是应用力和扭矩来让你的身体随意移动。您当前的方法现在可以完美地工作,但是当您添加另一个对象并迫使角色占据相同的空间时,您的模拟将会爆炸。在这个阶段,很难修复它,所以最好从开始做到:)。
我知道找到正确的力/扭矩可能会很棘手,但这是使模拟保持一致的最佳方法。