2014-12-08 1 views
1

Здесь у меня есть проблема с вращением объекта в Bullet. То, что я хочу реализовать, - это вращать объект вокруг глобальной оси x, y, z в одно и то же время. (здесь глобальные средства оси х, у, г, не будет изменен во время вращения) У меня есть код нижеКак повернуть объект в Bullet Physics

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); 

Есть ли кто-нибудь, кто может мне сказать, как решить эту проблему?

+0

http://www.stackoverflow.com/questions/8196634/how-to-apply-rotation-to-a-body-in-bullet-physics-engine –

ответ

0

В Jbullet Я верю, что в Bullet RigidBody реализован метод setOrientation (Quat4f r), который делает то, что вы хотите. Я предполагаю, что это также в стандартной версии Bullet lib.

+0

Спасибо за ваш ответ. Я попытался найти функцию named setOrientation, но я не нашел его, по крайней мере, в классе rigidbody. Вместо этого, я нашел альтернативный способ решить проблему. Спасибо вам все равно. –

+0

Вперед и добавьте свое решение в качестве андерсера на вопрос для тех, кто на этот раз пытается это сделать. Извините, я не очень помог и удачи в вашем проекте. –

0

Я делаю это так:

//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» также, если вы делаете это таким образом, если не вращение будет неправильно.

+0

Хотя я не пробовал ваш метод, но у меня есть вопрос, что кажется, что ваш «myquat» находится только из кватерниона объекта, изменили ли вы значение «myquat» перед тем, как применить его к вашему объекту? –