|
From: <axl...@us...> - 2009-06-04 01:22:27
|
Revision: 304
http://hgengine.svn.sourceforge.net/hgengine/?rev=304&view=rev
Author: axlecrusher
Date: 2009-06-04 00:29:27 +0000 (Thu, 04 Jun 2009)
Log Message:
-----------
we MUST normalize before multiplying
Modified Paths:
--------------
Mercury2/src/MQuaternion.cpp
Modified: Mercury2/src/MQuaternion.cpp
===================================================================
--- Mercury2/src/MQuaternion.cpp 2009-06-04 00:11:52 UTC (rev 303)
+++ Mercury2/src/MQuaternion.cpp 2009-06-04 00:29:27 UTC (rev 304)
@@ -180,11 +180,14 @@
MQuaternion MQuaternion::operator * (const MQuaternion &rhs) const
{
+ MQuaternion q1( this->normalize() );
+ MQuaternion q2( rhs.normalize() );
+
MQuaternion result;
- result.m_wxyz[0] = (m_wxyz[0]*rhs.m_wxyz[0])-(m_wxyz[1]*rhs.m_wxyz[1])-(m_wxyz[2]*rhs.m_wxyz[2])-(m_wxyz[3]*rhs.m_wxyz[3]);
- result.m_wxyz[1] = (m_wxyz[0]*rhs.m_wxyz[1])+(m_wxyz[1]*rhs.m_wxyz[0])+(m_wxyz[2]*rhs.m_wxyz[3])-(m_wxyz[3]*rhs.m_wxyz[2]);
- result.m_wxyz[2] = (m_wxyz[0]*rhs.m_wxyz[2])-(m_wxyz[1]*rhs.m_wxyz[3])+(m_wxyz[2]*rhs.m_wxyz[0])+(m_wxyz[3]*rhs.m_wxyz[1]);
- result.m_wxyz[3] = (m_wxyz[0]*rhs.m_wxyz[3])+(m_wxyz[1]*rhs.m_wxyz[2])-(m_wxyz[2]*rhs.m_wxyz[1])+(m_wxyz[3]*rhs.m_wxyz[0]);
+ result.W() = (q1.W()*q2.W())-(q1.X()*q2.X())-(q1.Y()*q2.Y())-(q1.Z()*q2.Z());
+ result.X() = (q1.W()*q2.X())+(q1.X()*q2.W())+(q1.Y()*q2.Z())-(q1.Z()*q2.Y());
+ result.Y() = (q1.W()*q2.Y())-(q1.X()*q2.Z())+(q1.Y()*q2.W())+(q1.Z()*q2.X());
+ result.Z() = (q1.W()*q2.Z())+(q1.X()*q2.Y())-(q1.Y()*q2.X())+(q1.Z()*q2.W());
return result;
}
@@ -208,10 +211,7 @@
}
MQuaternion& MQuaternion::operator *= (const MQuaternion &rhs) {
- m_wxyz[0] = (m_wxyz[0]*rhs.m_wxyz[0])-(m_wxyz[1]*rhs.m_wxyz[1])-(m_wxyz[2]*rhs.m_wxyz[2])-(m_wxyz[3]*rhs.m_wxyz[3]);
- m_wxyz[1] = (m_wxyz[0]*rhs.m_wxyz[1])+(m_wxyz[1]*rhs.m_wxyz[0])+(m_wxyz[2]*rhs.m_wxyz[3])-(m_wxyz[3]*rhs.m_wxyz[2]);
- m_wxyz[2] = (m_wxyz[0]*rhs.m_wxyz[2])-(m_wxyz[1]*rhs.m_wxyz[3])+(m_wxyz[2]*rhs.m_wxyz[0])+(m_wxyz[3]*rhs.m_wxyz[1]);
- m_wxyz[3] = (m_wxyz[0]*rhs.m_wxyz[3])+(m_wxyz[1]*rhs.m_wxyz[2])-(m_wxyz[2]*rhs.m_wxyz[1])+(m_wxyz[3]*rhs.m_wxyz[0]);
+ *this = *this * rhs;
return (*this);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|