Maths - Conversion Matrix to Quaternion (original) (raw)

Paul sent me the following issue with the use of copysign in Christians alternative method which is described on this page. Since I don't have much expertise with C++ code and haven't used copysign myself I will pass on Pauls comments:

The article mentions an alternative method using _copysign(x,y) but a common behavior of this function is to return (+1) when y=0 given the following matrix

1 0 0
0 1 0
0 0 -1

this alternate method produces different results

Q.x = sqrt( max( 0, 1 + m00 - m11 - m22 ) ) / 2;
Q.x = _copysign( Q.x, m21 - m12 )

producing Q.x = 0.7071068 whereas the original algorithm:

qx = (m21 - m12) / ( 4 *qw )

here it is clear that when (m21 - m12) equals (0) then (qx) will be zero if you use a version of copysign that returns +1,0,-1 then it might work.

This site may have errors. Don't use for critical systems.

Copyright (c) 1998-2023 Martin John Baker - All rights reserved - privacy policy.