Unity复杂的旋转-欧拉角和四元数

一.欧拉角
欧拉角最容易表示,用三个变量X,Y,Z可以直观的表示绕着某个轴的旋转角度。

在Unity里就是Transform组件的Rotation里的X Y Z三个变量代表了欧拉角

二.四元数
四元数相比于欧拉角就比较复杂了,由四个变量组成(在Unity中称为X,Y,Z,W),但是这些变量的值不代表旋转角度,所以可能给你一个向量(0。7,0,0,0.7)你并不知道实际旋转的角度,当然四元数的详细解释需要数学方面的深入研究,有兴趣的可以自行查找有关资料

因为在Unity没有可视化界面可以调整四元数(因为真的调了也不直观看到旋转的角度),所以我们只能用脚本来访问
三.脚本中内容
欧拉角如果在脚本中表示呢?
是不是想到之前图中的那个Rotation,那你是不是自然而然的想到了通过transform.rotation访问呢?如果你是这样想的,那就错了!
在Unity中transform.rotation代表的是四元数!附上官网证明!

那到底如何表示欧拉角呢?其实表示很简单,并附上官网解释

transform.eulerAngles =new Vector3(20,300,40);
1

当我们以上述代码运行后会发现Rotation中的Y值是-60,那是因为面板上的Rotation中的X Y Z值范围是在(-180,180),对于代码中超出的部分会自动进行计算映射到范围内

四元数的代码表示就是之前的transform.rotation,那你肯定会想欧拉角和四元数之前能否转换呢,知道其中一个的值,如果改变成对方呢?代码如下

//欧拉角->四元数
//通过Quaternion.Euler() 传递一个Vector3向量的欧拉角
transform.rotation = Quaternion.Euler(new Vector3(20, 300, 40));

//四元数->欧拉角
transform.rotation.eulerAngles;//对你没看错 直接可以转换获取
1
2
3
4
5
6
三.区别
欧拉角:
优点:三个角度组成,直观,容易理解
优点:可以进行从一个方向到另一个方向旋转大于180度的角度
缺点:死锁问题——万向节死锁 万向节死锁介绍
四元数
优点:不存在万向节死锁问题
优点:存储空间小,计算效率高
缺点:单个四元数不能表示在任何方向上超过180度的旋转。
缺点:数字表示不直观
四.常用API
Quaternion.LookRotation() 使其转向某个方向

函数传递的参数的一个Vector3的向量 这个向量表示的是要看向的向量,通常用目标的positon和自身的position进行相减求得此向量
Vector3 pos = target.transform.position - transform.position;
transform.rotation = Quaternion.LookRotation(pos);
1
2
是不是觉得和transform.LookAt()效果很像…

//和上面代码得到的效果相同
transform.LookAt(target.transform);
1
2
Quaternion.Slerp() 平滑进行转动动画

函数传递的参数分别是 当前GameObject的四元数、目标要转向的四元数 和 一个插值时间
我们看个例子
void LookAtTarget()
{
if (Input.GetKey(KeyCode.Space))
{
Vector3 dir = target.transform.position - transform.position;
dir.y = 0;//不让Player有y轴上的倾角
Quaternion target = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime);
}
}
1
2
3
4
5
6
7
8
9
10
我们将上述的LookAtTarget()方法放到Update()函数中进行执行
就可以看到平滑的转动

Quaternion.Lerp() 说实话个人用起来和Slerp()区别不大

图中红线框出来的就是区别:使用Lerp()进行旋转的速度较快,但是在旋转角度较大的时候,效果会糟一点。

Quaternion.RotateTowards()

传递两个四元数,和一个角度增量值,使第一个四元数逐渐趋近于第二个四元数并最终相等

void Update()
{
float step = 3 * Time.deltaTime;
transform.rotation = Quaternion.RotateTowards(transform.rotation,target.transform.rotation,step);
}
1
2
3
4
5
结果就是当前物体的四元数和目标的四元数相等

Transform.RotateAround()

传递一个参照点point、绕哪个轴转axis和增量角度angle
void Update()
{
float step = 3 * Time.deltaTime;
transform.RotateAround(target.transform.position,Vector3.up,step);
}
1
2
3
4
5

五.总结
差不多基础概念就这些了吧,如果要深入了解的话,建议还是看API,并且自己多动手尝试一下数据~
---------------------

原文地址:https://www.cnblogs.com/ly570/p/11060573.html

时间: 2025-01-16 00:38:04

Unity复杂的旋转-欧拉角和四元数的相关文章

刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)

最近学习了一些关于三维空间旋转相关的知识,借此梳理一下备忘. 三维空间的旋转(3D Rotation)是一个很神奇的东东:如果对某个刚体在三维空间进行任意次的旋转,只要旋转中心保持不变,无论多少次的旋转都可以用绕三维空间中某一个轴的一次旋转来表示.表示三维空间的旋转有多种互相等价的方式,常见的有旋转矩阵.DCM.旋转向量.四元数.欧拉角等.本篇文章主要梳理一下这些表示方式及相互转换的方法. 1. 欧拉角(Euler Angle) 最直观的表示方式是绕刚体自身的X.Y.Z三个轴分别进行旋转某个角度

