3D数学基础:3D游戏动画中欧拉角与万向锁的理解
首先来看一下什么是欧拉角(Euler angles)?
构件在三维空间中的有限转动,可依次用三个相对转角表示,即进动角、章动角和自旋角,这三个转角统称为欧拉角。——引自百度百科
莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何一个参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。——引自wikipedia
好了,引完了,我来说一下我的理解吧,欧拉角是对旋转的一种刻画方式,就像其他刻画方式一样如旋转矩阵,四元数。欧拉角对应的旋转矩阵可以看作是三个绕轴旋转的旋转矩阵的复合。
问题来了,三个绕轴旋转的旋转矩阵绕的是什么坐标系下的轴?
对于坐标系E下的欧拉角(α,β,r)和以下哪个旋转矩阵是等价的
1.绕坐标系E下的x轴旋转α,绕坐标系E下的y轴旋转β,绕坐标系E下的z轴旋转r,三个矩阵的复合
2.绕坐标系E下的x轴旋转α,绕 坐标系E在绕x轴旋转α后的新系E'下的y轴旋转β,绕 坐标系E'在绕y轴旋转β后的新系E''下的z轴旋转r,三个矩阵的复合
通俗的讲,我们在旋转时,要不要把坐标系一起转动?
事实上两种理解都可以,当然,两种转法并不等价,下面我来解释这个问题,
当我们讲到坐标系E下的欧拉角(α,β,r)时,这句话是有歧义的,我们必须定义旋转顺序,因为旋转顺序会影响旋转结果。
如果假设旋转顺序是先绕x轴再y轴再z轴,x-y-z,那么这个欧拉角对应的旋转矩阵是指上述的2所表示的旋转矩阵。
如果假设旋转顺序是先绕z轴再y轴再x轴,z-y-x,那么这个欧拉角对应的旋转矩阵是指上述的1所表示的旋转矩阵,等等,你肯定会问,这难道不是把2中的先后顺序换一下就行了吗,"绕坐标系E下的z轴旋转r,绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β,绕 坐标系E'在绕y轴旋转β后的新系E''下的x轴旋转α,三个矩阵的复合"难道不是这样吗?是的,当然也是这样。
下面我来证明两种复合方式是相等的,
为了方便证明我先定义一些记号,
记:
绕坐标系E下的x轴旋转α的旋转矩阵为Rx,
绕坐标系E下的y轴旋转β的旋转矩阵为Ry,
绕坐标系E下的z轴旋转r的旋转矩阵为Rz,
绕坐标系E下的z轴旋转r的旋转矩阵为Rr(Rr=Rz),
绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb,
绕 坐标系E'在绕y轴旋转β后的新系E''下的x轴旋转α的旋转矩阵为Ra,
另外,将矩阵R的逆记作R~
求证:Rx*Ry*Rz = Rr*Rb*Ra
证明:
Rr = Rz 定义就是一样的,显然相等
Rb = Rr~*Ry*Rr 要得到绕 坐标系E在绕z轴旋转r后的新系E'下的y轴旋转β的旋转矩阵为Rb,可以先应用Rr~这时可以视作在E下,然后使用E下的旋转Ry绕旧的y轴旋转,在应用Rr转回到E'
Ra = (Rr*Rb)~*Rx*(Rr*Rb) 理由同上
所以 右边=Rr*Rb * Ra
=Rr*Rb * (Rr*Rb)~*Rx*(Rr*Rb)
=(Rr*Rb)* (Rr*Rb)~*Rx*(Rr*Rb)
=Rx*(Rr*Rb)
=Rx*(Rr*Rr~*Ry*Rr)
=Rx*Ry*Rz =左边
#证毕
这与DirectX在文档中对D3DXMatrixRotationYawPitchRoll的描述是一致的
D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(
D3DXMATRIX *pOut,
FLOAT Yaw, //绕y轴的转动角
FLOAT Pitch, //绕x轴的转动角
FLOAT Roll //绕z轴的转动角
);
关于欧拉角讲到这里就差不多了,下面来探讨一个和欧拉角有关的概念万向节死锁。
讲到欧拉角一般都会提到万向节死锁,什么是万向节死锁(Gimbal Lock)呢?
万向节死锁有时又被简称为万向节锁或者万向锁,是指当三个万向节其中两个的轴发生重合时,会失去一个自由度的情形。
下面的视频很好的说明了这一点。
正因万向节死锁的存在,使用欧拉角是无法实现球面平滑插值的,
如上图,此时如果下一帧要让箭头指向右侧后方,那么绿色和蓝色对应的旋转角必定要发生突变,因为目前如果想朝着垂直红色圈的方向旋转箭头就像被卡住一样,我想这就是叫它死锁的原因吧。
总之万向节死锁会导致位置上连续变化 在数值表示上确是非连续的。给定的两个关键帧之间无法平滑过渡。顺便提一下解决方法,可以使用四元数球面线性插值(Slerp)
3D数学基础:3D游戏动画中欧拉角与万向锁的理解的更多相关文章
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 3D游戏引擎中常见的三维场景管理方法
对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...
- 【3D计算机图形学】变换矩阵、欧拉角、四元数
[3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算. 一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转 ...
- 3D数学基础(三)矩阵
3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...
- 3D数学基础 KeyNote 1
[计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...
- 3D 沙盒游戏之人物的点击行走移动
前言 在 3D 游戏中,都会有一个主人公.我们可以通过点击游戏中的其他位置,使游戏主人公向点击处移动. 那当我们想要实现一个"点击地面,人物移动到点击处"的功能,需要什么前置条件, ...
- 8个3D视觉效果的HTML5动画欣赏
现在的网页中应用了越来越多的3D应用,特别是基于HTML5 Canvas的动画特效,让用户有一种非常震撼的视觉体验.本文收集了8个非常炫酷的3D视觉效果的HTML5动画,都有源代码分享,你可以学习你感 ...
- 3D数学基础(二)向量
向量的基本运算包括加法.减法.点乘.叉乘.单位化运算等,而在游戏开发中使用最为广泛的是减法.点乘.叉乘.单位化运算.向量是具有方向和长度的矢量,有2D.3D.4D等的.在游戏开发里面一般使用的是2D和 ...
- Canvas 3D球形文字云动画特效
Canvas 3D球形文字云动画特效 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器 ...
随机推荐
- Python基础(5)--字典
字典由多个键及与其对应的值构成的对组成(把键值对成为项),每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典由一对大括号括起来.空字典由两个大括号组成:{} 本文地址:http:/ ...
- JAVA基础学习day27--反射机制
一.概述 1.1.概述 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态获取信息以及动 ...
- mysql 批量更新与批量更新多条记录的不同值实现方法
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = ...
- JavaScript Patterns 4.6 Immediate Object Initialization
( { // here you can define setting values // a.k.a. configuration constants maxwidth : 600, maxheigh ...
- mmap 与 read/write
mmap与read/write两条路线对文件的访问比较 我们知道无论是通过mmap或read/write访问文件在内核中都必须经过缓存, 当需要从文件读写内容时,都经过内存拷贝的方式与内核中的缓存进行 ...
- Eclipse報錯:Could not find or load main class
代碼正確,但在Eclipse中無法運行,一直報錯: Could not find or load main class
- cmd常用命令 和 sql server相关基础
在Java开发中 ms sql server 接触算是比较少的,本文记录一些ms sql server的基础知识. 1. 为表字段增加索引:create index user_openid on us ...
- 使用dbms_logmnr查看日志文件
大多为了寻找被意外修改的数据或者那条sql修改了哪些数据 如果是在线重做日志的话需要该日志是inactive模式下的 查询v$log和v$logfile获取相关信息 执行exec dbms_logmn ...
- SQL 报错信息整理及解决方案(持续更新)
整理一下自己遇见过的 SQL 各种报错信息及相应解决方法,方便以后查阅,主要平台为 Oracle: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值: 原因:插入操作时,数据大于字段 ...
- Vert.x入门体验
Vert.x入门体验 一.概述 Vert.x(http://vertx.io)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. 二.安装配置 访问Vert ...