1

在我使用 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);

“body”是我要定位的刚体。

然而,这个片段有几个问题:

1)当改变方向时,它往往会“抖动”,即它迅速面向一个方向,然后在将自己校正到它应该处于的方向之前大约一秒钟左右。

2) 大多数时候,代码运行时,我从 Bullet 的 btQuaternion 得到一个断言错误
assert(d != btScalar(0.0));

任何人都可以帮忙吗?

谢谢!

4

1 回答 1

2

我认为你不应该对这些事情使用像'acos'这样的函数,因为它可能会导致边界情况的一些不一致,就像上面提到的 180 对 0 旋转一样。您还可以获得此类数据的高数值错误。

第二件事是——一般来说——你应该避免在物理引擎中设置明确的位置和旋转,而是施加力和扭矩来让你的身体随心所欲地移动。您当前的方法现在可能工作得很好,但是当您添加另一个对象并强制您的角色占据相同的空间时,您的模拟将会爆炸。在这个阶段很难修复它,所以最好从一开始就做好:)。

我知道找到正确的力/扭矩可能很棘手,但这是使您的模拟保持一致的最佳方法。

于 2012-07-18T11:34:52.070 回答