从四元数中读取特定值
Read specific values from quaternion
我想从 Unity 四元数中读取以下值 https://docs.unity3d.com/ScriptReference/Quaternion.html
如果x旋转(俯仰)为180(或者0)
如果y旋转(roll)为180(或者0)
获得 z 轴旋转(偏航)的最高效公式是什么?
我在网上找到了这个求z轴的公式,这个是最高效的吗?
z = qz / sqrt(1-qw*qw)
http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/
您不必使用复杂的公式即可从四元数中读取值。 Unity 已经为您做到了!
最简单的方法是像这样阅读四元数的欧拉角:
Vector3 angle = rotation.eulerAngles;
您可以轻松阅读每个旋转 angle.x
, ...
我贴的公式是四元数到角度和轴的转换。我需要的是四元数到欧拉角。我意识到我根本不需要 x 和 y 角度。
在网上找到了一些代码并根据我的需要对其进行了调整,这仅将 z 角转换为弧度(1.3 毫秒 10K 次迭代)
public double GetZAngle(Quaternion q1)
{
double sqw = q1.w * (double)q1.w;
double sqx = q1.x * (double)q1.x;
double sqy = q1.y * (double)q1.y;
double sqz = q1.z * (double)q1.z;
double unit = sqx + sqy + sqz + sqw; // If normalized is one, otherwise is correction factor
double test = (double)q1.x * q1.y + (double)q1.z * q1.w;
if (test > 0.499 * unit) // Singularity at north pole
return Math.PI / 2;
if (test < -0.499 * unit) // Singularity at south pole
return -Math.PI / 2;
return Math.Asin(2 * test / unit);
}
没有明确的模式来区分 x 和 y 角度是否为 0,但这里有一个代码片段显示了如何以弧度检索所有这些(2.14 毫秒 10K 次迭代(比 Unity 的 3 毫秒更快) ) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/
我想从 Unity 四元数中读取以下值 https://docs.unity3d.com/ScriptReference/Quaternion.html
如果x旋转(俯仰)为180(或者0)
如果y旋转(roll)为180(或者0)
获得 z 轴旋转(偏航)的最高效公式是什么?
我在网上找到了这个求z轴的公式,这个是最高效的吗? z = qz / sqrt(1-qw*qw) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/
您不必使用复杂的公式即可从四元数中读取值。 Unity 已经为您做到了!
最简单的方法是像这样阅读四元数的欧拉角:
Vector3 angle = rotation.eulerAngles;
您可以轻松阅读每个旋转 angle.x
, ...
我贴的公式是四元数到角度和轴的转换。我需要的是四元数到欧拉角。我意识到我根本不需要 x 和 y 角度。
在网上找到了一些代码并根据我的需要对其进行了调整,这仅将 z 角转换为弧度(1.3 毫秒 10K 次迭代)
public double GetZAngle(Quaternion q1)
{
double sqw = q1.w * (double)q1.w;
double sqx = q1.x * (double)q1.x;
double sqy = q1.y * (double)q1.y;
double sqz = q1.z * (double)q1.z;
double unit = sqx + sqy + sqz + sqw; // If normalized is one, otherwise is correction factor
double test = (double)q1.x * q1.y + (double)q1.z * q1.w;
if (test > 0.499 * unit) // Singularity at north pole
return Math.PI / 2;
if (test < -0.499 * unit) // Singularity at south pole
return -Math.PI / 2;
return Math.Asin(2 * test / unit);
}
没有明确的模式来区分 x 和 y 角度是否为 0,但这里有一个代码片段显示了如何以弧度检索所有这些(2.14 毫秒 10K 次迭代(比 Unity 的 3 毫秒更快) ) http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/