四元数与空间旋转

WIKI:单位四元数Unit quarternion可以用于表示三维空间里的旋转。它与常用的另外两种表示方式(三维正交矩阵和欧拉角)是等价的,但是避免了欧拉角表示法中的万向锁问题。比起三维正交矩阵表示,四元数表示能够更方便地给出旋转的转轴与旋转角。

关于欧拉角旋转的万向节死锁问题,是旋转的时候一不小心是两个不同的轴重合了,从而导致失去了一个轴的自由度。四元数不会出现这样的问题。

不太懂还是,大致意思是一个单位四元数可以使得三维空间中的一个点实现旋转。具体公式是

其中p是三维空间的一个点转化成的一个纯四元数,至于旋转的角度与旋转轴都由四元数q来决定。

在左手坐标系中代表顺时针旋转,将q与倒数调换即为逆时针旋转。当q为单位四元数时,q的倒数和共轭相同,公式中的倒数可以使用共轭替换。由于共轭只需要改变符号就可以获得,所以这个旋转所需要的计算代价很小。

对于旋转轴与旋转角度:旋转轴由四元数q的虚部代表的向量来决定。

           旋转角度根据四元数q的实部
q=((x,y,z)sin?θ/2,cos?θ/2)

贴一个写的不错的博客文章链接:滴滴里面的证明没看懂。。

l  旋转变换

旋转变换是所有变换矩阵中最复杂的,因为它使用了许多的三角函数。要利用旋转方程对点进行旋转,需要提取旋转方程的运算反,然后将它们放到矩阵中。在3D坐标系中,可以绕三个轴进行旋转:x轴、y轴、z轴,现在介绍绕z轴旋转的情况。重要的是,绕任何轴旋转是,该轴对应的分量保持不变。现给定p=[x? y?
z? 1],变换矩阵Mz

Mz=cosθsinθ00-sinθcosθ0000100001

??????
p‘=pMz=x? y? z? 1*cosθsinθ00-sinθcosθ0000100001=[x*cosθ-y*sinθ ??x*sinθ+y*cosθ ??z? 1]

对于旋转变换矩阵的逆矩阵,有两种方法可以计算:一种方法基于几何学,另一种方法基于线性代数。首先采用几何学方法计算逆矩阵。将物体绕z轴旋转角度θ后,要将它恢复到原来的位置,只需要将它旋转角度-θ即可。因此要计算旋转矩阵的逆矩阵,只需要将旋转矩阵中的θ替换为-θ。因此,逆矩阵Mz-1如下:

Mz-1=cos-θsin-θ00-sin-θcos-θ0000100001=cosθ-sinθ00sinθcosθ0000100001

下面采用线性代数的方法来计算逆矩阵。正交(Orthonormal)矩阵指的是,在给定的基(basis)的情况下,矩阵的每一行(列)都与前一行(列)垂直。所以旋转矩阵Mz是正交矩阵,而对于正交矩阵,其转置矩阵与逆矩阵相同。故旋转变换矩阵的逆矩阵为:

Mz-1=Mzt=cosθ-sinθ00sinθcosθ0000100001

时间: 2024-12-23 05:55:38

四元数与空间旋转的相关文章

iOS 开发设置空间旋转中心点的代码

//让控件以 [self setAnchorPoint:CGPointMake(0, 0) forView:smallImg];为中心点旋转 //CGPointMake(0, 0)   控件的左上角为中心点 //CGPointMake(1, 1)   控件的右下角为中心点 - (void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view { CGPoint oldOrigin = view.frame.origin; view.

正方体空间旋转

所用的图片:等等······,可以自己添加图片 代码:<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>六边形</title>    <style type="text/css">    body{        background: black;    }    

web前端基础案例-开发QQ空间旋转时光轴

知识点:html标签,css样式属性,代码优化,行业规范,布局思路,javascript基础,jquery方法,逻辑思维.html代码: <div class="con"> <div class="top"> <img src="images/my.jpg" height="667" width="500" alt="关键词" /> <p>

[百度空间] [转] 四元数(Quaternions)

转:四元数(Quaternions) 好吧,我必须承认到目前为止我还没有完全理解四元数,我一度把四元数理解为轴.角表示的4维向量,也就在下午我才从和同事的争辩中理解了四元数不完全是角.轴这么简单,为此写点心得给那些同我一样搞了2年3D游戏的还不清楚四元数的朋友. 为什么使用四元数 为了回答这个问题,先来看看一般关于旋转(面向)的描述方法-欧拉描述法.它使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些

四元数指数映射旋转参数化的实际应用(Practical Parameterization of Rotations Using the Exponential Map)

欢迎加入Bullet物理讨论QQ群:533030320 ,群内由计算机图形学.流体模拟动力学学术群中坐镇的大神管理组成. 四元数指数映射旋转参数化的实际应用 (Practical Parameterization of Rotations Using the Exponential Map) 哪吒三太子 2016/3/26 于上海卢湾 下面为本文使用术语表,表中所有词条大多直接采用英文术语,请各位读者自行伸缩去取,笔者在此不做所谓"直译". - DOF(degree-of-freedo

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘. 三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋转都可以用绕三维空间中某一个轴的一次旋转来表示.表示三维空间的旋转有多种互相等价的方式,常见的有旋转矩阵.DCM.旋转向量.四元数.欧拉角等.本篇文章主要梳理一下这些表示方式及相互转换的方法. 1. 欧拉角(Euler Angle) 最直观的表示方式是绕刚体自身的X.Y.Z三个轴分别进行旋转某个角度

【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移.图形旋转.图像反转倒置镜像和图像缩放的知识.同时文章比较详细基础,没有采用GDI+获取矩阵,而是通过读取BMP图片信息头和矩阵像素实现变换,希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生. [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处

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

欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩阵旋转和四元数旋转.接下来我们比较它们的优缺点. 欧拉角 优点:三个角度组成,直观,容易理解. 优点:可以进行从一个方向到另一个方向旋转大于180度的角度. 弱点:死锁问题. 前面<[Unity编程]欧拉角与万向节死锁(图文版)>已经介绍过万向节死锁问题. 四元数 内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们.除非你特别有兴趣深入了解四元数学,你只

为什么使用四元数

转载:http://www.game798.com/html/2007-05/3689.htm 好吧,我必须承认到目前为止我还没有完全理解四元数,我一度把四元数理解为轴.角表示的4维向量,也就在下午我才从和同事的争辩中理解了四元数不完全是角.轴这么简单,为此写点心得给那些同我一样搞了2年3D游戏的还不清楚四元数的朋友. 为 了回答这个问题,先来看看一般关于旋转(面向)的描述方法-欧拉描述法.它使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为 0-360(或者0-2pi),一