Added signOrZero template method, and to Matrix_implementation.cpp usage of this
method in the get(Quat&) code.
This commit is contained in:
@@ -314,8 +314,21 @@ void testQuat()
|
||||
testQuatRotate(osg::Vec3d(0.0,0.0,-1.0),osg::Vec3d(0.0,0.0,1.0));
|
||||
|
||||
testGetQuatFromMatrix();
|
||||
|
||||
|
||||
osg::Matrix matrix(0.5, 0.0, 0.0, 0.0,
|
||||
0.0, 0.5, 0.0, 0.0,
|
||||
0.0, 0.0, 0.5, 0.0,
|
||||
1.0, 1.0, 1.0, 1.0);
|
||||
|
||||
osg::Quat quat;
|
||||
matrix.get(quat);
|
||||
|
||||
osg::notify(osg::NOTICE)<<"Matrix = "<<matrix<<" rotation="<<quat<<std::endl;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char** argv )
|
||||
{
|
||||
osg::ArgumentParser arguments(&argc,argv);
|
||||
|
||||
@@ -167,6 +167,9 @@ inline T clampBetween(T v,T minimum, T maximum)
|
||||
template<typename T>
|
||||
inline T sign(T v) { return v<(T)0?(T)-1:(T)1; }
|
||||
|
||||
template<typename T>
|
||||
inline T signOrZero(T v) { return v<(T)0 ? (T)-1 : ( v>(T)0 ? (T)1 : 0 ); }
|
||||
|
||||
template<typename T>
|
||||
inline T square(T v) { return v*v; }
|
||||
|
||||
|
||||
@@ -138,9 +138,9 @@ Quat Matrix_implementation::getRotate() const
|
||||
QY = 0.5 * sqrt( osg::maximum( 0.0, 1.0 - _mat[0][0] + _mat[1][1] - _mat[2][2] ) );
|
||||
QZ = 0.5 * sqrt( osg::maximum( 0.0, 1.0 - _mat[0][0] - _mat[1][1] + _mat[2][2] ) );
|
||||
|
||||
QX = QX * osg::sign( _mat[1][2] - _mat[2][1]) ;
|
||||
QY = QY * osg::sign( _mat[2][0] - _mat[0][2]) ;
|
||||
QZ = QZ * osg::sign( _mat[0][1] - _mat[1][0]) ;
|
||||
QX = QX * osg::signOrZero( _mat[1][2] - _mat[2][1]) ;
|
||||
QY = QY * osg::signOrZero( _mat[2][0] - _mat[0][2]) ;
|
||||
QZ = QZ * osg::signOrZero( _mat[0][1] - _mat[1][0]) ;
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user