BZ易风

导航

 

欧拉角

由三个角度(x,y,z)组成,在特定坐标系下用于描述物体的旋转量

通俗的说,空间中任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列

旋转序列

heading-pitch-bank:

先转Y轴 按照惯性坐标系

再转X轴 按照物体坐标系

再转Z轴 按照物体坐标系

Quaternion q1 = new Quaternion(0,-Mathf.Sin(45*Mathf.Deg2Rad),0,-Mathf.Cos(45*Mathf.Deg2Rad));

获取欧拉角

Inspector调节的rotation就是欧拉角

transform.eulerAngles = new Vector3(1, 1, 1);       //x,y,z的旋转角度

优点

直观,容易理解

万向节死锁

四元数

在3D空间中,任意旋转都可以表示绕着某个轴旋转一个旋转角得到

对于给定旋转,假设为绕着n轴,旋转θ度,n轴为(x,y,z),那么可以构建四元数:

  • W=cos(θ/2)
  • X=sin(θ/2)*cos(a)
  • Y=sin(θ/2)*y
  • Z=sin(θ/2)*z
  • x,y,z在xyz方向上的偏移量(分量)
  • 如果旋转没有分量a=0°  cosa=1
  • 公式可以简写:W=cos(θ/2)
  • X=sin(θ/2)
  • Y=sin(θ/2)
  • Z=sin(θ/2)

Quaternion

Unity中用来表示四元数的结构体

轴角对

公式:

  • W=cos(θ/2)
  • X=sin(θ/2)
  • Y=sin(θ/2)
  • Z=sin(θ/2)

API

Quaternion.AngleAxis

Quaternion q=Quaternion.AngleAxis(90,Vector3.up); //第一个参数是角度,第二个参数围绕哪个轴旋转,旋转方向遵守左手定则

欧拉角和四元数的转换

欧拉角转四元数

Quaternion.Euler(x,y,z)

Quaternion q=Quaternion.Euler(0,90,0);//绕着Y轴旋转90°

四元数转欧拉角

q.eulerAngles

Vector3 angle=q.eulerAngles;   //欧拉角是Vector3

负四元数

四元数q[x,y,z,w]

负四元数-q[-x,-y,-z,-w]

几何意义

q与-q所代表的旋转量是相同的

单位四元数

两个

-1[0,0,0]

1[0,0,0]

几何意义

表示没有旋转量的四元数

API

Quaternion.identity

四元数叉乘

四元数*四元数=四元数

几何意义

将两个四元数的旋转量进行叠加,等到一个新的四元数

Quaternion q1= Quaternion.AngleAxis(-30,Vector3.up);
Quaternion q2= Quaternion.AngleAxis(-60, Vector3.up);
Quaternion q3 = q1 * q2;

四元数*向量

四元数*向量=向量

几何意义

将向量按照四元数的旋转量旋转,得到一个新的向量

注:只能是四元数*向量,不能是向量*四元数

四元数插值

Quaternion.Slerp

几何意义

四元数插值计算得到的是form与to之间的插值旋转量

LookRotation

意义

任意一个物体在朝向世界的正前方,也就是Z轴方向,通过旋转使其物体朝向目标向量

LookRotation计算的就是旋转所需的旋转量

posted on 2021-01-05 17:54  BZ易风  阅读(76)  评论(0编辑  收藏  举报