3D空间中的旋转可用旋转矩阵、欧拉角或四元数等形式来表示,他们不过都是数学工具,其中在绕任意向量的旋转方面,旋转矩阵和四元数两种工具用的较多,欧拉角由于存在万向节死锁等问题,使用存在限制。

(本文假设坐标系为左手坐标系中,旋转方向为顺时针。)

所求问题:

给定任意单位轴q(q1,q2,q3)(向量),求向量p(x,y,z)(或点p)饶q旋转theta角度的变换后的新向量p'(或点p'):

1.用四元数工具:
-------------------------------------------------------------------------
结论:构造四元数变换p'= q*p*q-1,(p,q是由向量p,q扩展成的四元数)。那么,p'转换至对应的向量(或点)就是变换后的新向量p'(或点p')。

其中,p',q,p,q-1均为四元数。q由向量q扩展,为q=(cos(theta/2),sin(theta/2)*q),p由向量p扩展,为p=(0,x,y,z),q-1为q的逆,因为q为单位四元数,所以q-1=q*=(cos(theta/2),-sin(theta/2)*q)。
-------------------------------------------------------------------------

(这个结论的证明过程可以在网上找到。这里略去。)
下面看其时间复杂度:

首先有个三角函数的计算时间,这个可以预先计算好,花费时间不计。考虑n个四元数相乘需进行4*4*(n-1)=16*(n-1)次乘法,15*(n-1)次加法,因为加法化费时间较少,这里仅考虑乘法。这里涉及到三个四元数的乘法,设一次乘法的时间为T,故花费16*2=32T

2.旋转矩阵工具:
-------------------------------------------------------------------------
结论:构造旋转矩阵变换Trot,则变换后的新向量p'(或点p')为p'= p*Trot

其中,p'(x',y',z',1),p(x,y,z,1)为向量p',p的4D齐次坐标表示,Trot =

|t*q1*q1 + c,           t*q1*q2 + s*q3,        t*q1*q3 - s*q2,        0|
|t*xq1*q2 - s*q3,     t*q2*q2 + c,              t*q2*q3 + s*q1,       0|
|t*q1*q3 + s*q2,       t*q2*q3 - s*q1,        t*q3*q3 + c,            0|
|0,                              0,                              0,                                1|

c=cos(theta), s=sin(theta),t=1-c.
-------------------------------------------------------------------------
(这个结论的证明过程可以在网上找到。这里略去。)

下面看其时间复杂度:

三角函数的计算时间不计。矩阵本身的元素乘法主要是计算t*x和s*x之类,需进行12+3=15次乘法。两个矩阵相乘的需进行n*n*n次乘法,这里n=4,所以花费4*4*4=64次乘法时间,但这里有个注意的地方就是旋转矩阵的第4维无须考虑,即可简化为3X3的矩阵。故花费3*3*3=27次乘法时间,总共的时间为15+27=42次乘法时间。cost=42T.

比较来看,还是使用四元数的效率要高出一些,这在要变换的点的数目越大时,体现的越明显。实际上,有很多3D引擎为了利用四元数运算的高效率性,一般先将矩阵转换成四元数后进行运算再转回为矩阵后,再传给DirectX或OpenGL库函数。

问题:
3D空间中,在等长度的两个交角为theta的向量v1(x1,y1,z1),v2(x2,y2,z2)之间进行球面线性插值。

实例:
做一个行星在围绕太阳等速旋转的动画,假设只采样到旋转过程中的两个位置p1,p2,现在想要用软件模拟行星是怎么从p1运动到p2的。

思路:
1。一般线性插值:

我们知道一般两个量之间进行线性插值的方法为:
v(t) = v1 + t*(v2-v1)(0<=t<=1)(因为t是一次方的,所以是线性的。)

如上图所示。这里,考虑v,v1,v2是向量,由几何学的知识,v2-v1即为v1,v2组成的三角形的另外一条边。因为|v1| = |v2|,所以v1 + t*(v2-v1)的长度肯定小于|v1|或|v2|,当0<t<1时。得到的插值向量v(t)的端点沿着v2-v1行进。

***********************************************
一般线性插值由于长度发生变化,不能满足案列的要求,我们需要保持向量长度不变的插值,即球面线性插值。
***********************************************

