C# XNA相机场景大小

C# XNA相机场景大小,c#,xna,C#,Xna,我似乎无法理解这一点。因此,相机正在观察(0,0,0)处(0,0,5.0f)的世界。假设屏幕分辨率为800x600。现在,既然世界的中心是(0,0,0),那么相机可以看到的极限点(比如x轴的右侧)是什么 如果相机的位置为(0,0,50.0f),该值是多少?基本上,我该如何解决这个问题 +-------------------+ | | | | | | | | | +---------+--------

我似乎无法理解这一点。因此,相机正在观察(0,0,0)处(0,0,5.0f)的世界。假设屏幕分辨率为800x600。现在,既然世界的中心是(0,0,0),那么相机可以看到的极限点(比如x轴的右侧)是什么

如果相机的位置为(0,0,50.0f),该值是多少?基本上,我该如何解决这个问题

+-------------------+
|         |         |
|         |         |
|         |         |
+---------+---------¤ <-- what's the x-value of this point?
|         |         |
|         |         |
|         |         |
+-------------------+
+-------------------+
|         |         |
|         |         |
|         |         |

+---------+---------·如果我正确理解了这个问题,你想知道屏幕右中心点的世界空间位置吗

在XNA中,这实际上很容易做到(谢谢MS!),您可以使用viewport类将屏幕空间位置“取消投影”到世界空间

基本上,游戏中绘制的每个像素都要经过一些转换,以将其转换为可以在我们的2D显示器上绘制的2D图像,您也可以反向运行这些转换,XNA有一种方法可以实现这一点

Vector3 screenLocation = new Vector3(GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height / 2, 0);
Vector3 worldLocation = GraphicsDevice.Viewport.Unproject(screenLocation, camera.ProjectionMatrix, camera.ViewMatrix, camera.WorldMatrix);
编辑:

如果试图查看摄影机视图中的对象是否可以绘制,可以使用边界平截头体进行测试

BoundingFrustum frustum = new BoundingFrustum(camera.WorldViewProjectionMatrix);

平截头体包含一个名为Intersects的方法,该方法有许多替代项,用于测试平截头体内是否有边界框等内容。

这是透视投影吗?是的。基本上,我试图在一定范围内绘制/查看。为了实现这一点,我需要计算一些变量,如相机距离、场景大小等。这个问题只是为了让我开始。:)你的问题是“这个点的x值是多少”,但你知道,这不是一个真正的点,而是一条射线。你是指近平面上的x值吗?还要记住,如果你有一个透视投影,你有一个视锥,而不是像正交投影那样的长方体。我只是想澄清这一点,那是一个高人一等的人。。对不起:嗯。。。有趣!我想这是一种方法。不经过投影就可以得到相同的结果吗?不太可能,观看世界的相机可以放置在任何位置和角度,你要得到的是空间中最接近你观看的像素的点。如果你将屏幕空间z值的0改为1,它将使屏幕右中间的点尽可能远离相机可以看到的屏幕。如果您试图剔除看不见的对象,则不必自己做每个点,XNA再次使用BoundingFrustum类BoundingFrustum frustum=新的BoundingFrustum(camera.WorldViewProjectionMatrix)为您完成这一切; 可以使用它的截头体相交(..)方法来确定是否有其他边界体积在其中。