3

所以我在 XNA 4.0 中制作游戏,但在将坐标从鼠标转换到 3D 世界时遇到了问题。我使用了 Viewport.Unproject() 方法,它几乎可以工作。问题是我的投影是一个“视野”,所以离中心轴的距离是指数的。如果我将投影更改为标准透视,则我的 3D 对象会变形。将视野与来自鼠标​​坐标的翻译数据一起使用是否有数学修复?

我目前正在做一些触发。根据相机位置、视口的宽度和高度以及 fieldOfView 角度计算远平面的宽度和高度。有没有更好的方法?这几乎是死路一条。

4

2 回答 2

0

我有同样的问题,直到我读到你的问题,我才明白它的技术解释。我所做的是翻译鼠标坐标的原点,然后将其乘以或除以一个因子,以便可以在更大的范围内放大鼠标的小移动,而这远远落后,

艰难我不明白我的问题是透视和视野,即鼠标在屏幕或相机镜头上移动,而我试图移动的比例远远落后且更大,但我还是做了数学计算工作。仅仅因为我看到了指数缩放差异,很简单

这就是我所做的

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

和具有当前值的方法对于我当前的设置来说翻译得很好,它们是

  • 相机在 (0,0,260)
  • 对于每个项目,我都有坐标 (x,y,0),所以它们位于XY平面
  • 我的屏幕分辨率,PreferredBackBufferWidthxHeight是 1024 x 768

仅在上述三个条件下,我的方程式才有效。

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

这个 2.7 和 2.8 将规模保持到某个点,现在

翻译的通用公式,我可以用一种叫做数值分析的技术来表达,我很擅长那个,但是我需要我自己无法获得的数据,我需要找出相机距离,透视设置分辨率完全在视野中。

也就是说,如果我的分辨率是 1024x768,那么从相机看原点的距离来看,我们实际上可以看到 x 轴周围的 1024 个点和 y 轴周围的 768 个点。同样,我需要至少两个读数才能获得更高的分辨率。

我不能得到这些值,因为我愚蠢的旧显示器支持最大 1024x768,我不能再高了。如果您可以为我提供多种分辨率的相机距离,我将制定一个关系并提出一个通用公式。

于 2011-08-05T07:09:50.813 回答
0

http://create.msdn.com/en-US/education/catalog/sample/picking_triangle

你去吧。光标在 Microsoft 的这个官方代码示例中实现。该项目不是专门针对游标的,但解决方案是在

于 2011-08-05T23:45:43.263 回答