2。一般球面线性插值:


如上图所示,将一般线性插值得到的结果乘以放大系数k(t),使其长度放大到|v1|或|v2|,即得保持向量长度不变的插值:
v(t) = k(t)*(v1 + t*(v2-v1))

其中k(t) = |v1|/|v(t)|=|v1|/|v1+t*(v2-v1)|.

这样,插值向量v(t)的端点就会沿着v1,v2端点构成的圆弧行进。因为v1,v2是等长的,这个圆弧实际上是位于v1,v2构成的球面上的一段,所以又叫球面线性插值,

*****************************************************************
这个插值解决了3D空间中旋转的插值,在关键帧动画中可以用来计算两个关键帧之间的动画。但是,由于它的插值不是等角速度的,而是变速的。所以如果用来实现案例中的效果的话还需进一步处理。
*****************************************************************

***************************************
注:一般球面线性插值v(t)与v1的夹角theta(t)不是t的线性函数。

证明:由向量点积可得cos(theta(t)) = (v(t)*v1)/|v(t)|*|v1|,
theta(t) = arcos((v(t)*v1)/|v1|^2),由反证法,假设theat(t)为线性函数,则 theat(t) = k*t + b,又theta(0) = 0,故 b = 0,theat(t) = k*t,将t'= 2t代入得,theta(2*t) = arcos((v(2*t)*v1)/|v1|^2)并不等于 2*theta(t),所以theat(t)不可能是t的线性函数。
***************************************

3。改进的球面线性插值:

要想进行等速的球面线性插值,有几个方法:

1)。用四元数工具:

变换方法:
---------------------------------------------
构造单位四元数q(cos(theta),sin(theta)*v1'),r(cos(theta),sin(theta)*v2')(v1'和v2'为单位v1,v2向量),以

及参数t(0<=t<=1),则构造四元数变换:

a.四元数 s(w,v') = r*(q-1)exp(t)*q
即为球面线性插值变换。其中,s的虚部v'即为v1'和v2'间的插值向量,乘以长度sqrt(x1^2+y1^2+z1^2)即得v1,v2间插值向量v。

b.另一种变形形式是对四元数进行插值变换:
s(w,v') = a*q + b*r

其中a = sin(alpha*(1-t))/sin(alpha),b = sin(alpha*t))/sin(alpha), cos(alpha) = x1*y1+y1*y2+z1*z2+w1*w2.
s的虚部v'即为v1'和v2'间的插值向量,乘以长度sqrt(x1^2+y1^2+z1^2)即得v1,v2间插值向量v。

两种变换都可以。
----------------------------------------------

复杂度:

以b方法为例:时间主要花在三角函数上,四元数乘以实数只需4次乘法。cost = 1*Tat + 3*Tt + 2Td + 3*4Tm

2)。利用旋转矩阵:

变换方法:
--------------------------------------------
v = v1*Trot

其中,Trot即饶任意轴旋转的矩阵变换矩阵。因为v1到v2间的插值可以看成是v1饶垂直于v1,v2组成的平面的向量的旋转,所以实际上就是个饶轴旋转的问题,不过相应参数变成:theta = t*theta,轴q(q1,q2,q3)变成向量v1Xv2/|v1Xv2| = (y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2)/sin(theta)
--------------------------------------------

复杂度:

基本和饶任意轴旋转矩阵的复杂度一样。主要是多了个向量叉积操作。 cost =2*Tt + 6*Tm + 42*Tm = 2*Tt +48*Tm

