|
|
//由旋转矩阵得到四元数
void quat_from_matrix( float *quat, float *m )
{
float tr, s, q[4];
int i, j, k;
int nxt[3] = {1, 2, 0};
tr = MAT(m, 0, 0) + MAT(m, 1, 1) + MAT(m, 2, 2);
// check the diagonal检查对角线
if (tr > 0.0)
{
s = (float)sqrt (tr + 1.f);
quat[W] = s / 2.0f;
s = 0.5f / s;
quat[X] = (MAT(m,1,2) - MAT(m,2,1)) * s;
quat[Y] = (MAT(m,2,0) - MAT(m,0,2)) * s;
quat[Z] = (MAT(m,0,1) - MAT(m,1,0)) * s;
}
else
{
// diagonal is negative
i = 0;
if (MAT(m,1,1) > MAT(m,0,0)) i = 1;
if (MAT(m,2,2) > MAT(m,i,i)) i = 2;
j = nxt;
k = nxt[j];
s = (float)sqrt ((MAT(m,i,i) - (MAT(m,j,j) + MAT(m,k,k))) + 1.0);
q = s * (float)0.5;
if (s != 0.0f) s = 0.5f / s;
q[3] = (MAT(m,j,k) - MAT(m,k,j)) * s;
q[j] = (MAT(m,i,j) + MAT(m,j,i)) * s;
q[k] = (MAT(m,i,k) + MAT(m,k,i)) * s;
quat[X] = q[0];
quat[Y] = q[1];
quat[Z] = q[2];
quat[W] = q[3];
}
}
我的疑问是为什么他要check the diagonal呢,我认为无论对角线‘元素之和是否为正数,都只要前面的那一部分代码就可以了,因为这是四元数转换为旋转矩阵的一个逆过程.
其实对角线元素之和是2cos(θ)-1(θ为旋转角度),那么判断对角线元素之和大于零也就等价于判断cos(θ)>-0.5,这到底表示什么意思呢
我看了一下游戏精粹1,里面也说了一些,但是讲的一塌糊涂,根本就看不懂
|
|