我在获取旋转的直接值时遇到了问题



我试图制作一个简单的飞行模拟器,我试图获得飞机的俯仰值(旋转的x(。我想如果我通过得到旋转的x值,它会起作用

transform.rotation.eulerAngles.x

我尝试了其他代码,将四元数改为欧拉角。

但价值观开始产生扭曲作用。当我将x值更改为大于90的值时,该值开始减小,y和z值更改为更高180。我觉得这有点像反gimbol锁定系统,但我不知道如何获得原始值。

参见eulerAngles

使用.eulerAngles属性设置旋转时,重要的是要理解,尽管您提供了X、Y和Z旋转值来描述旋转,但这些值不会存储在旋转中。相反,X、Y&Z值将转换为四元数的内部格式。

读取.eulerAngles属性时,Unity会将四元数的内部旋转表示转换为Euler角度。因为,使用欧拉角表示任何给定旋转的方法不止一种,所以您读取的值可能与指定的值大不相同。如果您试图逐渐增加值以生成动画,这可能会导致混乱。

简而言之:eulerAngles只返回一种简化的人类可读方式来编写当前Quaternion值。

从这里我做了一些扩展方法,你可以使用

public static class QuaternionExtensions
{
public static float Pitch(this Quaternion q) => Mathf.Rad2Deg * Mathf.Atan2(2 * q.x * q.w - 2 * q.y * q.z, 1 - 2 * q.x * q.x - 2 * q.z * q.z);
public static float Yaw(this Quaternion q) => Mathf.Rad2Deg * Mathf.Atan2(2 * q.y * q.w - 2 * q.x * q.z, 1 - 2 * q.y * q.y - 2 * q.z * q.z);
public static float Roll(this Quaternion q) => Mathf.Rad2Deg * Mathf.Asin(2 * q.x * q.y + 2 * q.z * q.w);
}

所以你可以做

var q = transform.rotation;
var pitch = q.Pitch();
var yaw = q.Yaw();
var roll = q.Roll();

最新更新