通过代码调整相机方向(Unity3D)

时间:2015-08-12 00:14:19

标签: c# vector unity3d camera

我在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

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

如果您想尝试,我有另一种方法。

将GameObject作为相机的焦点。使gameObject成为相机的孩子。相机移动时调用LookAt(theGameObject)。平移时,由于父子关系,gameObject将与相机一起翻译,因此外观仍然会集中在gameObject上。

要旋转,您可以旋转目标游戏对象。