三维空间旋转(欧拉角、四元数、旋转矩阵)

姿态角(欧拉角) 姿态角即RPY(roll, pitch,yaw)又叫欧拉角,是由三个角组成的. 俯仰角(pitch) 翻滚角(roll) 偏航角(yaw) 其中最直观的就是其绕刚体自身的X.Y.Z三个轴分别旋转的角度,这就是欧拉角(Euler Angle)表示方法. 需要注意的是,欧拉角的表示方式里,yaw.pitch.roll的顺序对旋转的结果是有影响的. 给定一组欧拉角角度值,比如yaw=45度,pitch=30度,roll=60度,按照yaw-pitch-roll的顺序旋转和按照yaw-

Unity脚本-Rotate旋转相关知识点

1,Transform旋转 transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0); transform.Rotate(Vector3.right * Time.deltaTime);//以欧拉角旋转,顺序是ZXY,right是向X轴旋转1度 transform.Rotate(0, 45, 0, Space.World);//绕世界坐标系的XYZ轴旋转,也就是其顶层父物体的坐标系,如果自身在顶层

欧拉角转四元数

二.欧拉角  欧拉角指的是:以世界坐标系为参考坐标系(一定记住是世界坐标系),使用x,y,z三个值来分别表示绕(世界的)x轴.y轴.z轴 旋转的角度量值.其取值是在[0, 360]间.一般用roll, pitch, yaw来表示这些分量的旋转值.因为是以世界坐标系为参考坐标系,因此每一次的旋转都不会影响到后续的旋转转轴.即:它无法表示任意轴的旋转. 一直以为  x轴是pitch   y是yaw ,z 是roll的,今天受到教训了,搞了很久 原来,x轴对应的roll,y轴对应的是pitch  ,z

【3D计算机图形学】变换矩阵、欧拉角、四元数

[3D计算机图形学]变换矩阵.欧拉角.四元数 旋转矩阵.欧拉角.四元数主要用于:向量的旋转.坐标系之间的转换.角位移计算.方位的平滑插值计算.   一.变换矩阵: 首先要区分旋转矩阵和变换矩阵: 旋转矩阵:向量绕某一个轴旋转,用3x3的矩阵表示. 变换矩阵:向量的移动.旋转.缩放,用4x4的矩阵表示. 这里额外补充一个知识,就是三维坐标变换是用4x4矩阵(采用齐次坐标)而不是3x3矩阵的原因是:统一平移和缩放(本来是向量加法来描述)为矩阵乘法的形式来计算.所以旋转矩阵也扩展为4x4矩阵,这样一来

旋转矩阵、欧拉角、四元数理论及其转换关系

博客转载自:http://blog.csdn.net/lql0716/article/details/72597719 1. 概述 旋转矩阵.欧拉角.四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的复杂度. 本文主要介绍了旋转矩阵.欧拉角.四元数的基本理论及其之间的转换关系. 2.原理 2.1 旋转矩阵 对于两个三维点 p1(x1,y1,z1),p2(x2,y2,z2),由点 p1 经过旋转矩阵 R 旋转到 p2,则有 注:旋转矩阵为正交矩阵RRT=E 任意旋转矩阵: 

飞控姿态解算中,欧拉角与四元数之间的转换

//欧拉角转四元数 void cjx_from_euler(float roll, float pitch, float yaw) { float cr2 = cosf(roll*0.5f); float cp2 = cosf(pitch*0.5f); float cy2 = cosf(yaw*0.5f); float sr2 = sinf(roll*0.5f); float sp2 = sinf(pitch*0.5f); float sy2 = sinf(yaw*0.5f); q1 = cr2

Matrix4x4矩阵变换、欧拉角转四元数、角度转弧度

Matrix4x4 1 // 重置矩阵 2 void MatrixIdentity(float m[4][4]) 3 { 4 m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; 5 m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[1][3] = 0; 6 m[2][0] = 0; m[2][1] = 0; m[2][2] = 1; m[2][3] = 0; 7 m[3][0] = 0; m[3][1] = 0;

(转)三维旋转:旋转矩阵,欧拉角,四元数

如何描述三维空间中刚体的旋转,是个有趣的问题.具体地说,就是刚体上的任意一个点P(x, y, z)围绕过原点的轴(i, j, k)旋转θ,求旋转后的点P\'(x\', y\', z\'). 旋转矩阵 旋转矩阵乘以点P的齐次坐标,得到旋转后的点P',因此旋转矩阵可以描述旋转, ?????x′y′z′1?????=R??????xyz1?????[x′y′z′1]=R?[xyz1] 绕x,y,或z轴旋转θ的矩阵为: Rx(θ)=???1000cosθsinθ0?sinθcosθ???Rx(θ)=[1