簡體   English   中英

我在獲取旋轉的直接值時遇到問題

[英]I have a problem getting the direct value of rotation

我正在嘗試制作一個簡單的飛行模擬器,並嘗試獲取飛機的俯仰值(旋轉的x)。 我認為如果我得到旋轉的 x 值,它會起作用

transform.rotation.eulerAngles.x

我嘗試了其他將四元數更改為歐拉角的代碼。

但價值開始表現得很奇怪。 當我將 x 值更改為大於 90 時,該值開始減小,並且 y 和 z 值變化增加 180。我認為這類似於防雲台鎖定系統,但我不知道如何獲得原始價值。

eulerAngles

使用 .eulerAngles 屬性設置旋轉時,請務必了解,盡管您提供 X、Y 和 Z 旋轉值來描述旋轉,但這些值不會存儲在旋轉中。 相反,X、Y 和 Z 值被轉換為四元數的內部格式。

當您閱讀 .eulerAngles 屬性時,Unity 會將四元數的內部旋轉表示轉換為歐拉角。 因為,使用歐拉角表示任何給定旋轉的方法不止一種,因此您讀出的值可能與您分配的值完全不同。 如果您嘗試逐漸增加值以生成 animation,這可能會導致混淆。

簡而言之: 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM