Tanks教程中在處理攝像機縮放的時候使用了下面的函數,取兩個坦克的中心點以後,根據兩個坦克之間的距離,保證兩個坦克都在屏幕中,而後進行縮放。函數
1 private float FindRequiredSize() 2 { 3 Vector3 desiredLocalPos = transform.InverseTransformPoint(m_DesiredPosition); 4 float size = 0f; 5 for (int i = 0; i < m_Targets.Length; i++) 6 { 7 if (!m_Targets[i].gameObject.activeSelf) 8 continue; 9 10 Vector3 targetLocalPos = transform.InverseTransformPoint(m_Targets[i].position); 11 Vector3 desiredPosToTarget = targetLocalPos - desiredLocalPos; 12 size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.y)); 13 14 size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.x) / m_Camera.aspect); 15 } 16 17 size += m_ScreenEdgeBuffer; 18 19 size = Mathf.Max(size, m_MinSize); 20 21 return size; 22 }
一開始沒有明白InverseTransformPoint,這個函數變換位置從世界座標到自身座標。ui
結構以下:spa
攝像機選擇的是正交投影,因此坦克到中心點CameraRig的x,y就是坦克距離屏幕中心點的位置。code
由於camera的父節點CameraRig有個旋轉,因此計算到屏幕的中心點的座標要考慮到旋轉,不如直接調用InverseTransformPoint,這樣獲得tank相對CameraRig的座標,就是到屏幕中心的座標。而z軸對於咱們的計算沒有用處。orm