《Unity》 向量四元数以及常用数学公式

Unity旋转与四元数详解
本文详细介绍了Unity中四元数的使用方法及其在旋转操作中的应用,包括Quaternion的各种方法如AngleAxis、FromToRotation等,以及如何通过四元数实现物体的精确旋转。

这个东西不理解也就算了,每次还都不会使用,烦死了,这次记录一下。
Quaternion.AngleAxis(角度,沿axis轴)方法
返回一个旋转,意义是绕axis轴旋转angle

Quaterion*Quaternion
在lq的旋转状态下进行rq的旋转意义

Unity当中的旋转方向(世界坐标系是左手坐标系)
y: 正是往右边旋转
x: 正是下面旋转
z: 正是往左边旋转

速度*时间=某时移动矢量

为了确保同时按下w和d移动速度不变(因为两个方向的速度矢量肯定最后向量长度会变成根号2),可以把移动向量Normalize化

Vector3.Normalize()
静态方法:使向量的长度为1

Quaternion*Vector3
返回Vector3,意义是让Vector3旋转一个q的角度然后返回新的向量。

Quaternion.FromToRotation(v1,v2)
创建一个从v1到v2的旋转

Mathf.Acos(cos值)
返回弧度

Quaternion.AngleAxis(角度,axis)
绕axis轴旋转angle,创建一个旋转,角度是矢量

q1.RotationTo(q2)
返回一个旋转,目标是让原始旋转q1 能够转向 q2。

q.Right() 以及 q.Foward()
意义跟v.Right(),v.Forward() 是一样的,代表物体当前旋转的right,forward局部方向向量。

q.Inverse()
返回反向的旋转。 沿y正45,反着就是负45了。

transform.right
在想想transform.方向这种东西,代表的是物体的局部right轴或者up轴,在物体什么旋转都没有的时候,当然就代表跟世界的是一样的,例如Vector3.right,当然经过一个矩阵的旋转之后,例如绕y旋转,right轴也会受到影响,自然Vector3.right*旋转矩阵计算出来的新的right轴就是物体的局部right轴。
测试代码。

	float angle = Vector3.Angle(Vector3.right, transform.right);
       // 假设angle 是30度
       angle = 30;
       //Vector3 newV =  Quaternion.AngleAxis(angle,Vector3.up) *Vector3.right;
       //Debug.LogError($"newV:{newV}");
       //transform.right = newV;
       //Vector3 newV = Quaternion.AngleAxis(angle, Vector3.right) * Vector3.right;
       Vector3 newV = Quaternion.AngleAxis(angle, Vector3.right) * Vector3.up;
       Debug.LogError($"newV:{newV}");
       transform.up = newV;

所以其实我想说的是一个代表旋转的最终的旋转四元数*世界轴向量得出来的就是局部轴向量

        Vector3 lRight = transform.rotation.Right();
        Vector3 lForward = transform.rotation.Forward();

        Debug.LogError($"qlRight: {lRight}");
        Debug.LogError($"qlForward: {lForward}");

        lRight = transform.right;
        lForward = transform.forward;
        Debug.LogError($"lRight:{lRight}");
        Debug.LogError($"lForward:{lForward}");

        lRight = transform.rotation * Vector3.right;
        lForward = transform.rotation * Vector3.forward;

        Debug.LogError($"lRight:{lRight}");
        Debug.LogError($"lForward:{lForward}");

速度:每秒xx的单位

帧速:速度/每秒多少帧

Input.GetAxis()的值范围
在这里插入图片描述
鼠标的话范围也许在1-20之间。
左上 正
右下 负
Mouse1 的话按下时1,松开是0

推荐学习文章:
复数是怎么代表角度的:https://www.shuxuele.com/algebra/complex-number-multiply.html , 转化成极坐标,在极坐标数学规律上寻找几何意义
四元数与旋转矩阵 https://openhome.cc/Gossip/WebGL/Quaternion.html

