2012-04-27 167 views
1

我一直在受到一个问题,关于在我使用Ogre3D和Bullet物理实现的游戏中定位字符的实现。使用子弹和Ogre3D平滑旋转

我拥有:角色向前移动的方向矢量,以及当前方向。

我需要什么:设置角色的方向以面对它正在移动的方向。

我的代码之类的,做我想做的一个片段:

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)大多数时候该代码运行我从子弹的btQuaternion上
assert(d != btScalar(0.0));

谁能帮断言错误?

谢谢!

+0

我想你可以从两个向量构造一个btQuaternion,它会给出一个四元数从第一个旋转到第二个。如果你使用角色的基本方向和你想要的方向,你应该得到你需要的四元数。抖动可能发生,因为你有一个四元数不是唯一的旋转(比如180°和0°)。 – LiMuBei 2012-05-14 08:34:58

回答

2

我认为你不应该使用像'acos'这样的函数来处理这样的事情,因为它可能会导致边界情况中的一些不一致,如上面提到的180 vs 0旋转。您也可以获得这种数据的高数值错误。

第二件事是 - 一般情况下 - 你应该避免在物理引擎中设置明确的位置和旋转角度,而是应用力和扭矩来使你的身体随意移动。你目前的方法现在可能完美,但是当你添加另一个对象并强制你的角色占据相同的空间时,你的模拟将会爆炸。在这个阶段很难修复它,所以最好从开始就这样做:)。

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