我一直試圖理解函式背后的數學(三角函式和線性代數)transform.LookAt()。我遵循了一個教程并嘗試對其進行修改以滿足我的需求,但到目前為止我還沒有成功。
我正在嘗試實作一個相機(在 3d 空間中),它跟隨具有自定義偏移量的玩家,但同時用戶可以在仍然具有該Vector3偏移量的同時放大和縮小相機。我還鎖定了其他軸,只想將旋轉應用于 X 軸。我的腳本的問題是角度似乎被限制在45°和90° 度之間。我想我錯過了什么
private void LookAt(Transform t)
{
Vector3 forward = _camPos - (t.position new Vector3(0, t.GetComponent<CapsuleCollider>().height / 2, 0));
Debug.DrawRay(forward, -forward, Color.blue);
Vector3 right = Vector3.Cross(target.up, forward);
Debug.DrawRay(forward, right, Color.magenta);
Vector3 newUp = Vector3.Cross(Vector3.forward, right);
Debug.DrawRay(forward, newUp, Color.yellow);
float angle = Mathf.Atan2(forward.magnitude, newUp.magnitude) * Mathf.Rad2Deg;
mainCam.transform.rotation = Quaternion.Euler(angle, 0, 0);
}
- 我的代碼首先獲取從相機到目標的前向向量(直角三角形中的斜邊)。旁注在這里,這給出了相反的方向,但這沒關系,因為
- 然后它通過前向向量和目標向上向量的叉積來計算“右”向量
- 然后它通過前向和右向量的叉積計算“newUp”向量(在直角三角形中相反)
- 通過使用Arcus tangent計算 X 旋轉, Arcus tangent 是hpyotenuse/opposite之間的比率
如您所見,矢量計算與螢屏截圖一樣
- 藍色前向矢量
- 洋紅色右矢量
- 黃色newUp 矢量
forward、right 和 newUp 向量

盡管如此,當我降低變焦率時,相機只會正確對焦角色,也就是將相機移近它:
僅在一段距離后(正確地)注視目標

我錯過了什么?幫助不勝感激!
uj5u.com熱心網友回復:
提供一個實際的答案。看起來您的想法是正確的,即取觀察方向和任意向上向量之間的叉積,然后再取另一個叉積以確保所有向量都是正交的。我不確定我是否完全理解偏移量的作用,但我認為它按預期作業。我會做幾件事:
- 確保一切都標準化,我認為這不是絕對必要的,但它有助于保持較小的值。
- 如果向前方向和 target.up 接近平行,請添加一個檢查來處理,然后選擇其他一些向上向量,或者給出錯誤,以便您可以檢測到問題。
- 直接構造一個旋轉矩陣。
我非常喜歡將旋轉作為向量、四元數或矩陣來處理。我發現歐拉角令人困惑且難以使用,因為有多種變體以不同的順序應用旋轉,并且難以可視化。
一個旋轉矩陣(即 3x3)實際上只是三個正交向量,這也是可視化矩陣的超級有用的方法。我認為每個向量應該對應矩陣中的一行,但是我對統一性不熟悉,約定可以不同。
一個 4x4 矩陣只是一個旋轉矩陣 一個用于平移的列和一個額外的行。因此,只需對每個前/右/上向量使用SetRow(或 SetColumn),使用 0 作為向量 4 的 w 值。然后您可以將矩陣轉換為 quaternion,我無法資助這樣的內置函式功能統一,這似乎有點奇怪,但是鏈接應該顯示原理,并且應該有許多其他文章顯示其背后的數學。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/523517.html
