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,这个函数变换位置从世界坐标到自身坐标。
结构如下:
摄像机选择的是正交投影,所以坦克到中心点CameraRig的x,y就是坦克距离屏幕中心点的位置。
因为camera的父节点CameraRig有个旋转,所以计算到屏幕的中心点的坐标要考虑到旋转,不如直接调用InverseTransformPoint,这样得到tank相对CameraRig的坐标,就是到屏幕中心的坐标。而z轴对于我们的计算没有用处。