如何在Bullet Physics中旋转对象

时间:2014-12-08 17:17:40

标签: opengl graphics rotation bullet

这里我在Bullet中对象旋转有问题。 我想要实现的是同时围绕全局x,y,z轴旋转对象。 (此处全局表示轴x,y,z在旋转期间不会更改) 我有以下代码

btQuaternion m_lastRot;
btTransform tranf =  _obj[idx]->mp_btRidObj->getCenterOfMassTransform();
tranf.getBasis().getRotation(m_lastRot);
btQuaternion qx(btVector3(1,0,0),angX);
btQuaternion qy(btVector3(0,1,0),angY);
btQuaternion qz(btVector3(0,0,1),angZ);
tranf.setRotation(qz * qy * qx * m_lastRot);
_obj[idx]->mp_btRidObj->setCenterOfMassTransform(tranf);

但它没有像我预期的那样奏效。 顺便说一下,每次围绕x,y,z轴之一旋转对象的代码都可以正常工作。

btQuaternion m_lastRot;
btTransform tranf =  _obj[idx]->mp_btRidObj->getCenterOfMassTransform();
tranf.getBasis().getRotation(_obj[idx]->m_lastRot);
btQuaternion qx(btVector3(1,0,0),angX);
btQuaternion qy(btVector3(0,1,0),angY);
btQuaternion qz(btVector3(0,0,1),angZ);
if(x)
tranf.setRotation(qx * m_lastRot);
else if(y)
tranf.setRotation(qy * m_lastRot);
else if(z)
tranf.setRotation(qz * m_lastRot);

_obj[idx]->mp_btRidObj->setCenterOfMassTransform(tranf);

有没有人可以告诉我如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我这样做:

//this is my bullet object currently reading data from:
bulletobject->getMotionState()->getWorldTransform(trans);
btQuaternion rot = trans.getRotation();
myquat.w = rot.w();
myquat.x = rot.x();
myquat.y = rot.z();
myquat.z = rot.y();
//I then apply the quat to my object that I want to move in my graphics application.

你必须记得得到“' w'如果你这样做的话,如果不是轮换则会出错。

答案 1 :(得分:0)

在Jbullet中,我相信在Bullet RigidBody中实现了一个名为setOrientation(Quat4f r)的方法,可以满足您的需要。我认为它也在标准的子弹头库中。