四元数法、旋转矩阵法、欧拉角法的比较相关推荐

  1. 自动驾驶坐标系变换:欧拉角法

    初识飞行器,第一个绕不开又让人觉得无比头疼的就是坐标轴的定义以及它们之间的变换. 两个坐标系之间的转换,在飞行动力学中主要有欧拉角法和四元数法等等. 本次主要学习欧拉角法, 分别分析两个向量: 整理成 ...

  2. 有限单元法基本原理和数值方法_SPH法介绍

    SPH法介绍 Smoothed Particle Hydrodynamics 基于网格的数值方法虽然已经有广泛的应用,但是在很多方面仍存在不足之处,比如在计算流体动力学的大变形.运动物质交界面.自由表 ...

  3. 机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD)

    机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD) garbage in,garbage out. 异常值是分析 ...

  4. 特征选择过滤法之方差选择、双样本t检验、方差分析、相关系数法、卡方检验、互信息法

    特征选择过滤法之方差选择.双样本t检验.方差分析.相关系数法.卡方检验.互信息法 目录

  5. 费曼学习法与孔子温故知新学习法为两大重要学习法,前者外向表现,后者内省提升

    费曼学习法与孔子温故知新学习法为两大重要学习法,前者外向表现,后者内省提升 附前者链接 https://blog.csdn.net/wo541075754/article/details/101554 ...

  6. c语言折半查找法_C语言学习|选择法排序及折半查找法查找

    数组名作为函数参数示意图 交换法排序,读者只要仔细研究一下这个算法就不难发现,其排序效率较低.因为在第i轮(i=0,1,2--,n-2)比较中,第i+1个数和后面所有的数都要进行一次比较,每进行一次比 ...

  7. 【DBMS 数据库管理系统】数据仓库中 数据追加 ( 时标方法 | DELTA 文件法 | 前后映像文件法 | 日志文件法 )

    文章目录 一.数据追加 概念 和 方法 二.时标方法 三.DELTA 文件法 四.前后映像文件法 五.日志文件法 一.数据追加 概念 和 方法 数据仓库 数据追加 : "数据追加" ...

  8. 回溯法基本思想_LeetCode--回溯法心得

    这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能解决这类回溯法的套路出来,方便以后快速解决此类题目.于是我在网上找了两个很经典的回溯法题目--八皇 ...

  9. 计组之存储系统:8、Cache写策略(全写法、写回法、写分配法、非写分配法、多级Cache)

    8.Cache写策略 思维导图 存在的问题 Cache写策略 写回法 全写法 写分配法 非写分配法 多级Cache 思维导图 存在的问题 Cache写策略 写回法 先修改Cache中的数据,然后通过脏 ...

  10. Python06 向前Euler法、向后Euler法、梯形方法、改进的Euler方法以及四阶Runge_Kutta方法(附代码)

    1. 实验结果 (1)解如下常微分方程: (2)分别使用向前 Euler 法.向后 Euler 法.梯形方法.改进的 Euler 方法以及 四阶 Runge_Kutta 方法,结果如下图所示: 由结果 ...

最新文章

  1. oracle 表空间操作
  2. HTML(二):表格元素
  3. EOJ_1039_最长连续公共子序列
  4. Zookeeper02_zk集群搭建
  5. Design Compiler指南——设计综合过程
  6. Chrome升级 76.0.3809.87后 GreenChrome无法使用的办法
  7. STM32启动代码概述
  8. Truecrypt隐形操作系统终极方案
  9. 笔记本键盘扣安装注意事项(小技巧)
  10. 黑苹果oc清除nvram_小新Pro13 黑苹果/多系统心得
  11. esp8266教程:开发方式和SDK选择
  12. 仅允许用户radmin使用su命令
  13. 华为云教程(虚拟私有云VPC)
  14. 结构化、半结构化和非结构化数据
  15. 大学英语(第三册)复习(原文及全文翻译)——Unit 1 - A Brush with the Law(与警察的一场小冲突)
  16. 史上最全的C++/游戏开发面试问题总结(一)——C++基础
  17. linux之父博客,Linux25周年之际:专访 Linux 之父 Linus Torvalds
  18. 修改Docker默认安装路径
  19. 如何伦敦银走势图中寻找波段操作机会
  20. scilab 求微分_科学计算自由软件SCILAB在常微分方程中的应用

热门文章

  1. 华为账号怎么强制退出
  2. 场景应用移动互联新入口
  3. 企业电子招标采购系统项目说明+开发类型+解决方案+功能描述+二次开发+spring cloud
  4. Mac电脑上矢量绘图设计软件推荐:Sketch一款不逊色PS设计应用
  5. 修改主机名和ip地址之后需重新reconfigure GI
  6. 【Android -- 写作工具】Markdown 分级标题
  7. DNS暴力破解工具Fierce常用命令
  8. 01、java基础语法笔记
  9. 网络安全web方向入门题合集
  10. android opengl美颜功能,Android短视频中如何实现720P磨皮美颜录制