对于Unity中旋转问题的一点总结

本文总结了Unity中旋转问题,探讨左手坐标系下欧拉角的使用。欧拉角作为四元数的旋转度量,与三维向量相乘时顺序无关,最终会得到相同结果。通过示例代码展示了如何利用欧拉角进行摄像机视角变换,确保变换后的位置始终在以目标为中心的球面上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于Unity中旋转问题的一点总结

坐标系:

Unity中坐标系是这样的:

UnityCoordinate3D

采用左手坐标系,x(Red) 水平向右,y(Green)竖直向上,z(Blue)纵向深入,依次是R - G -B

欧拉角

首先说一下Quaternion 的用处,quaternion 是四元数 (x,y,z,w)四个元单独没有意义,只有四个一起用时才有意义。
本次不打算专门谈四元数,而是谈它的成员变量 eulerAngles.
通常我们可以用欧拉角来代表四元数的旋转度量,也即 rotation(x,y,z)
而我们的Transform 的旋转度量就是欧拉角 同样是(x,y,z)

一般而言,旋转只需要用到四元数的欧拉角,它的乘法使用和四元数的乘法使用有所不同。

四元数是向量,左乘 lhs * rhs 和右乘 rhs * lhs 得到的结果不同,这个比较麻烦,如果需要请深入研究。

但是我们通常使用的是 欧拉角 与 三维向量相乘,这个是与左乘、右乘、乘的顺序 无关的Transform变换方法。

左乘,右乘不说了,都是一种使用方法:

Quaternion rotation = Quaternion.Euler (y, x, 0);
Vector3 position = rotation * new Vector3 (0
### Unity 中 Transform 组件的旋转操作 在 Unity 的场景中,`Transform` 是每个游戏对象的核心组件之一,它负责存储和控制对象的位置、旋转以及缩放。对于旋转操作而言,可以通过 `rotation` 和 `localRotation` 属性来实现不同的效果。 #### 1. 使用 Quaternion 设置绝对旋转 通过设置 `transform.rotation` 可以定义一个基于世界坐标的绝对旋转角度。以下是使用四元数 (Quaternion) 来指定特定方向的一个例子: ```csharp using UnityEngine; public class RotateObject : MonoBehaviour { void Start() { // 将物体旋转至固定的世界坐标系下的欧拉角(0, 90, 0) transform.rotation = Quaternion.Euler(new Vector3(0, 90, 0)); // [^1] } } ``` 这里的 `Quaternion.Euler(Vector3)` 方法接受三个参数分别对应绕 X 轴、Y 轴和 Z 轴的角度偏移量。 #### 2. 基于当前状态增加旋转 如果希望让物体围绕某个轴逐渐转动,则可以利用 `Rotate()` 函数或者修改 `eulerAngles` 属性完成增量式的调整。 ```csharp void Update() { float anglePerSecond = 45f; // 每秒转过多少度 // 让物体每帧都沿 Y 轴正向自增一定角度 transform.Rotate(Vector3.up * Time.deltaTime * anglePerSecond); // [^2] /* 或者直接改变 eulerAngles */ // transform.eulerAngles += new Vector3(0, Time.deltaTime * anglePerSecond, 0); } ``` 上述代码片段展示了如何使物体持续不断地沿着垂直屏幕的方向缓慢旋转起来的效果。 #### 3. 对象局部空间内的相对旋转 当存在父子关系时,“Local Rotation”变得尤为重要。它可以让你单独处理子节点相对于父节点的姿态而不受全局影响。 假设我们有这样一个结构:Parent -> Child,在不考虑其他因素的情况下执行如下命令将会只影响 child 自身姿态而不会波及 parent。 ```csharp child.transform.localRotation *= Quaternion.AngleAxis(-10F, Vector3.right); // // 这里表示让孩子逆时针(从右侧看过去)稍微倾斜一点。 ``` 注意这里乘法运算符的作用顺序是从右往左依次作用各个因子上的变换矩阵;另外由于 quaternion 不像 vector 那样直观易懂所以建议多做实验熟悉它们的行为模式。 #### 关键概念总结 - **World vs Local**: 如果该 GameObject 存在一个 Parent 则它的 Position/Rotation/Scale 默认指的是相对于这个 Parent 的值;如果没有 Parents 它们就代表的是 World Space 下的数据. - **Synchronization Across Networked Clients**: In multiplayer games built with Unity's networking system, changes made locally via scripts like those above will automatically propagate across all connected clients thanks to the presence of a 'NetworkTransform' component attached alongside your regular ones.[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值