<div>Hello,</div>
<div> </div>
<div>I noticed that the cross terms in osg's quaternion class binary multiplication differ from the usual mathematical definition of quaternion multiplication.  The subtractions are opposite what they should be.  </div>

<div> </div>
<div>osg's implementation is</div>
<div><font size="2">
<p>/// Binary multiply </p>
<p>inline const Quat operator*(const Quat& rhs) const</p>
<p>{</p>
<p>return Quat( rhs._v[3]*_v[0] + rhs._v[0]*_v[3] + rhs._v[1]*_v[2] - rhs._v[2]*_v[1],</p>
<p>rhs._v[3]*_v[1] - rhs._v[0]*_v[2] + rhs._v[1]*_v[3] + rhs._v[2]*_v[0],</p>
<p>rhs._v[3]*_v[2] + rhs._v[0]*_v[1] - rhs._v[1]*_v[0] + rhs._v[2]*_v[3],</p>
<p>rhs._v[3]*_v[3] - rhs._v[0]*_v[0] - rhs._v[1]*_v[1] - rhs._v[2]*_v[2] );</p>
<p>}</p>
<p>I believe that it should be:</p><font size="2">
<p>/// Binary multiply </p>
<p>inline const Quat operator*(const Quat& rhs) const</p>
<p>{</p>
<p>return Quat( </p>
<p>rhs._v[3]*_v[0] + rhs._v[0]*_v[3] - rhs._v[1]*_v[2] + rhs._v[2]*_v[1],</p>
<p>rhs._v[3]*_v[1] + rhs._v[0]*_v[2] + rhs._v[1]*_v[3] - rhs._v[2]*_v[0],</p>
<p>rhs._v[3]*_v[2] - rhs._v[0]*_v[1] + rhs._v[1]*_v[0] + rhs._v[2]*_v[3],</p>
<p>rhs._v[3]*_v[3] - rhs._v[0]*_v[0] - rhs._v[1]*_v[1] - rhs._v[2]*_v[2] );</p>
<p>}</p></font></font></div>
<div> </div>
<div>The effect of this transposition is to force a pre-multiplication ordering for the operation.  I am wondering whether this is intentional or a mistake and if it is intentional, why was it chosen to work this way.  I searched the osg mailing list archives, and I found a similar question posted in 2004, but I haven't been able to find a follow up to that message.
</div>
<div> </div>
<div>This causes problems in my application because I may receive orientation data from a source that uses a different quaternion library using the post-multiplication ordering, which is the standard way in the mathematical community.
</div>
<div> </div>
<div>Thanks,</div>
<div>Will</div>