Unity:使用3D透视相机,如何将2个物体保持在与屏幕边缘相同的距离?

时间:2017-01-10 15:19:01

标签: unity3d

在我的游戏中,有2辆坦克。我将camPoint定义为世界坐标中坦克的中心 - 这是相机指向的点。

问题在于,这并没有考虑到相机的视角。在图像中,camPoint位于黄点,但您可以看到坦克与边缘的距离不同:

Automatic exit from bash shell script on error

camPoint的所需位置为粉红点,因此两个坦克距边缘的距离相同。但是我怎么找到那个确切的位置?我确定它可以计算出来,但我还没有弄清楚。

2 个答案:

答案 0 :(得分:0)

看看Camera.ScreenToWorldPointCamera.WorldToScreenPoint

例如,如果您想要的是两个坦克始终与屏幕边缘保持相同的距离,您可以将世界位置转换为屏幕位置,在屏幕空间中计算相机方向,然后将其转换回来进入世界空间考虑相机距离和视角。

答案 1 :(得分:0)

我找到了一个有效的解决方案:

1)将每个坦克的位置存储在数组/列表中的视口上。

2)使用下面的代码中的最小值/最大值找到中心点。

3)使用找到的x,y中心点将该中心点转换回世界坐标,并将z转换为相机的典型距离。

    for (var i = 0; i < numberOfTanks; i++) {
        tanksX[i] = camcam.WorldToViewportPoint(tanks[i].transform.position).x;
        tanksY[i] = camcam.WorldToViewportPoint(tanks[i].transform.position).y;
    }

    tanksXmin = Mathf.Min (tanksX);
    tanksYmin = Mathf.Min (tanksY);
    tanksXmax = Mathf.Max (tanksX);
    tanksYmax = Mathf.Max (tanksY);
    camScript.camPoint = camcam.ViewportToWorldPoint(new Vector3((tanksXmax + tanksXmin) / 2, (tanksYmax + tanksYmin) / 2, camScript.camDist));
    camScript.camPoint = new Vector3 (camScript.camPoint.x, tankOffsetY+camScript.zoomLevel, camScript.camPoint.z);

然后在cam的LateUpdate():

    offset = new Vector3 (offsetXZ, offsetY, offsetXZ);
    transform.position = camPoint+offset;
    transform.LookAt (camPoint, Vector3.up);

请注意,我使用Y轴作为轴,Unity通常定义为&#39; Z&#39;。

放大和缩小时会有一些跳跃,但这对今天来说不是问题。

感谢大家的回答!