四元数与同构矩阵之间可以互相转换.
一般四元数的计算矩阵运算如下:
[ w2+x2-y2-z2 , 2xy-2wz , 2xz+2wy ]
[ 2xy+2wz , w2-x2-y2-z2 , 2yz-2wx ]
[ 2xz-2wy , 2yz+2wx , w2-x2-y2-z2 ]
但是对于范化的四元数, 可以简化上述的矩阵变换:
[ 1-2y2-2z2 , 2xy-2wz , 2xz+2wy ]
[ 2xy+2wz , 1-2x2-2z2 , 2yz-2wx ]
[ 2xz-2wy , 2yz+2wx , 1-2x2-2y2 ]
以下上将四元数转换到矩阵的代码:
void QuatToMatrix( Quat* quat, float m[4][4] )
{
float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
//计算相关的系数
x2 = quat->x + quat->x;
y2 = quat->y + quat->y;
z2 = quat->z + quat->z;
xx = quat->x * x2;
xy = quat->x * y2;
xz = quat->x * z2;
yy = quat->y * y2;
yz = quat->y * z2;
zz = quat->y * z2;
wx = quat->w * x2;
wy = quat->w * y2;
wz = quat->w * z2;
//将其填入矩阵位置
m[0][0] = 1.0 - (yy +zz);
m[1][0] = xy - wz;
m[2][0] = xz + wy;
m[3][0] = 0.0;
m[0][1] = xy + wz;
m[1][1] = 1.0-(xx+zz);
m[2][1] = yz + wx;
m[3][1] = 0.0;
m[0][2] = xz + wy;
m[1][2] = yz + wx;
m[2][2] = 1.0 - (xx + yy);
m[3][2] = 0.0;
m[0][3] = 0.0;
m[1][3] = 0.0;
m[2][3] = 0.0;
m[3][3] = 1.0;
}
{
float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
//计算相关的系数
x2 = quat->x + quat->x;
y2 = quat->y + quat->y;
z2 = quat->z + quat->z;
xx = quat->x * x2;
xy = quat->x * y2;
xz = quat->x * z2;
yy = quat->y * y2;
yz = quat->y * z2;
zz = quat->y * z2;
wx = quat->w * x2;
wy = quat->w * y2;
wz = quat->w * z2;
//将其填入矩阵位置
m[0][0] = 1.0 - (yy +zz);
m[1][0] = xy - wz;
m[2][0] = xz + wy;
m[3][0] = 0.0;
m[0][1] = xy + wz;
m[1][1] = 1.0-(xx+zz);
m[2][1] = yz + wx;
m[3][1] = 0.0;
m[0][2] = xz + wy;
m[1][2] = yz + wx;
m[2][2] = 1.0 - (xx + yy);
m[3][2] = 0.0;
m[0][3] = 0.0;
m[1][3] = 0.0;
m[2][3] = 0.0;
m[3][3] = 1.0;
}
转帖地址:
http://www.azure.com.cn