如何在XNA 4.0中使用俯视摄像机将鼠标坐标转换为3D坐标?

3
所以我正在使用XNA 4.0制作游戏,但在将鼠标坐标转换为3D世界时遇到了问题。我已经使用了Viewport.Unproject()方法,它几乎可以工作。问题在于我的投影是“视场”,因此远离中心轴的距离是指数级的。如果我将投影更改为标准透视,则我的3D对象会变形。是否有数学修正方法可用于使用从鼠标坐标翻译的视场?
我目前正在进行一些三角函数计算,以根据相机位置、视口的宽度和高度以及fieldOfView角度来计算远平面的宽度和高度。是否有更好的方法?这个方法几乎完美。

如何将鼠标移动缩放到特定深度的视野中? - Moon
2个回答

0

0

我有同样的问题,只是在看了你的问题之后才明白了技术解释。我的做法是翻译鼠标坐标的原点,然后乘以或除以一个因子,使得小的鼠标移动可以在远处更大的比例尺上放大。

虽然我不理解我的问题是透视和视野的问题,也就是鼠标是在屏幕上还是相机镜头上移动,而我想要移动的比例尺则远在后面且更大,但我还是通过数学计算让它起作用了。只是因为我看到了指数级别的缩放差异,所以这很简单。

这就是我所做的。

translated-X =  { mouse-X + (screenwidth/2) } / 2.7;
translated-Y =  {-mouse-Y + (screenHeight/2)} / 2.8;

针对我的当前设置,使用当前值来计算的方法表现良好,这些设置如下:

  • 相机位于(0,0,260)
  • 每个物品都有坐标(x,y,0),因此它们位于X&Y平面上
  • 我的屏幕分辨率为PreferredBackBufferWidthxHeight1024 x 768

只有在以上三种情况下,我的方程才能正常工作。

但是如果更改上述任何值,我将不得不根据情况调整方程,因此这些硬编码的值2.7和2.8将变成变量,并且必须根据摄像机位置和屏幕分辨率进行计算。

这个2.7和2.8保持比例到一定程度,现在

翻译的通用公式,我可以通过称为数值分析的技术来制定,我擅长这方面,但是为此我需要自己无法获取的数据,我需要找出完全在视野中的特定分辨率的相机距离,透视设置。

也就是说,如果我的分辨率是1024x768,那么当摄像头从多远的距离看原点时,我们实际上会在x轴周围看到1024个点,在y轴周围看到768个点。同样地,我需要至少两个更高分辨率的读数。

但是我无法获取这些值,因为我的愚蠢老旧的显示器最多只支持1024x768,我无法提高分辨率。如果您可以为多个分辨率获取摄像头距离,我将制定一个关系并提出通用公式。


PS:这并不意味着它是一个答案,而只是讨论问题和可能方案。 - Moon
我也发现微软开发人员在开发Microsoft Surface时解决了这个问题。因为它有相同的问题,但是以相反的方式输出被投影到屏幕上,输入则根据投影屏幕进行,而实际分辨率要低得多。 - Moon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接