Unity3D 控制物體旋轉詳解 —— 自身繞軸旋轉、緩慢旋轉、鼠標控制旋轉、歐拉數和四元數的關系



問題描述:昨天需要實現一個功能是根據指令左轉90度或者右轉90度,當時腦汁可能是有漿糊吧,居然要用直接賦值rotation,這樣一來就要牽扯到eulerAngles和四元數的Euler函數了,結果忙活了好久沒解決,bug層出,今天經過詳細了解,解決了相關問題,一並把其他關於角度和旋轉的知識點整理出來。


一、問題的解決:如何讓物體繞自身軸旋轉

直接上關鍵代碼:

player_cube.Rotate(-90, 0, 0);

player_cube是獲取的需要旋轉的物體的Transform,其中-90意味着,在unity面板中 rotation 中的 x 減少90,從而實現旋轉;

如果想讓物體直接旋轉多少度,這個是最方便快捷的方法!


二、緩慢旋轉

 多見於FPS游戲中使用,用於轉換攝像頭角度,以下為自己以前做過的例子:(僅作參考)

//獲取鼠標移動
mouse_move_velocity.y = Input.GetAxis("Mouse X");
mouse_move_velocity.x = -Input.GetAxis("Mouse Y");
//rote camera 
Vector3 target_angle = transform.rotation.eulerAngles + mouse_move_velocity; 
//限定角度
//調整周期,限定角度
if (target_angle.x > 180) target_angle.x -= 360;
if (target_angle.y > 180) target_angle.y -= 360;
target_angle = new Vector3(Mathf.Clamp(target_angle.x, X_min, X_max), Mathf.Clamp(target_angle.y, Y_min, Y_max), 0);
//轉化四元角度
transform.rotation = Quaternion.Euler(target_angle);

對於限定角度的旋轉實現


三、實現鼠標拖拽旋轉

 以前的項目在另一個硬盤上,找不到相關的示例暫時,這里只說一下思路:

  1. 像第二部分說的那樣,獲取鼠標移動,當然要判斷一下鼠標是否點擊了要旋轉的物體;
  2. 當獲取到鼠標移動的時候,設置移動后所對應的旋轉目標;
  3. 利用Rotate實現跟隨旋轉;
  4. 如果想有漸緩效果可以加額外的中間變量記錄,從而達到緩慢的跟隨效果,如果需要更精細,可以加animation;

四、歐拉數和四元數之間的千絲萬縷

 最簡單的對比就是,歐拉數是一個三維向量,在Unity的定義中就是個Vector3,而四元數顧名思義則是包含四個參數的量-Quaternion。

關於兩者之間的轉換:

private Quaternion quaternion;
private Vector3 transform_rotation;
public void Init()
{
    transform_rotation = quaternion.eulerAngles;
    quaternion = Quaternion.Euler(transform_rotation);
}

到這里其實就差不多能滿足基本的旋轉要求了,但是還有許多細節值得展開學習說明。比如四元數的本質,世界軸和自身軸,等等等等

2019/8/9 更新於鵬城實驗室


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM