浅析Unity中的四元数

最近在讲四元数的时候感觉有点乱,所以根据网上的一些四元数知识又整理了一下。

什么是四元数:

简单的理解就是旋转角度的另外一种表现方法,属于一种四维空间,在三维空间中旋转角度我们可以使用三个值(x,y,z),在Unity中我们叫做欧拉角,但是使用四元数旋转角度需要使用四个值(x,y,z,w)。

为什么要使用四元数:

当我们使用欧拉角描述角度旋转,在三维空间中控制物体的旋转的时候容易发生万向锁。

什么叫万向锁:

Unity中演示,将一个Cube X轴旋转90度,这时候再旋转cube的y轴和Z轴发现两个轴的旋转一样了,也就是两个轴重合了,这种情况就叫做万向锁

浅析Unity中的四元数_第1张图片

 

万向锁的形成原理,视频演示

https://www.bilibili.com/video/av76536794?from=search&seid=4713205100850743699

为了解决这种问题,所以要使用四元数旋转

四元数的转化:

首先四元数属于一种超复数

简单理解超复数:

实数:分为有理数和无理数(有理数:整数和分数。无理数:无限不循环小数π)

虚数:平方是负数的或根号内是负数的数 即 i^2=-1

复数:实数+虚数(把形如z=a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部)

超复数:(x,y,z,w)四个值分为三个虚部,一个实部

四元数的转化过程可以参考以下链接

https://www.cnblogs.com/rainbow70626/p/5348725.html

在Unity中使用时,找到重点的几句话

浅析Unity中的四元数_第2张图片

 

 

所以如果没有在xyz轴的分量,那么 cos 0=1;

所以公式可以简写为:

X=sin(α/2)

Y=sin(α/2)

Z=sin(α/2)

W=cos(α/2)

可以在Unity中测试

如果想让Cube在场景中沿着z轴旋转60度,那么得到的代码为

	void Start () {
        transform.rotation = new Quaternion(0,0,Mathf.Sin(30*Mathf.Deg2Rad),Mathf.Cos(30*Mathf.Deg2Rad));
	}

运行程序,发现Cube在z轴旋转了60度,说明公式成立,其实这就是一个将四元数转化成Euler的过程,至于转化过程中具体的公式可能太复杂,如果是初学者的话建议可以直接使用Quaternion.Euler.

 

 

你可能感兴趣的:(Unity3D,C#)