問題描述:昨天需要實現一個功能是根據指令左轉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);
對於限定角度的旋轉實現
三、實現鼠標拖拽旋轉
以前的項目在另一個硬盤上,找不到相關的示例暫時,這里只說一下思路:
- 像第二部分說的那樣,獲取鼠標移動,當然要判斷一下鼠標是否點擊了要旋轉的物體;
- 當獲取到鼠標移動的時候,設置移動后所對應的旋轉目標;
- 利用Rotate實現跟隨旋轉;
- 如果想有漸緩效果可以加額外的中間變量記錄,從而達到緩慢的跟隨效果,如果需要更精細,可以加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 更新於鵬城實驗室