added btMatrix3x3::getEulerYPR, which is consistent with updated setEulerYPR.
removed unused getEuler. Thanks to Georg Wuensch, see http://code.google.com/p/bullet/issues/detail?id=104
This commit is contained in:
@@ -155,21 +155,7 @@ class btMatrix3x3 {
|
|||||||
*/
|
*/
|
||||||
void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
|
void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
|
||||||
{
|
{
|
||||||
|
setEulerZYX(roll, pitch, yaw);
|
||||||
btScalar cy(btCos(yaw));
|
|
||||||
btScalar sy(btSin(yaw));
|
|
||||||
btScalar cp(btCos(pitch));
|
|
||||||
btScalar sp(btSin(pitch));
|
|
||||||
btScalar cr(btCos(roll));
|
|
||||||
btScalar sr(btSin(roll));
|
|
||||||
btScalar cc = cy * cr;
|
|
||||||
btScalar cs = cy * sr;
|
|
||||||
btScalar sc = sy * cr;
|
|
||||||
btScalar ss = sy * sr;
|
|
||||||
setValue(cc - sp * ss, -cs - sp * sc, -sy * cp,
|
|
||||||
cp * sr, cp * cr, -sp,
|
|
||||||
sc + sp * cs, -ss + sp * cc, cy * cp);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Set the matrix from euler angles YPR around ZYX axes
|
/** @brief Set the matrix from euler angles YPR around ZYX axes
|
||||||
@@ -260,35 +246,33 @@ class btMatrix3x3 {
|
|||||||
q.setValue(temp[0],temp[1],temp[2],temp[3]);
|
q.setValue(temp[0],temp[1],temp[2],temp[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**@brief Get the matrix represented as euler angles around YXZ
|
/**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR
|
||||||
* @param yaw Yaw around Y axis
|
* @param yaw Yaw around Y axis
|
||||||
* @param pitch Pitch around X axis
|
* @param pitch Pitch around X axis
|
||||||
* @param roll around Z axis */
|
* @param roll around Z axis */
|
||||||
void getEuler(btScalar& yaw, btScalar& pitch, btScalar& roll) const
|
void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const
|
||||||
{
|
{
|
||||||
|
|
||||||
if (btScalar(m_el[1].z()) < btScalar(1))
|
// first use the normal calculus
|
||||||
|
yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
|
||||||
|
pitch = btScalar(btAsin(-m_el[2].x()));
|
||||||
|
roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
|
||||||
|
|
||||||
|
// on pitch = +/-HalfPI
|
||||||
|
if (btFabs(pitch)==SIMD_HALF_PI)
|
||||||
{
|
{
|
||||||
if (btScalar(m_el[1].z()) > -btScalar(1))
|
if (yaw>0)
|
||||||
{
|
yaw-=SIMD_PI;
|
||||||
yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
|
else
|
||||||
pitch = btScalar(btAsin(-m_el[1].y()));
|
yaw+=SIMD_PI;
|
||||||
roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
|
|
||||||
}
|
if (roll>0)
|
||||||
else
|
roll-=SIMD_PI;
|
||||||
{
|
else
|
||||||
yaw = btScalar(-btAtan2(-m_el[0].y(), m_el[0].z()));
|
roll+=SIMD_PI;
|
||||||
pitch = SIMD_HALF_PI;
|
|
||||||
roll = btScalar(0.0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
};
|
||||||
{
|
|
||||||
yaw = btScalar(btAtan2(-m_el[0].y(), m_el[0].z()));
|
|
||||||
pitch = -SIMD_HALF_PI;
|
|
||||||
roll = btScalar(0.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**@brief Create a scaled copy of the matrix
|
/**@brief Create a scaled copy of the matrix
|
||||||
* @param s Scaling vector The elements of the vector will scale each column */
|
* @param s Scaling vector The elements of the vector will scale each column */
|
||||||
|
|||||||
Reference in New Issue
Block a user