四元数 Quaternion

时间:2021-11-06 20:08:11

最近在重写自己游戏引擎的场景管理模块,重温了一下有关四元数的一些知识,在此做一下简单的笔记。

四元数可以用来准确地描述三维矢量的旋转,并且可以有效地表达多个旋转操作的叠加,因此在三维游戏引擎的场景管理模块中,四元数具有很重要的意义。

本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/


一、定义

形如A = ai + bj + ck + d的复数称为四元数,其中ijk为虚数(称为四元数的基元),a、b、c、d为实数。

二、常见性质

1. i2 = j2 = k2 = -1

2. ij = k       jk = i         ki = j

3. ij = –ji     jk = –kj      ki = -ki

4. ii* = 1     i* = –i       即i*与i共轭,jk同理

5. 四元数的乘法运算满足结合律与分配律,不满足交换律

6. 将四元数虚部看作三维矢量,则两个四元数的矢量部分乘积为αβ = -αβ +α×β,令四元数A = α + d1,B = β + d2,则

AB = -αβ +α×β + d2α + d1β + d1d2 = (d1a2 – c1b2 + b1c2 + a1d2) i
                                                                 + (c1a2 + d1b2 – a1c2 + b1d2) j
                                                                 + (-b1a2 + a1b2 + d1c2 + c1d2) k
                                                                 – a1a2 – b1b2 – c1c2 + d1d2

7. (AB)* = B*A*

8. 定义四元数 A = ai + bj + ck + d 的范数为:||A|| = a2 + b2 + c2 + d,模为:|A| = sqrt(a2 + b2 + c2 + d2)

9. 定义四元数A的逆为: A-1 = A* / ||A||

10. A-m = (A-1)m = (Am)-1

三、使用四元数表述矢量旋转

假设矢量α绕转轴e = (xe,ye,ze)旋转θ角得到β,则:

β = uαu-1

其中:

u = e sin(θ/2) + cos(θ/2)

u-1 = u* = - e sin(θ/2) + cos(θ/2)

因此,我们可以使用四元数u = (x,y,z,w)表示坐标旋转,其中:

x = sin(θ/2) xe

y = sin(θ/2) ye

z = sin(θ/2) ze

w = cos(θ/2)

四、使用矩阵表示坐标旋转

假设旋转轴为a = (xa,ya,za),旋转角为α,则旋转矩阵如下:

四元数 Quaternion

五、四元数与旋转矩阵的转化

根据半角公式:

sinα = 2sin(α/2)•cos(α/2)

cosα = cos2(α/2) - sin2(α/2)

cos2(α/2) = (1 +cosα)/2

sin2(α/2) = (1 -cosα)/2

四元数转化为旋转矩阵可表示如下:

四元数 Quaternion

四元数 Quaternion的更多相关文章

  1. 学习和研究下unity3d的四元数 Quaternion

    学习和研究下unity3d的四元数 Quaternion 今天准备学习和研究下unity3d的四元数 Quaternion 四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示 ...

  2. unity3d的四元数 Quaternion

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/02/2995074.html 今天准备学习和研究下unity3d的四元数 Quaternion ...

  3. 四元数quaternion

    四元数的简单方法运用四元数在Unity3D中的作用就是拿来表示旋转. AngleAxis 创建一个旋转,绕着某个轴旋转,返回结果是一个四元数. 跟ToAngleAxis实现的是相反的功能. Angle ...

  4. [Unity Quaternion]四元数Quaternion的计算方式

    什么是Quaternion四元数 1843年,William Rowan Hamilton发明了四元数,但直到1985年才有一个叫Ken Shoemake的人将四元数引入计算机图形学处理领域.四元数在 ...

  5. 【Unity编程】四元数(Quaternion)与欧拉角

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩 ...

  6. 【转】【Unity】四元数(Quaternion)和旋转

    http://blog.csdn.net/candycat1992/article/details/41254799

  7. 四元数和旋转(Quaternion & rotation)

    四元数和旋转(Quaternion & rotation) 本篇文章主要讲述3D空间中的旋转和四元数之间的关系.其中会涉及到矩阵.向量运算,旋转矩阵,四元数,旋转的四元数表示,四元数表示的旋转 ...

  8. 【Unity编程】Unity中关于四元数的API详解

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...

  9. 视觉SLAM中的数学基础 第二篇 四元数

    视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...

随机推荐

  1. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  2. 清华学堂 Range

    Descriptioin Let S be a set of n integral points on the x-axis. For each given interval [a, b], you ...

  3. Tableau地图移动

    最近又回归写报表,新的工具使用Tableau,这次要做一个地图,当地图导入之后一直无法能够较好的移动地图,百度也找不到资料. 每次点击一下省份或者利润就是放大或者缩小,很不好移动位置. 研究了一下很简 ...

  4. Java多线程(四) 线程池

    一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...

  5. 如何使用mysql的grant命令(详解)

    grant命令的基本格式 grant 权限 on 数据库对象 to 用户 实例一:在任意ip地址登陆的common_user用户可以对testdb数据库里的数据进行查询操作.插入操作.更新操作.删除操 ...

  6. 贪心:SPOJ Backup Files

    BACKUP - Backup Files no tags  You run an IT company that backs up computer data for large offices. ...

  7. macOS webview编程

    好像是macOS10.10之后,以及iOS8之后,新出现的WKWebview组件就迅速的替代了Webview及UIWebView.后者的确存在一些无法解决的bug,诸如架构导致的速度缓慢和内存泄漏. ...

  8. Python 协程了解

    协程: 1.协程,又称微线程,纤程.英文名Coroutine. 2.协程是跑在线程内的单线程,串行没有锁. 3.协程是一种用户态的轻量级线程. 4.协程CPU是访问不到的,协程是用户自己控制的.   ...

  9. Thinkphp5.0整合个推例子

    最近做一个后台发送消息推送到app(android和ios)的功能,该功能采用的是个推接口,基于php的,我用TP5来实现这个推送流程.先看官方demo吧.可以先参考官方给到的例子来看http://d ...

  10. 原生js作用域(红宝书)

    function fn(){ ; alert(a); // 2; } alert(a);//未被定义: alert(b);//全局变量:b=2: ; function fn1(){ ; functio ...