我在Unity Ask论坛上发布了同样的问题,但我没有收到回复,所以我希望有人在这里提供帮助。我正在开发一款相机需要专注于岛屿中心的山峰的游戏。相机通过围绕该山内的一个点旋转(使用Transform.RotateAround)来工作。相机也需要左右平移,我在Translating it on its local left and right vectors进行操作。但是,一旦你使用足够的Translate和RotateAround,相机就会向侧面倾斜,并且在你玩的时候会逐渐变差。
我尝试通过每帧运行此功能来纠正它:
private void StraightenCamera()
{
//tilt it upward so it is always oriented right
//goal: make the local up vector lie in the plane defined by the local forward and global up vector
//http://www.vitutor.com/geometry/distance/line_plane.html
Vector3 localForward = this.transform.TransformDirection(Vector3.forward);
Vector3 globalUp = Vector3.up;
Vector3 u = this.transform.TransformDirection(Vector3.up);
Vector3 n = Vector3.Cross(localForward, globalUp);
float numerator = Mathf.Abs(n.x * u.x + n.y * u.y + n.z * u.z);
float denominator = Mathf.Sqrt(n.x * n.x + n.y * n.y + n.z * n.z) + Mathf.Sqrt(u.x * u.x + u.y * u.y + u.z * u.z);
float angle = Mathf.Rad2Deg * Mathf.Asin(numerator / denominator);
this.transform.Rotate(Vector3.forward, angle, Space.Self);
}
这个功能大部分都有效,但有一个问题。它会在几次变换后将相机旋转到正确的方向,然后它会决定以错误的方式旋转,直到它完全颠倒它应该的位置。把它弄得多一点,它会纠正到正确的方向,但是当你继续玩它时,它会变得混乱并再次翻转。我不明白是什么触发了翻转,或者我的数学问题出在哪里。有人看到了吗?
上述功能的解释:我的想法是,当它重新定位时,它的局部向上矢量正在倾斜。我不关心它指向的位置,只要它在由本地前向向量(玩家可能指向的任何地方)定义的平面中,以及全局向上向量。我正在围绕其本地前轴旋转相机以试图保持这种状态。我的数学关闭的一个暗示是,它没有像我想要的那样在单个帧中纠正这种错位,但是它正在逐渐地纠正,无论是纠正到正确的方向还是倒置。我得到公式的网站是在函数中的注释,并在下面链接。
问题视频:https://youtu.be/J3a__u8vrYo
我正在使用的公式的来源:http://www.vitutor.com/geometry/distance/line_plane.html
感谢您提供的任何帮助!
答案 0 :(得分:0)
如果您想尝试,我有另一种方法。
将GameObject作为相机的焦点。使gameObject成为相机的孩子。相机移动时调用LookAt(theGameObject)。平移时,由于父子关系,gameObject将与相机一起翻译,因此外观仍然会集中在gameObject上。
要旋转,您可以旋转目标游戏对象。