Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d Unity:使用3D透视相机,如何使两个对象与屏幕边缘保持相同的距离?_Unity3d - Fatal编程技术网

Unity3d Unity:使用3D透视相机,如何使两个对象与屏幕边缘保持相同的距离?

Unity3d Unity:使用3D透视相机,如何使两个对象与屏幕边缘保持相同的距离?,unity3d,Unity3d,在我的游戏中,有两辆坦克。我将camPoint定义为坦克在世界坐标系中的中心,这是相机指向的点 问题是,这并没有考虑到相机的视角。在图像中,camPoint位于黄点,但您可以看到水箱与边缘的距离不同: camPoint的所需位置位于粉红点处,以便两个水箱与边缘的距离相同。但我怎么才能找到确切的地点呢?我确信它是可以计算出来的,但我还没有计算出来。看一看 及 例如,如果您希望两个水箱与屏幕边缘的距离始终相同,则可以将世界位置转换为屏幕位置,计算屏幕空间中的摄影机方向,然后将其转换回世界空间,同时

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

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

camPoint的所需位置位于粉红点处,以便两个水箱与边缘的距离相同。但我怎么才能找到确切的地点呢?我确信它是可以计算出来的,但我还没有计算出来。

看一看 及

例如,如果您希望两个水箱与屏幕边缘的距离始终相同,则可以将世界位置转换为屏幕位置,计算屏幕空间中的摄影机方向,然后将其转换回世界空间,同时考虑摄影机距离和透视

看一看 及


例如,如果您希望两个水箱与屏幕边缘的距离始终相同,则可以将世界位置转换为屏幕位置,计算屏幕空间中的摄影机方向,然后将其转换回世界空间,同时考虑摄影机距离和透视

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

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);
请注意,我使用Y轴作为轴单位,通常定义为“Z”

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


谢谢大家的回答

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

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);
请注意,我使用Y轴作为轴单位,通常定义为“Z”

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



谢谢大家的回答

相机是静止的还是应该根据坦克的移动而移动?摄像机应该放大和缩小吗?摄像机随着坦克移动。相机可以放大和缩小,有时也可以旋转。FoV不变(相机变焦是通过将相机移开来完成的)。我曾尝试为每个坦克使用WorldToViewportPoint,然后找到(0.5,0.5)点(视口中心)并将其转换为世界坐标,但由于某些原因,相机一直在跳跃。请在unity网站上观看坦克视频教程。它经过了这个精确的过程,也使用了两个油箱!我会查出来的,谢谢!相机是静止的还是应该根据坦克的移动而移动?摄像机应该放大和缩小吗?摄像机随着坦克移动。相机可以放大和缩小,有时也可以旋转。FoV不变(相机变焦是通过将相机移开来完成的)。我曾尝试为每个坦克使用WorldToViewportPoint,然后找到(0.5,0.5)点(视口中心)并将其转换为世界坐标,但由于某些原因,相机一直在跳跃。请在unity网站上观看坦克视频教程。它经过了这个精确的过程,也使用了两个油箱!我会查出来的,谢谢!我曾尝试为每个坦克使用WorldToViewportPoint,然后找到(0.5,0.5)点(视口中心)并将其转换为世界坐标,但由于某些原因,相机一直在跳跃。WorldToViewportPoint与WorldToScreenPoint不同,比如一个是屏幕空间(2d),另一个是视口空间(3d)。据我所知,视口只是屏幕规格化(而不是像素宽度,像素高度为1,1)。你说的“跳跃”是什么意思?你是在LateUpdate()中移动你的相机吗?我已经尝试为每个坦克使用WorldToViewportPoint,然后找到(0.5,0.5)点(视口中心)并将其转换为世界坐标,但是相机因为某些原因一直在跳跃。WorldToViewportPoint与WorldToScreenPoint不同,比如一个是屏幕空间(2d),另一个是视口空间(3d)。据我所知,视口只是屏幕规格化(而不是像素宽度,像素高度为1,1)。你说的“跳跃”是什么意思?你在LateUpdate()中移动相机吗奇怪的是,它需要几步才能真正到达点,这就是我试图修复的sill。奇怪的是,它需要几步才能真正到达点,这就是我试图修复的sill。