Unity基础(五)四元数相关

一、欧拉角和四元数

1.欧拉角

transform.eluerAngles

Inspector中的角度就是欧拉角,可以从一个方向到另一个方向旋转大于180的角

同一旋转的表示不唯一(转90度和转90+360度的情况一样)。

欧拉角会出现万向节死锁的现象,当某个特定轴达到某个特殊值时, 绕一个轴旋转可能会覆盖住另一个轴的旋转,从而失去一维自由度。

Unity中x轴转动到90度会产生万向节死锁

2.四元数

transform.rotation

四元数的旋转不存在万向节死锁,而且四元数旋转后 转换后的欧拉角 始终是 -180~180度

所以用四元数来表示旋转信息。

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

对于给定旋转,假设绕着n轴旋转。

四元数=cos(B/2),sin(B/2)x,sin(B/2)y.sin(B/2)z;

轴角对初始化方法 四元数Q=Quatrnion.AngleAxis(角度,轴);

cs 复制代码
Quaternnio q=Quatrnino.AngleAxis(60,Vector3.right);
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = q;

二、四元数和欧拉角互相转换

欧拉角转四元数

cs 复制代码
Quaternion.Euler(x,y,z)
Quaternion q2 = Quaternion.Euler(60, 0, 0);
GameObject obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj2.transform.rotation = q2;

四元数转欧拉角

cs 复制代码
Quaternion q;
q.eulerAngles;

 print(q2.eulerAngles);

三 四元数的插值运算

四元数插值使用Slerp 不用lerp。

无限接近 先快后慢

cs 复制代码
A.transform.rotation = Quaternion.Slerp(A.transform.rotation, target.rotation, Time.deltaTime);

匀速变化 time>=1到达目标

cs 复制代码
time += Time.deltaTime;
B.transform.rotation = Quaternion.Slerp(start, target.rotation, time);

四、四元数相乘代表旋转四元数

欧拉旋转的表示不唯一,四元数旋转后, 始终是-180到180度,表示唯一。

四元数旋转就可以避免死锁。

单位四元数

cs 复制代码
Quaternion.identity
Instantiate(testObj, Vector3.zero, Quaternion.identity);

四元数相乘

两个四元数相乘得到一个新的四元数

代表两个旋转量的叠加,相当进行了一次旋转

cs 复制代码
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;

this.transform.rotation *= q;

rotation = rotation * q 世界轴q 的轴定义在世界空间)

rotation = q * rotation 自身轴q 的轴定义在局部空间)

追求的是Scene中的效果,不是inspector中的效果。inspector中的数据未必如代码逻辑如此

AngleAxis 指定的轴是在世界空间中描述的,但通过与当前旋转相乘,最终旋转效果相对于物体当前的姿态发生了叠加填入的是世界坐标系,但实际是按照物体的自身朝向旋转的。

五 LookRotation和LookAt方法比较

cs 复制代码
public Transform target;

void LookAtTarget()
 {
    Vector3 direction = target.position - transform.position;
    if (direction != Vector3.zero)
     {
    transform.rotation = Quaternion.LookRotation(direction);
    }
 }

LookRotation传入的是做差向量,不是目标物体位置。更底层的方法,可以用来控制看向的速度。

LookAt方法 是封装好的方法,自动做了差并应用旋转直接看向

cs 复制代码
transform.LookAt(target);

六、四元数乘向量

四元数乘向量返回一个新向量

可以指定将向量旋转对应为四元数的旋转量 相当于旋转向量

cs 复制代码
Vector3 v = Vector3.forward;
print(v);
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v);
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v);

保持顺序,四元数乘以向量,要将四原数写在前面。

相关推荐
五仁烧饼6 小时前
Unity Addressables 静默资源策略
游戏·unity·addressables
ue星空12 小时前
【Godot】更换编辑器外观主题
编辑器·游戏引擎·godot
fanfan_hongyun14 小时前
unity 与cad 坐标系映射
unity·游戏引擎
神码编程16 小时前
【Unity】 HTFramework框架(七十)MultiChoiceDropdown可多选的下拉菜单
unity·游戏引擎·ugui·dropdown·下拉菜单
ue星空17 小时前
Godot 2D像素游戏移动抖动、模糊问题解决方案
游戏·游戏引擎·godot
淡海水17 小时前
15-07-YooAsset面试篇-Unity性能优化与内存管理
java·unity·面试·性能优化·c#·游戏引擎
ue星空18 小时前
【Godot】AudioStreamPlayer2D音频播放
游戏引擎·音视频·godot
zhchyun20082 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(03)
unity
淡海水2 天前
15-02-YooAsset面试篇-Unity架构设计与源码
java·unity·面试·c#·游戏引擎·yooasset
郝学胜-神的一滴3 天前
中级OpenGL教程 030:gl_FragCoord解锁区域渲染与深度可视化新姿势
c++·unity·游戏引擎·图形渲染·unreal engine·opengl