四元数和欧拉角,轴角对之间的相互转化

在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点。本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系:

图1 3D Cartesian coordinate System (from wikipedia)

定义分别为绕Z轴、Y轴、X轴的旋转角度,如果用Tait-Bryan angle表示,分别为Yaw、Pitch、Roll。

图2 Tait-Bryan angles (from wikipedia)

一、四元数的定义

通过旋转轴和绕该轴旋转的角度可以构造一个四元数       :

其中是绕旋转轴旋转的角度,为旋转轴在x,y,z方向的分量(由此确定了旋转轴)。

二、欧拉角到四元数的转换

三、四元数到欧拉角的转换

                                               arctanarcsin的结果是,这并不能覆盖所有朝向(对于的取值范围已经满足),因此需要用atan2来代替arctan

四、在其他坐标系下使用

在其他坐标系下,需根据坐标轴的定义,调整一下以上公式。如在Direct3D中,笛卡尔坐标系的X轴变为Z轴,Y轴变为X轴,Z轴变为Y轴(无需考虑方向)。

四元数和欧拉角,轴角对之间的相互转化

时间: 2024-11-13 05:48:58

四元数和欧拉角,轴角对之间的相互转化的相关文章

矩阵、欧拉角、轴-角对、四元数随笔

一.矩阵  在 3D 游戏中,可以使用矩阵来表示一个物体的旋转.  1) 优点:    个人认为,理解起来最为直观.    像现成的DXSDK库中也提供了十分完善的相关接口    一个矩阵即可表示多种变换的组合  2) 缺点:    每次计算都会产生误差,因此,需要经常规范化.    耗的内存较多些.    二.欧拉角  欧拉角指的是:以世界坐标系为参考坐标系(一定记住是世界坐标系),使用x,y,z三个值来分别表示绕(世界的)x轴.y轴.z轴旋转的角度量值.其取值是在[0, 360]间.一般用r

3D数学基础:四元数与欧拉角之间的转换

在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 图1 3D Cartesian coordinate System (from wikipedia) 定义分别为绕Z轴.Y轴.X轴的旋转角度,如果用Tait-Bryan angle表示,分别为Yaw.Pitch.Roll. 图2 Tait-Bryan angles (from wikipedia) 一.四元数的定义 通过旋转轴和绕该

3D图形学在游戏开发中的,矩阵,四元数,欧拉角之间的底层转换算法。

在游戏开发的过程中难免会遇到欧拉角和四元数直接的转换问题,如果有些过shader的朋友,肯定也遇到过四元数,欧拉角和矩阵直接的转换问题,这里我把这几种格式直接的转换算法写在这里有需要的朋友可以拿去有,别忘了,点赞关注.废话不多说,直接上代码. 四元数转矩阵的底层算法: public Quaternion QuaternionMatrix(float w, float x, float y, float z) { Matrix4x4 matrix = new Matrix4x4(); matrix

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

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

四元数 和 欧拉角

标题:[Unity技巧]四元数(Quaternion)和旋转  转自:http://blog.csdn.net/candycat1992/article/details/41254799 原作者:妈妈说女孩子要自立自强 四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转.矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按

eigen 中四元数、欧拉角、旋转矩阵、旋转向量

一.旋转向量 1.0 初始化旋转向量:旋转角为alpha,旋转轴为(x,y,z) Eigen::AngleAxisd rotation_vector(alpha,Vector3d(x,y,z)) 1.1 旋转向量转旋转矩阵 Eigen::Matrix3d rotation_matrix;rotation_matrix=rotation_vector.matrix(); Eigen::Matrix3d rotation_matrix;rotation_matrix=rotation_vector.

Python中的列表,元组,字符串之间的相互转化

Python中的列表元组和字符串之间的相互转化需要利用,tuple(),list(),str(). 示例如下: >>> the_string = "hello I'am xiaoli!" >>> #字符串转化为元组 >>> the_tuple = tuple(the_string) >>> the_tuple ('h', 'e', 'l', 'l', 'o', ' ', 'I', "'", 'a

【Java】字符串变量和整形之间的相互转化与静态方法static

字符串变量和整形之间的相互转化在任何编程语言中都是很常见的东西,请不要与(int)String等强制类型转换混淆,这样做是不对的,(String)int,诸如这样是不能完成字符串变量和整形之间的相互转化的,强制类型转换只用于,整形int与浮点float的互转,父类转化为子类. 在Java中的字符串String转化为整形int,可以利用Integer.parseInt(),而整形int转化成String虽然很多人都知道大名鼎鼎的toString(),但不应该对此形成定式思维,其实你在对于任意一个整

C#中 byte[] Image Bitmap之间的相互转化

/// <summary>         /// 将图片Image转换成Byte[]         /// </summary>         /// <param name="Image">image对象</param> /// <param name="imageFormat">后缀名</param> /// <returns></returns> public