Direct3D-3 四元数
其实本来这篇文章是打算接上篇的各种变化矩阵的推导了,想了想,还是先讲四元数吧。本人的文章并不会提到欧拉角,因为我自己没弄懂欧拉角的万向锁问题。
很多人学习数学时,会有这样一个疑惑,这东西有什么用。那四元数是用来干什么的。四元数是由哈密顿在1843年发现的,但是直到1985年Shoemake才将其引入计算机图形学,四元数的作用极其简单,用来表示3D物体的方位及旋转
一个3D物体放在世界中,只有一个位置坐标是不够的,这样意味着他总是朝着某一个方向。比如说,我们的头,我们可以摇头,点头,左右卖萌。在三个方向上有3个不同的旋转角度,来确定这个物体的摆向
但是这不意味着描述方位和旋转只需要3个量就可以了吗,为什么是四元数而不是三元数?至于这个问题,我不讨论,事实上用3个角度描述方位的办法叫做 "欧拉角"。欧拉角带有各种天生的缺陷,他唯一的优点是比四元数节省(32bit?)。这种形式上的内存节省毫无必要,xnamath的数学库里用的最多的还是xmvector,4个float。但是问题是我们怎么用4个量来描述3个轴上的问题,当然,这时候要请动数学出山
理解四元数并不需要真的在3D中去理解,我们可以降维到2D中,2D中是什么,2D中是复数,复数这东西想必大家都学过,也了解各种各样的运算法则,但是你可能错过了复数的一些有意思的地方,容我讲解
(基础的复数知识请自习补充)
复数在复平面中是一个点,所以我们可以使用极坐标来表示

我们现在 把两个复数乘起来,但是是以极坐标的方式,
,
我们使 R2 = 1,
,事实上这个式子表示了 绕z1旋转 θ2度的结果!如下图所示
事实上
,一个复数乘上一个单位复数(模等于1)的结果等于该复数绕单位复数与x轴所成的角度旋转,我们把Z2 作用到了Z1 上面,那么如此同理的结论我们可以推到四元数上面,让我们来看看四元数是在怎么定义的.
四元数和复数差不了太多,唯一的区别是他有三个虚部,他和复数的运算规则大同小异,下图是他的数学定义

那么最重要的当然是两个四元数相乘:

一些其他的数学操作:

当然,我们用其表示旋转的时候,是个单位四元数,其模等于 1,也就是说可以写成下面这种形式

我们还可以根据欧拉公式推出log和pow运算
这样推出

上面的两个公式的意义不大,因为我学习四元数的时候压根没学到过这个,不过也可以作为补充了。
有人会对下面这个式子表示疑惑,这个Uq是什么,还有φ是多少度,给张直观的几何图帮助大家理解


这个变换实际上是绕着这个轴旋转了两倍的角度
当然还有一个细节是,与复数不同的是,旋转并不是只乘上一个四元数就可以收工了的,而是这样的:
,但是比较难的一点是我们不能从需要绕Uq轴旋转两倍角度推导出这个式子,而是要从这个式子推导出这个P旋转了两倍角度这样一个事实。对了,还忘记了没讲Uq是怎么推导的。现在给出一下
解:
因为
是个单位向量,所以
,这表明了
。值得注意的是旋转角度只需要从0-π就行了。事实上就是我们找一个映射 f =
,从区间[0,π] → 区间[-1,1].我们很容易能找到这样一个函数,那就是cos θ,故
= cos θ

再根据三角公式
可以推出
.于是很显然的,我们可以推出 Uq,也就是旋转轴


(这里的n 就是 Uq) 
当然,共轨就可以是
。
让我们回到开始的那个式子,构造一下这个乘积
。为了简单化,我们让p的第4分量等于0,这表示他是个点

