|
|
发表于 2007-3-7 18:45:00
|
显示全部楼层
Re:4元数宝典
四元数的长处和缺点
冰川球的吉恩瓦尔。
吸收前后左右的倾斜而保持水平
长处
“直观的”
如果给出旋转轴和旋转角度的话,就算不考虑欧拉角之类的,也可以立即计算。
“连续性”
表示相似的旋转的四元数的值也相似。没有吉恩瓦尔洛克现象。
(所谓吉恩瓦尔洛克就是,“北极和南极等特殊点,在自转的情况下是不能动的。”“在中国餐馆的圆桌上,
放在正中央的酱油怎么转也转不近”等,有效的自由度和次元丧失的现象。在软件中成为例外处理的困难因而是麻烦事。本来吉恩瓦尔是把罗盘针吊起来的机构。为了使得即便船摇晃罗盘针也保持水平而不摇晃。吉恩瓦尔的柄把罗盘针晃晃荡荡地吊着,但若使得这些东西的方向一致了,就不能晃了(=洛克lock),振动传到罗盘针了。)
“记忆效率好,计算快”
旋转能够只用4个数值记述。与阿弗因变换矩阵等相比,不用记忆。减少不必要的计算。
缺点
“从外观上看不知道表示什么意思”
从四元数的成分来看,其表示什么意思,一眼看不出来。
“不能表示多圈旋转”
如你所见,使用cos和sin,所以θ是10度,370度,还是-350度,不能区别。
想要制作咕噜咕噜转许多圈的动画的情况下,不想只旋转一遍,请仔细区分。
“是以原点为中心的旋转”
想以原点以外为中心的情况,请让坐标穿上木屐,旋转,然后还原木屐。
(下文的一般位移篇也check一下吧!)
四元数旋转的软件的源代码
<<source code 贴过了>>
一般位移篇:作为旋转以外的变形的扩大缩小(与并进)的步骤
考虑四元数的标量倍,就可以将旋转篇的结果坐标给扩大缩小。比如,
P = (0; x, y, z)
(另外实部可以为任意值。0好算)
kQ = (kcos(θ/2); kα sin(θ/2), kβ sin(θ/2), kγ sin(θ/2))
kR = (kcos(θ/2); -kα sin(θ/2), -kβ sin(θ/2), -kγ sin(θ/2))
(KR是KQ的共轭四元数。)
则有,
kR P kQ = ( 0; 旋转后的XYZ坐标的k的自乘倍)
这样,就可以将以原点为中心的旋转,和以原点为中心的扩大缩小一起操作了。
这表示,可以自由地操作以原点为准的方位及其距离。就是说,将一点(X,Y,Z)映射到任意的点(X',Y',Z')的变换,可以用四元数表示。但X=Y=Z=0的情况例外。
制作你所希望的四元数篇:实施某旋转的四元数的作法
表示将一点A,移到别的点B的以原点为中心的旋转的四元数,像这样制作。
旋转轴(α,β,γ)和位置向量的外积 B×A 平行且同向。(A和B的顺序,按四元数R和Q的乘法的顺序交替。本文的乘法顺序的定义的话,就是BA的顺序。)作了除法之后,将把长度改为1。
(α,β,γ)= (B×A) / (|B×A|)
cos(θ)是,将位置向量的内积 B·A 除以|B|·|A|。
cos(θ)= (B·A) / (|B|·|A|)
根据三角函数的半角公式,
cos(θ/2)=±√{ 0.5 * (1 + cosθ) }
sin(θ/2)=±√{ 0.5 * (1 - cosθ) }
正负号呢,由于 0°?θ?180°所以,cos(θ/2)?0 且 sin(θ/2)?0 就是说,两边都为正。
cos(θ/2)=√{ 0.5 * (1 + cosθ) }
sin(θ/2)=√{ 0.5 * (1 - cosθ) }
也要进行扩大缩小的情况、k = √{|B|/|A|}
从欧拉角到四元数的变换及其逆变换的问题(背景说明篇)
这个问题时不时被谈论,由于数学原因和数学之外的事情而很难。
3次元的旋转呢,
(1) 作为旋转轴的直线
(2) 旋转角度
有这两个信息,就可以表示。这便是“万能的3次元旋转表示”。
把这样的单次的旋转叫做single rotation。
(注意:single rotation 没有旋转中心点。只有旋转轴。如果是,关于像球形关节这样的旋转的,拥有不同旋转轴的single rotation 复合而成的 rotation sequence ,的话,就能够考虑旋转中心点了。)
(*译注:此句的复句结构复杂,但无论怎么理解都不影响意思!)
(注意:四元数将single ratation以旋转轴和旋转角度的信息来直接地表示。
欧拉角呢,是要把一个single rotation,用分解为3个single rotation的方式来表示。可以说故意搞复杂了。而且,蕴含着引起吉恩瓦尔洛克的问题的可能性。)
“欧拉角-->四元数”
考虑像这样的直接的变换是非常难的问题。
正确的是,应该取,
像“欧拉角-->万能表示-->四元数”
这样的,
“一种表式形式-->万能表示-->别的表示形式”
的路径。我想这最安全也易思考。
|
|