将2D屏幕坐标未投影到3D坐标

use*_*679 4 mapping 3d 2d intersection coordinates

我想知道如何将2D屏幕坐标映射到3D世界(特别是xz平面)知道:

- 相机的位置

- 屏幕平面的等式

- xz平面的等式

当我将鼠标悬停在xz平面上时,我想做的就是让xz平面上的土地亮起来.

任何帮助是极大的赞赏!

谢谢!

Ale*_*nze 5

如果您的世界被旋转和移动使得相机处于x=y=z=0(世界坐标),则世界z坐标会远离观察者(进入屏幕),并且投影平面与屏幕平行并且处于z=d(世界坐标; d > 0),然后你用这种方式从世界坐标确定屏幕坐标:

xs = d * xw / zw
ys = d * yw / zw

这是相当直观:在远离浏览器/投影面上的目标,更大的zw和更小xsys更接近的消失点xw=yw=0zw=+infinity,其投射到投影平面的中心xs=ys=0.

通过重新排列以上每一个,你得到xwzw回来:

xw = xs * zw / d
zw = d * yw / ys

现在,如果你的物体(陆地)是一个特定的飞机yw,那么,那yw就是已知的,所以你可以替换它并得到zw:

zw = d * yw / ys

找到之后zw,你现在可以xw再次获得替代:

xw = xs * zw / d = xs * (d * yw / ys) / d = xs * yw / ys

因此,在开头和屏幕坐标xs以及ys鼠标指针(0,0是屏幕/窗口中心)中描述的设置,相机和投影平面之间的距离d,以及陆地平面的yw位置,你得到的位置鼠标指向的陆地点:

xw = xs * yw / ys
zw = d * yw / ys

当然,这些xw并且zw处于旋转和移位的世界坐标中,如果您想要在地图的"地图"中使用原始绝对坐标,则可以取消旋转并取消它们.

这是它的要点.