实数部分非常简单,算出来的结果妥妥的是 0 ,不信的话自己可以代入计算
。但好像还是有一部分智商拙计,还是给出推导过程吧
因为
正交,所以
。不要问我为什么正交。
虚数部分的式子更长一些,还是给出比较好,当然大家能自己再运算一到是再好不过的,没有扎实的数学基础,可很难学好图形学哦
至此,我们已经得到了结果
,再和
代入计算
再和
代入计算
。事实上。我们需要借组一个现有的公式,就是绕n旋转v的公式是什么
。事实上,可以看出,就是旋转了2倍 角度。至于
是怎么来的,以后再说吧
这一小节暂时到此结束,下一节将讲述 四元数与其对应矩阵的相互转换,已经矩阵的相关知识。附加四元数插值,还有一些变换的特性
如有错误,请大家批评指出,本文章公式的图片来自Introduction to 3DGame Programming with DirectX11 和Real-Time Rending
Direct3D-3 四元数的更多相关文章
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 【转载】四元数-Quaterion
原文:四元数-Quaterion 四元数(Quaterion) 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 ...
- 使用四元数解决万向节锁(Gimbal Lock)问题
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...
- CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换
CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换 三维世界里的旋转(rotate),可以用一个3x3的矩阵描述:可以用(旋转角度float+旋转轴vec3)描述.数学家欧拉证明了这两种形式可 ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
- Direct3D设备管理器(Direct3D device manager)
这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第一篇,英文原址:https://msdn.microsof ...
- 学习和研究下unity3d的四元数 Quaternion
学习和研究下unity3d的四元数 Quaternion 今天准备学习和研究下unity3d的四元数 Quaternion 四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示 ...
- [ZZ] A Proposal For Compiling Direct3D HLSL With LLVM (Written by Michael Larabel )
http://www.phoronix.com/scan.php?page=news_item&px=OTI2NA Note: Something very instersting to w ...
- 【译】Import Changes from Direct3D 11 to Direct3D 12
译者:林公子 出处:木木的二进制人生 转载请注明作者和出处,谢谢! 这是微软公布的Direct3D 12文档的其中一篇,此翻译留作学习记录备忘,水平有限,错漏难免,还望海涵. 原文链接是https:/ ...
- Unity四元数小问题整理
1.Unity中,四元数不能保存超过360度的旋转,所以如此大范围的旋转不能直接两个四元数做插值(当你用0度和721度的四元数做插值,它只会转1度,而不会转两圈). 2.要把旋转设置成某个方向,用Lo ...
随机推荐
- linux 系统常用命令
临时性的完全关闭防火墙,可以不重启机器: #/etc/init.d/iptables status ##查看防火墙状态 #/etc/init.d/iptable stop ...
- 第二百七十七天 how can I 坚持
开玩笑要有个度,哎,或许这就是缘分,很容易受别人影响吗? 中国人为什么会经常抱怨,不抱怨,挺好. 睡觉,红颜祸水,老婆是要能一起 生活的,不是失去,是上天在帮我,哈哈.
- CSS 去掉IE10中type=password中的眼睛图标
在IE10中,input[type=password],如果我们输入内容后,内容会变成圆点,这与以前一样,但后面多了一个眼睛图标,我们鼠标移过去按下会出现输入内容.有时我们想去掉这功能.IE10允许我 ...
- HTML中RGB颜色查询对照表
RGB颜色查询对照表 因为兼容性问题,色阶板功能只能在IE浏览器中运行 RGB颜色对照表 #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 #FFFAFA ...
- JQuery学习使用笔记 -- JQuery插件开发
内容转载自 http://www.css88.com/archives/4821 扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间.这篇文章将概述jQuery插件开发的基本知识,最 ...
- 《数据通信与网络》笔记--SCTP
SCTP(stream control transmission protocol)是一种新的可靠的,面向报文的传输层控制协议.它兼有UDP和TCP的特性,它是可靠的面向报文的协议,它保存报文的边界, ...
- SOS 调试扩展 (SOS.dll)
http://blog.csdn.net/cslie/article/details/2158780 SOS 调试扩展 (SOS.dll) 提供公共语言运行时(CLR)内部环境的有关信息,帮助你在Wi ...
- python的sys.path
python检测不到模块: No module named 是因为模块没有在sys.path中,查看sys.path的方法 import sys sys.path 发现确实没有加载到模块. windo ...
- matlab eps中文乱码的解决方法
直接存成eps总是乱码 最优解决方法是matlab print 保存成jpg,之后用adobe acrobat pro 打开jpg文件另存为eps
- 配置 Spring 的声明式事务
<!-- 1. 配置事务管理器 --> <bean id="transactionManager" class="org.springframework ...