<think>我们被要求提供Unity四元数的使用指南。根据引用,特别是引用[3]提到了使用四元数来设置旋转以实现指南针功能。但是,用户的问题是关于四元数的使用指南,因此我们需要更全面地介绍Unity中的四元数四元数Unity中用于表示旋转,相比欧拉角,四元数可以避免万向节死锁,并且更适用于插值运算。Unity的Transform组件中的rotation属性就是四元数类型。 主要知识点: 1. 四元数的构造:可以通过欧拉角构造,也可以使用轴角对构造。 2. 四元数的运算:乘法用于组合旋转,插值用于平滑旋转。 3. 常用静态方法:Quaternion.LookRotation, Quaternion.FromToRotation, Quaternion.Euler等。 我们将按照以下结构组织回答: 1. 四元数的基本概念 2. 创建四元数 3. 四元数的运算 4. 四元数的应用示例 5. 注意事项 同时,根据系统指令,我们需要在行内数学表达式使用$...$,独立公式使用$$...$$,并生成相关问题。 注意:引用中只有引用[3]提到了四元数的使用,但我们可以结合Unity官方文档的知识来编写指南。 开始回答:</think>### Unity Quaternion 使用指南 在 Unity 中,四元数Quaternion)是表示 3D 旋转的核心数学工具。相比欧拉角,它能避免万向节死锁问题,并提供更稳定的旋转插值。以下是关键使用指南: --- #### 一、四元数基础 1. **数学原理** 四元数由标量$w$和向量$(x,y,z)$组成: $$ \mathbf{q} = (x\mathbf{i} + y\mathbf{j} + z\mathbf{k} + w) $$ 单位四元数满足 $x^2 + y^2 + z^2 + w^2 = 1$[^3]。 2. **与欧拉角转换** ```csharp // 欧拉角 → 四元数 Quaternion rotation = Quaternion.Euler(30, 45, 0); // 四元数 → 欧拉角 Vector3 euler = rotation.eulerAngles; ``` --- #### 二、核心操作 1. **旋转物体** ```csharp transform.rotation = Quaternion.Euler(0, 90, 0); // 绕Y轴旋转90度 ``` 2. **旋转插值**(平滑过渡) ```csharp // 线性插值 (Lerp) transform.rotation = Quaternion.Lerp(startRot, endRot, t); // 球面插值 (Slerp) transform.rotation = Quaternion.Slerp(startRot, endRot, t); ``` 3. **方向对准** ```csharp // 使物体Z轴指向目标方向 Vector3 direction = target.position - transform.position; transform.rotation = Quaternion.LookRotation(direction); ``` 4. **相对旋转** ```csharp // 绕局部Y轴旋转30度 transform.rotation *= Quaternion.Euler(0, 30, 0); ``` --- #### 三、实用场景 1. **指南针实现**(引用[3]示例) ```csharp void Update() { float compassAngle = Input.compass.trueHeading; Quaternion compassQuat = Quaternion.Euler(0, 0, -compassAngle); compassUI.transform.rotation = compassQuat; } ``` 2. **角色朝向平滑追踪** ```csharp Quaternion targetRot = Quaternion.LookRotation(enemy.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, 5f * Time.deltaTime); ``` 3. **旋转叠加** ```csharp Quaternion baseRot = Quaternion.Euler(0, 45, 0); Quaternion addRot = Quaternion.AngleAxis(30, Vector3.up); transform.rotation = baseRot * addRot; // 组合旋转 ``` --- #### 四、注意事项 1. **避免直接修改分量** 四元数分量$(x,y,z,w)$应通过 Unity API 操作,直接修改可能导致非标准化旋转。 2. **万向节死锁解决方案** 使用 `Quaternion.LookRotation` 替代欧拉角旋转序列,尤其在摄像机控制中。 3. **旋转差值选择** - `Lerp`:适合小角度旋转(性能高) - `Slerp`:适合大角度旋转(路径更平滑) 4. **方向向前向量** 用 `transform.forward` 替代欧拉角计算朝向,更符合四元数逻辑。 --- #### 五、性能优化 1. **缓存四元数** 重复使用的四元数(如固定旋转)应在 `Awake()` 中缓存: ```csharp private Quaternion fixedRotation; void Awake() { fixedRotation = Quaternion.Euler(0, 90, 0); } ``` 2. **减少复杂运算** 在 Update 中避免频繁计算 `Quaternion.Angle`,改用阈值判断: ```csharp if (Quaternion.Angle(current, target) > 5f) { // 执行旋转 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值