2011-01-18 49 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; 

我想我應該比其他單元X矢量相乘,所以我嘗試了所有組合。在這種情況下(即Smith實體),我使用-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());