2011-01-18 5 views
1

У меня есть персонаж с телом и головой. Голова соединена с телом как кость, и я уже знаю название кости. Теперь я хочу получить направление головы? Это возможно? Я попробовал это, но это не похоже на работу:Получение направления объектов в OGRE

Entity *smith = m_sceneManager->getEntity("Smith"); 
Bone *head = smith->getSkeleton()->getBone("Bip01 Head"); 
Vector3 direction = head->_getDerivedOrientation() * Vector3::UNIT_X; 
std::cout << StringConverter::toString(direction) << std::endl; 

Я думал, что я должен умножить на другой, чем единичный вектор х, так что я попробовал все комбинации. В этом случае (т. Е. Объект Смита) я получил правильный ответ, используя -Vector3::UNIT_X, поэтому я подумал, что это правильное решение. Я пробовал с другими объектами, но мне не удалось получить правильный ответ.

Любая идея?

ответ

4

Умножив кватернион отрицательными Z должны правильно вернуть направление в качестве вектора:

Vector3 direction = head->_getDerivedOrientation() * Vector3::NEGATIVE_UNIT_Z; 

См this post on the Ogre forums.

2
// get orientation as a quaternion 
const Ogre::Quaternion quaternion = head->_getDerivedOrientation(); 

// convert orientation to a matrix 
Ogre::Matrix3 matrix3; 
quaternion.ToRotationMatrix(matrix3); 

/// get euler angles from the matrix 
Radian x; 
Radian y; 
Radian z; 
matrix3.ToEulerAnglesXYZ(x, y, z); 

// place euler angles into a vector 
Ogre::Vector3 direction(x.valueRadians(), y.valueRadians(), z.valueRadians()); 

Я подозреваю, что следующее будет работать.

// get orientation as a quaternion 
const Ogre::Quaternion q = head->_getDerivedOrientation(); 

// use pitch, yaw, and roll as values for direction vector 
const Ogre::Vector3 direction(q.getPitch(), q.getYaw(), q.getRoll());