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:
erwin.coumans
2008-10-28 19:26:49 +00:00
parent 28e580c203
commit f5e16847df

View File

@@ -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 */