[3D数学基础:图形与游戏开发]读书笔记 第10章(3D中方位与角位移)
第10章 3D中方位与角位移
3D中有很多方法来描述方位和角位移,本章将主要讲解的是,矩阵、欧拉角、四元数
,需要了解到其优缺点、工作原理,在不同情况选择最合适的描述,转换等
矩阵形式
- 优点
利用矩阵可以在物体和惯性坐标系间旋转向量
矩阵形式被图形API所使用
多角位移连接:知道A关于B的方位和B关于C的方位,利用矩阵可以知道A关于C的方位
矩阵的逆,撤销操作,旋转矩阵是正交的,所以可以很方便的求得逆矩阵 - 缺点
矩阵相对于欧拉角的三个数占用内存很大
不直观
矩阵可能是病态的
矩阵存在六阶冗余,矩阵描述方位,行必须为单位向量并且互相垂直
欧拉角
- 书中称为
heading-pitch-bank
分别代表y-x-z
,正方形由原点沿着方向看,逆时针
为正方向 - 缺点:
给定方位,表达式不唯一,具体表现为heading转360方位没有改变,数值却改变了
万向锁
先heading=45、pitch=90的结果和pitch=90、bank=45的结果相同(这个可以自己拿个东西试试),定义:角度为正负90的第二次旋转,使得第一次和第三次旋转轴相同
两个角度求插值特别困难,具体情况如,在没有进行欧拉角限制时,A=720,B=45,从A->B其实真实插值为45,但是直接插值就会旋转2圈多,但是限制欧拉角依然会产生问题,如下图,A和B只相差了20,但是A->B会绕大圈而不是小圈,解决这个问题可以将插值的角度限制在-180~+180
四元数
- 这个是大佬写的四元数讲解
- 四元数可以记为:
[w, v]
,展开为[w, (x, y, z)]
- 四元数与复数 记为:
a + bi
a为实部,b为虚部,并且满足一下计算
- 共轭复数
a + bi
和a - bi
互为共轭复数 - 复数的模
复数在2D平面上表现
首先认为在存在一个实轴和一个虚轴,具体如下
四元数
- 3个虚部 i、j、k
- 四元数任意角位移都有2个四元数表示,他们互为负,所以也存在2个
单位四元数
, - 四元数的乘法也就是叉乘和上面乘法一样
四元数的逆
就是其共轭复数除以他的模
四元数进行旋转
四元数的差
利用四元数的乘和逆,可以求得四元数的差,差定义为从一个方位到另一个方位的角位移
四元数的点乘
四元数点乘公式:[w1, v1]·[w2, v2] = w1w2 +v1v2
,其绝对值越大代表2个角位移越相似
四元数的对数、指数和标量的乘法(公式太多用到再补进来)
四元数的幂
- 当四元数q代表角位移,如果想得到1/3的角位移,可以使用q1/3q^{1/3}q1/3表示,
当四元数q等于绕x轴旋转30度
,那么q2q^2q2就代表绕x轴旋转60度
以此类推。注意:四元数是绕小圆弧
,所以q4q^4q4并不是绕x轴旋转240度,而是绕x逆方向旋转
四元数的 “Slerp”
- “Slerp” 球面线性插值,函数定义
slerp(q0, q1, t)
- 如何得到计算公式呢?分下面3个步骤
– 首先计算四元数q0和q1的差值,可以通过上面的公式 插值qΔ=q0−1q1q\Delta = q0^{-1}q1qΔ=q0−1q1,这里的q0−1q0^{-1}q0−1可以通过四元数逆公式计算
– 然后计算插值的一部分,这里可以通过四元数的幂计算
– 最后加上插值的一部分,这里可以通过四元数乘法计算
最后得到公式 slerp(q0,q1,t)=q0(q0−1q1)tslerp(q0, q1, t) = q0(q0^{-1}q1)^tslerp(q0,q1,t)=q0(q0−1q1)t,而真正的实际用途中,将会在4D球面的弧形插值(想象成2D弧形插值就行了),具体后面代码中体现
四元数样条 “Squad” 用来描述控制点间的路径,这个在这本书超纲了,暂不讨论
四元数优缺点
- 提供平滑插值
- 快速连接和角位移求逆,矩阵同样可以实现,但是四元数可以更加快速方便求出
- 和矩阵转换更加快速,四元数转换到矩阵形式相较于欧拉角转换为矩阵形式更加快速
- 仅仅使用了4个数,矩阵使用了9个数
各方法比较
- 欧拉角虽然有很多问题,但是易用性不能被忽略,如果将易用性牺牲而优化将得不偿失
- 如果需要在各个坐标系之间转换,还是用矩阵好点
- 当需要保存大量方位数据(如动画)时,就使用欧拉角或者四元数,但是四元数转换成矩阵更加快速
- 平滑插值只能用四元数完成,如果用其他形式,可以转换为四元数后插值完毕,再转换回来
表达式之间的转换
- 最后讨论的是欧拉角、四元数、矩阵如何互相转换
欧拉角到矩阵的转换
- 欧拉角描述了一个旋转序列、分别计算出每个旋转矩阵再连接就可以转换成代表这个角位移的矩阵了
- 第8章学了,物体坐标系转换到惯性坐标系的矩阵,这个矩阵是旋转坐标系,那么角位移就是旋转坐标系矩阵的严格相反。旋转序列heading-pitch-bank分别代表y-x-z轴的旋转,刚好是旋转y、x、z轴坐标系矩阵的相反
- 角位移矩阵(惯性->物体)为:HPBHPBHPB,旋转矩阵是正交(逆矩阵就是转置矩阵)的所以 物体->惯性矩阵=B−1P−1H−1B^{-1}P^{-1}H^{-1}B−1P−1H−1,HPBHPBHPB如下
从矩阵到欧拉角
根据上面求的从欧拉角转换矩阵,计算出heading-pitch-bank各个旋转角度就是欧拉角的值h、p、b
m23=−sinpm_{23} = -sinpm23=−sinp求得 p=asin(−m23)p=asin(-m_{23})p=asin(−m23),得到了p的角度,cospcospcosp就可以得到进而算出其他两个角度(公式比较多,具体的到后面章节代码里展开)
从 四元数到矩阵 和 从矩阵到四元数
- 这里公式推导同样复杂,后面需要推导时再推
从欧拉角到四元数
- 后面再看,公式头疼呀
[3D数学基础:图形与游戏开发]读书笔记 第10章(3D中方位与角位移)相关推荐
- [3D数学基础:图形与游戏开发]读书笔记 第9章(矩阵的更多知识、行列式、逆、正交矩阵、4x4齐次矩阵)未完待续
第9章 矩阵的更多知识 矩阵的行列式 任何一个方阵都存在一个标量,称为行列式,非方阵的行列式是未定义的 2x2矩阵行列式 3x3矩阵行列式 余子式 从M去除第i行和第j列剩余的矩阵,代数余子式是标量 ...
- 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
- 3d数学基础图形与游戏开发第二版_游戏开发完整学习路线,都在这里了
在软件开发中,游戏开发这个方向看起来目标很明确,但其实是个领域很广的方向,入门的时候如果得不到指点一二,很容易误入歧途,相反,如果走这条路之前能得到前人的一些指路,是可以事半功倍的. 平台与编程语言选 ...
- 3D数学基础:图形与游戏开发---随笔三
多坐标系 3.1 为什么要使用多坐标系? 不同的情况下使用不同的坐标系更加方便.(定义一个坐标系是为了我们方便描述一件事情,而在不同的领域它有不同的作用,比如相对论) 3.2 一些有用的坐标系 世界坐 ...
- 3D数学基础:图形与游戏开发---随笔二
笛卡尔坐标系统 笛卡尔不仅创立了解析集合,将当时完全分离的代数学和几何学联系到一起,还在回答"怎样判断某件事物是真的?"这个哲学问题上迈出了一大步,使后来的一代代哲学家能够轻松起来 ...
- 3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...
2019最新1850款组文字LOGO动画预设,一键生成! 包含图形元素/字幕/logo/动画转场/背景等 所有的元素都支持AE和PR 所有元素的 颜色.位置.大小.文字.Logo等 都可以修改,包含G ...
- 3d数学基础:图形和游戏开发(第2版)_人教版五年级数学上册教学计划进度表
文末有打印资料的方法 往期回顾: 统编版五年级语文上册第1课<白鹭>视频+课件+练习 统编版五年级语文上册第2课<落花生>视频+课件+练习 统编版五年级语文上册第3课<桂 ...
- 3D数学基础:图形与游戏开发---随笔五
向量运算 5.1 线性代数与几何 数学中专门研究向量的分支称作线性代数. 5.2 符号约定 变量是代表未知量的占位符.本书用不同的字体来区分不同的变量: 标量,用斜体的小谢罗马或者希腊字母表示,如a. ...
- 3D数学基础:图形与游戏开发---随笔四
向量 向量是2D.3D数学研究的标准工具. 4.1 向量--数学定义 对数学家而言,向量就是一个数字列表,对程序员而言则是另一种相似的概念--数组.数学上,一个向量就是一个数组. 数学上,区分向量和标 ...
- 3D数学基础:图形与游戏开发---随笔一
简介 1.1 什么是3D数学 3D数学是一门和计算几何相关的学科,计算几何则是研究用数值方法解决几何问题的学科.这两门学科广泛应用于那些使用计算机来模拟3D世界的领域. 1.3 阅读本书需要的基础知识 ...
最新文章
- BCH生态:用价值创造价值
- python第二阶段 第六天 模块
- JSP实现停车场收费管理系统
- DropDownList 控件不能触发SelectedIndexChanged 事件的另一个原因
- 推荐系统--矩阵分解(5)
- linux图形界面 革命,Windows 95带来的革命
- 使用 Spark ML Pipeline 进行机器学习
- 鹿晗都有 AI 粉了,为什么 AI 换脸剧的效果还这么渣?
- [转载] python的变量和C++的变量有什么区别
- 千亿级数量下日志分析系统的技术架构选型
- Yandex插件使用说明——Slager_Z
- ANC 调试 -FF 降噪原理和调试
- 与朋友谈心,也是与自己谈心
- HTML超文本语言(1)
- windows如何使用bat快速安装计划任务?
- vue实现鼠标拖拽div滚动效果-vue-dragscroll(整理)
- (二)RFB协议具体通信说明
- Nett源码剖析ServerBootstrap的设置2021SC@SDUSC
- 微信小程序 之 原生开发
- Google入门到精通(搜索方法经典)