游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2536|回复: 4

对旋转矩阵转换为四元数的一个疑问

[复制链接]

5

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2005-1-12 16:29:00 | 显示全部楼层 |阅读模式
//由旋转矩阵得到四元数
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,里面也说了一些,但是讲的一塌糊涂,根本就看不懂

17

主题

80

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2005-1-12 18:09:00 | 显示全部楼层

Re:对旋转矩阵转换为四元数的一个疑问

用的着那么麻烦吗?不是由涵数可以实现吗?用旋转矩阵转换为四元数做的事用涵数就可以做了啊

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2005-1-13 20:21:00 | 显示全部楼层

Re:对旋转矩阵转换为四元数的一个疑问

提高水平最好的方法是把已有的库写一遍。
例如:如果你能写出stl的全部东西,那你就算精通c++l了

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2005-1-14 08:11:00 | 显示全部楼层

Re: Re:对旋转矩阵转换为四元数的一个疑问

seer: Re:对旋转矩阵转换为四元数的一个疑问

提高水平最好的方法是把已有的库写一遍。
例如:如果你能写出stl的全部东西,那你就算精通c++l了


说的虽不错,但是还是得避免“重复发明制造轮子”。如果你不忙的话、、、
[em12]

5

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
 楼主| 发表于 2005-1-14 12:39:00 | 显示全部楼层

Re:对旋转矩阵转换为四元数的一个疑问

怎么这里的人老是说一些无关的话题呢
我已经知道什么原因了,就不要再回贴了吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 01:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表