您的位置:首页 > 移动开发 > Unity3D

Unity 3D 矩阵和四元数的研究

2017-02-15 13:18 281 查看
版本:unity 5.4.1  语言:C#

 

2017年了,使用Unity也有一段时间了,略有心得吧,基本上要求一些功能可以拼拼凑凑地做出来,算是入门了吧。

 

不过很多游戏上使用的技术还没有接触过,比如protobuf、热更新、Shader之类,今年的一开始接触一下游戏中常用的技术,然后Shader方面好好入门一下。当然好早之前的3D游戏开发大师也会在今年早期看完。

 

暂定这些目标吧,好好磨练一下技术。

 

今天给大家带来的是矩阵和四元数,首先矩阵说实话在Unity今天还是第一次,找Api都花了点时间,不过使用下来还是挺容易的,跟代数很像。

 

首先是最简单的平移矩阵:(看的实战核心技术,不过书里很多矩阵都是错的)

1   0     0    0

0   1     0    0

0   0     1    0

Tx  Ty  Tz  1

 

Tx、Ty、Tz是x、y、z轴移动的数值,具体使用的话,使用Matrix4x4 mat = new Matrix4x4();创建矩阵对象,然后乘以new Vector4(x, y, z, 1f)表示的三维坐标,获得的Vector4就是移动后的坐标。后面的矩阵也都是这个原理,就不会再赘述了。

 

缩放矩阵:

Sx  0   0   0

0   Sy  0   0

0   0   Sz  0

0   0    0   1

 

x轴旋转矩阵:

1   0           0          0

0   cos(a)  sin(a)  0

0   -sin(a) cos(a)  0

0   0           0          1

 

y轴旋转矩阵:

cos(a)  0       -sin(a) 0

0          1       0           0

sin(a)  0       cos(a)  0

0          0       0           1

 

z轴旋转矩阵:

cos(a)  -sin(a) 0    0

sin(a)  cos(a)  0    0

0          0          1     0

0          0          0     1

 

以上就是常用的几个矩阵了。

 

四元数其实有点像是矩阵的效果,不过计算更加复杂难以理解,我这边参考了candycat的教程给出几个结论。

 

四元数的表示为(v, w),其中v类似是一个三维坐标。

 

单位长度的一个旋转轴(x, y, z)和角度a,则对应的四元数为((x, y, z)*sin(a/2), cos(a/2)) 。

 

创建四元数的几种方法:

Quaternion.Euler(Vector3)  以欧拉角创建四元数

Quaternion.AxisAngle(Vector3,float)  相对于某个方向旋转某个角度的四元数

Quaternion.FromToRotation(Vector3,Vector3)  起始方向到结束方向的四元数

Quaternion.LookRotation(Vector3)  朝向为正方向,旋转轴为上方向,旋转到想要方向的四元数

 

使用四元数:

operator*  四元数相乘,旋转累积

operator*  Vector3左乘四元数,点旋转到对应点

Lerp  线性插值

Slerp  球形插值

LerpUnclamped  非钳制线性插值,可以突破0和1的界限

SlerpUnclamped  非钳制球性插值,可以突破0和1的界限

 

欧拉角的旋转:

Transform.Rotate(Vector3)  就是transform的3个值,需要注意的是如果设置x为90度,则移动其他的纬度都会改变y,这就是万向节锁。

 

常用的方法估计就以上几个,如果后面有好用的方法,我还会再补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: