在我的游戏中,有2辆坦克。我将camPoint定义为世界坐标中坦克的中心 - 这是相机指向的点。
问题在于,这并没有考虑到相机的视角。在图像中,camPoint位于黄点,但您可以看到坦克与边缘的距离不同:
Automatic exit from bash shell script on error
camPoint的所需位置为粉红点,因此两个坦克距边缘的距离相同。但是我怎么找到那个确切的位置?我确定它可以计算出来,但我还没有弄清楚。
答案 0 :(得分:0)
看看Camera.ScreenToWorldPoint 和Camera.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;。
放大和缩小时会有一些跳跃,但这对今天来说不是问题。
感谢大家的回答!