unity初识之Quaternion和旋转

与之前做2d游戏不一样,3d游戏中,角度变换,用四元数来表示和计算

什么是欧拉角

四元数

欧拉旋转

一个女生的文章

unity对于四元数的定义

在学习3d数学或者学习shader的书籍里,都会有一章是先学下向量,矩阵的知识。矩阵的几何意义是变换,几种变换里用的多的也是unity的Transform组件中用到的:平移,旋转(rotation),缩放(scale)。
缩放和旋转是一个线性变换(Linear transform ) ,指那些可以保留矢量加和标量乘的变换 数学公式表示可以是 f(x) + f(y) = f(x+y) kf(x) = f(kx)
平移是一种非线性变换。

旋转是其中最为复杂的一种。

要表示一个物体的方位,最少得有三个数来表示,两个数只能表示一个方向。而且描述物体的方位时,不能使用绝对量,与位置只是相对于某个已知点(比如坐标系原点)的位移一样,方位时通过相对已知方位的旋转来描述的,旋转的量叫做角位移。之前做的游戏里,也是整个游戏世界有个坐标系,以它的原点为基础,有各自物体的位置,旋转相对于坐标原点的描述。然后物体内的孩子又以物体的位置作为坐标系的原点,描述自己的状态。

描述坐标系中方位的方法

### - 矩阵形式。

比如3x3矩阵,第一行代表 x方向的x , y z 值, 第二行代表y方向的,第三行表示z方向的,三行一起可以表示该物体所处的方位。
优势是:
可以立即进行向量的旋转。其他描述方式做不到。
矩阵的形式被图形api所使用。 也就是不管程序里用什么方式来表示方位旋转,最后在底层或者显卡那交互的都是矩阵。类似很多游戏引擎会让开发者用不同的语言来写逻辑,比如Untiy可以用unity-javascript和c# ,但编译后会变成IL语言,egret里用TypeScripte写逻辑,编译后都会转成javascript代码。ts比js多了面向对象的内容,更方便些,灵活性更高。
多个角位移连接,我理解为可以在两个坐标系之间转换只能使用矩阵,而在程序中描述和存贮如果用别的形式的话,最后在转换坐标系的时候,只有都变成矩阵来操作。
矩阵的逆,旋转矩阵是正交的,如果想求角位移的反向,直接用矩阵的转置就可以求得了,不用计算矩阵的逆了。

 缺点是:
 矩阵占据更多内存。3x3矩阵,就是9个数,代表一个方位,如果是动画的话,一帧中如果做旋转操作,并且算上骨骼旋转,皮肤旋转,量很大,何况一个动画会有很多帧。
 难于使用。矩阵是用的向量,都是-1到1之间的值,人类平时描述都是角度。
 矩阵可能是病态的,可能有冗余。

### - 欧拉角形式。

 基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。用欧拉角是有顺序的,比如untiy中,x,y,z分别为right,up,forward 。  也就是比如旋转一个x , y ,z都转的角度,是先转一个,再转一个,再转最后一个。如果顺序改变,有可能最后的结果是不一样的(例子******)。     具体欧拉角顺序是什么,有个约定叫 “heading,pich,bank”,也就是Untiy中对应的约定,heading 也就是up,y轴,    pich就是right  x轴,   bank就是 forward,z轴。
 ![这里写图片描述](https://img-blog.csdn.net/20180302193130776?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTI3MDI3NDk3OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 
  优点:
 使用容易,使用的参数全都是角度的形式。在cocos和egret这些2d引擎中,之前做2d游戏,设置rotation也是直接就用的角度。
 最简洁的表达。3d中描述一个方位,不能少于3个数,欧拉角只有3个。
 任意三个数都是合法的。

缺点:
给定方位的表达不唯一(举例**)。 最简单的一种,一个角度加360°的倍数,虽然最终表现的方位没有变,但是数值变了。第二种,x,y,z的分别的旋转角度相互作用后,后影响最后的结果。比如,x轴转135度, 就跟y转180度,x转45度,z转180度结果显示一样。规避的方法是,限制传入的角度的范围来保证某一个方位是独一无二的。
另一个问题就是,万向锁 (一个对万向锁的解释http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html) 不可避免
两个角度求差值困难。也是两个问题。第一个没有限制角的情况下,比如720° 和45°的差值,其实只有从0°到45°,但是却相当于绕了将近两圈。
这里写图片描述
第二个就是在限制角的情况下会按照远的算,而不是按进的算,比如,角度限制在-180到+180之间ÿ

  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值