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