zoukankan      html  css  js  c++  java
  • 四元数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/ecidevilin/article/details/77937109
    何为四元数?讲解四元数的文章往往会把四元数跟复数联系在一起。诚然,四元数的起源跟复数有关系,但是理解复数系统并不是理解四元数的首要条件。
    提到四元数,我们首先要提到一个人——莱昂哈德·欧拉(Leonhard Euler),根据欧拉旋转定理(wiki),在三维空间里,假设一个刚体在做一个位移的时候,刚体内部至少有一点固定不动,则此位移等价于一个绕着包含那固定点的固定轴的旋转。还有另外一种阐述:3D中的任意角位移都能表示为绕单一轴的单一旋转。如图所示:

    所谓角位移也就是旋转,我们通常用欧拉角表示,这也是最容易理解的一种形式。

    那么轴-角形式跟四元数有什么关系?它们并不等同,但是却也密不可分。

    上图的四元数表示法:

    q=[cos(θ/2) sin(θ/2)e]

    注意这里e是图中的向量,即

    q=[cos(θ/2) sin(θ/2)ex sin(θ/2)ey sin(θ/2)ez]

    那么接着我们就要讨论四元数跟复数的关系了,首先先把William Hamilton这个四元数的发明者提出来,免得大家觉得没意思跳过了这段。

    首先,什么是复数?

    我们知道在实数范围里,对负数开方是没有意义的。但是偏偏有人愿意做“没有意义”(注意这里是引号)的事情,于是定义了虚数i,i的平方等于-1。

    那么当实数和虚数加在一起,便成为了复数。

    a+bi

    其中a被称为实部,b被成为虚部。

    因为有实部和虚部,所以我们可以认为在复数集存在于一个2D平面(复数平面,又称高斯平面)上,两个轴分别为实轴和虚轴,这样x+yi就可以视作一个2D的点P为(x,y)。

    当P绕原点旋转角度θ时

    我们可以用另外一个复数来表示这个旋转:

    q=cosθ+isinθ

    旋转后的点

    p1=pq=(x+yi)(cosθ+isinθ)=(xcosθ-ysinθ)+(xsinθ+ycosθ)i

    因为i的平方为-1,所以复数为我们提供了一个有趣的旋转的表示法。(我们可以将这里的q理解为“2D平面上的四元数”,但其实他们之间还是有区别的)

    然后我们的主角终于登场了,爱尔兰数学家William Hamilton多年来一直致力于寻找一种方法将复数从2D扩展到3D。他认为,这种新的复数应该有一个实部和两个虚部。然而,Hamilton一直没有办法创造出一种有两个虚部的有意义的复数。但故事并没有结束,1843年,在赴皇家爱尔兰学院演讲的路上,他突然意识到应该有三个虚部而不是两个。他把定义这种新复数类型性质的等式刻在Broome桥上。这样,四元数就诞生了。(本段抄自《3D数学基础:图形与游戏开发》)

    四元数扩展了复数系统,它使用三个虚部i,j,k。它们的关系如下:

    ii=jj=kk=-1

    ij=k,ji=-k

    jk=i,kj=-i

    ki=j,ik=-j

    一个四元数[w, x, y, z]定义了复数w+xi+yj+zk。

    具体四元数的一些公式,我们有缘再讲,只是有一个必须要提一下,这也是2D和3D上的区别。

    定义三维上的点(x,y,z)在四元数空间上的坐标p=[0,x,y,z],那么如何让这个点绕轴e旋转θ?我们设绕轴e旋转θ对应的四元数为q,那么旋转后的点为:

    p1=qpq-1

    其中q-1为q的逆(等于q的共轭复数除以q的模,[w,x,y,z]的共轭为[w,-x,-y,-z],模的定义与向量模类似,为各项平方和的开方)。

    (Unity3D里我们可以直接用四元数Quaternion乘以向量Vector3,得到旋转后的点)

    最后提一句,四元数可以解决欧拉角的万向锁问题和别名问题(所以U3D里使用Quaternion来保存旋转)。
    ————————————————
    版权声明:本文为CSDN博主「凯奥斯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ecidevilin/article/details/77937109

  • 相关阅读:
    Character 比较注意先要转换成字符串类型
    ibats注意
    初试体验java多线程
    解压jar
    Velocity语法--转载
    python 批量请求url
    java.lang.NoClassDefFoundError
    疑问
    sql常用语句--转载
    Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
  • 原文地址:https://www.cnblogs.com/yptianma/p/11778053.html
Copyright © 2011-2022 走看看