天行健 君子当自强而不息

3D中的方位和角位移(4)

 

四元数乘法(叉乘)

四元数能根据复数乘法解释来相乘,如下:

这导出了四元数乘法的标准定义,下面以两种四元数记法给出,见公式10.9:

不用为四元数叉乘使用乘号,"行"或 "列"四元数也没有什么区别。

四元数叉乘满足结合律,但不满足交换律,如公式10.10所示:

现在看看两个四元数叉乘的模:

展开合并同类项:

最后应用四元数模的定义得到公式 10.11:

因此,四元数乘积的模等于模的乘积。这个结论非常重要,因为它保证了两个单位四元数相乘的结果还是单位四元数。

四元数乘积的逆等于各个四元数的逆以相反的顺序相乘,如公式10.12所示:

现在到了四元数非常有用的性质。让我们"扩展"一个标准3D点(x, y, z)到四元数空间,通过定义四元数p=[0, (x, y, z)]即可(当然,在一般情况下,p不会是单位四元数)。设q为我们讨论的旋转四元数形式[cos(θ/2), nsin(θ/2)],n为旋转轴,单位向量;θ为旋转角。你会惊奇地发现,执行下面的乘法可以使3D点pn旋转:

已经证明,四元数乘法和3D向量旋转的对应关系,更多的是理论上的意义,不是实践上的。实际上,它几乎和把四元数转换到矩阵形式然后再用矩阵乘以向量所用的时间一样。

让我们看多次旋转的情况,将点p用一个四元数a旋转然后再用另一个四元数b旋转:

注意,先进行a旋转再进行b旋转等价于执行乘积ba代表的单一旋转。因此,四元数乘法能用来连接多次旋转,这和矩阵乘法的效果一样。根据四元数乘法的标准定义,这个旋转是以从右向左的顺序发生的。这非常不幸,因为它迫使我们以 "由里向外"的顺序连接多次旋转,这和以矩阵形式作同样的运算是不同的(至少在使用行向量时是不同的)。

针对公式10.9所导致的"顺序颠倒"问题,我们将违背标准定义,以相反的运算顺序来定义四元数乘法。注意,仅仅向量叉乘部分受到了影响,见公式10.13:

这并没有改变四元数的基本性质和用v、θ的几何解释,仍然能用四元数乘法来直接旋转向量,唯一不同的是,根据我们的定义,将四元数放在向量右边,而把它的逆放在向量的左边:

能看到下面这个表达了多个旋转连接的等式,它是自左向右的,与旋转发生的顺序一致:

对于我们来说,让四元数代表角位移的"高级"能力,使其易于使用,这比坚持正式标准更加重要。我们的目的在于理解四元数的本质和它提供给我们的操作,设计一个类将直接引出这些操作,在需要的地方使用这个类,永远不需要再去摆弄里面的数。

 

四元数的"差"

利用四元数的乘法和逆,就能够计算两个四元数的"差"。"差"被定义为一个方位到另一个方位的角位移。换句话说,给定方位ab,能够计算从a旋转到b的角位移d。用四元数等式更加紧凑地表示为:ad=b

两边同时左乘a-1:

现在,我们就有了求得代表一个方位到另一个方位角位移的四元数的方法。

数学上,两个四元数之间的角度"差"更类似于"除",而不是真正的"差"(减法)。

 

四元数点乘

四元数也有点乘运算,它的记法、定义和向量点乘非常类似,如公式10.14所示:

注意,和向量点乘一样,其结果是标量。对于单位四元数ab,有-1 ≤ a . b ≤ 1。通常我们只关心 a . b 的绝对值,因为a . b = -(a . -b),所以b和-b代表相同的角位移。

四元数点乘的几何解释类似于向量点乘的几何解释,四元数点乘 a . b 的绝对值越大,ab代表的角位移越"相似"。


posted on 2008-02-13 17:03 lovedday 阅读(1627) 评论(3)  编辑 收藏 引用

评论

# re: 3D中的方位和角位移(4) 2008-04-08 07:54 梁全

经过仔细对比,公式10.9和公式10.13正好反了。

也就是作者把四元数的 标准公式 和 改进公式 的表达式用反了。

这应该只是疏忽,因为源代码中作者按照改进公式的思想编写的程序,可采用的公式是10.9的公式,看来只是写书的时候把表达式弄颠倒了,程序编写的还对。

  回复  更多评论   

# re: 3D中的方位和角位移(4) 2008-04-09 08:37 lovedday

不是疏忽,作者是故意改变四元数乘法的定义,目的是为了让四元数乘法更易于表达旋转。不过四元数是比较高级的话题,需要抽象代数的基础,这本书其实并没有真正讲清楚,我也不是搞的特别清楚,不过已经理解了作者这么做的意图。  回复  更多评论   

# re: 3D中的方位和角位移(4) 2008-04-09 08:38 lovedday

“对于我们来说,让四元数代表角位移的"高级"能力,使其易于使用,这比坚持正式标准更加重要。我们的目的在于理解四元数的本质和它提供给我们的操作,设计一个类将直接引出这些操作,在需要的地方使用这个类,永远不需要再去摆弄里面的数。”这是作者这么做的原因。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论