作业帮 > 综合 > 作业

求旋转矩阵转为四元数的程序.

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/01 02:47:23
求旋转矩阵转为四元数的程序.
Quat Mat3ToQuat( float** mat )
{
\x05Quat\x05\x05q;
\x05float\x05\x05trace;
\x05float\x05\x05s;
\x05float\x05\x05t;
\x05int \x05i;
\x05int\x05\x05\x05j;
\x05int\x05\x05\x05k;
\x05static int \x05next[ 3 ] = { 1,2,0 };
\x05trace = mat[ 0 ][ 0 ] + mat[ 1 ][ 1 ] + mat[ 2 ][ 2 ];
\x05if ( trace > 0.0f )
\x05{
\x05\x05t = trace + 1.0f;
\x05\x05s = 0.5f / sqrtf(t);
\x05\x05q[3] = s * t;
\x05\x05q[0] = ( mat[ 2 ][ 1 ] - mat[ 1 ][ 2 ] ) * s;
\x05\x05q[1] = ( mat[ 0 ][ 2 ] - mat[ 2 ][ 0 ] ) * s;
\x05\x05q[2] = ( mat[ 1 ][ 0 ] - mat[ 0 ][ 1 ] ) * s;
\x05} else {
\x05\x05i = 0;
\x05\x05if ( mat[ 1 ][ 1 ] > mat[ 0 ][ 0 ] ) {
\x05\x05\x05i = 1;
\x05\x05}
\x05\x05if ( mat[ 2 ][ 2 ] > mat[ i ][ i ] ) {
\x05\x05\x05i = 2;
\x05\x05}
\x05\x05j = next[ i ];
\x05\x05k = next[ j ];
\x05\x05t = ( mat[ i ][ i ] - ( mat[ j ][ j ] + mat[ k ][ k ] ) ) + 1.0f;
\x05\x05s = 0.5f / sqrtf(t);
\x05\x05q[i] = s * t;
\x05\x05q[3] = ( mat[ k ][ j ] - mat[ j ][ k ] ) * s;
\x05\x05q[j] = ( mat[ j ][ i ] + mat[ i ][ j ] ) * s;
\x05\x05q[k] = ( mat[ k ][ i ] + mat[ i ][ k ] ) * s;
\x05}
\x05return q;
}
上述代码来至与ID4号引擎.