将2D屏幕坐标还原为3D坐标

4

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

-相机位置

-屏幕平面方程

-xz平面方程

我只想让鼠标悬停在上面时,在xz平面上的陆地亮起来。

非常感谢您的帮助!

谢谢!

1个回答

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
通过对以上每一个进行重新排列,您可以得到xwzwxw = xs * zw / d
zw = d * yw / ys 现在,如果您的对象(土地)是某个yw上的平面,则该yw是已知的,因此您可以对其进行替换并得到zwzw = d * yw / ys 找到zw后,您现在可以通过再次替换来获取xwxw = xs * zw / d = xs * (d * yw / ys) / d = xs * yw / ys 所以,在这里,鉴于开始描述的设置,以及鼠标指针的屏幕坐标xsys(0,0为屏幕/窗口中心),相机和投影平面之间的距离d以及土地平面的yw,您可以获得鼠标指向的土地位置: xw = xs * yw / ys
zw = d * yw / ys 当然,这些xwzw位于旋转和移位后的世界坐标系中,如果您想要原始绝对坐标在土地“地图”中,您需要取消旋转和移位。
就是这样。

我无法感谢你提供如此全面且易懂的答案。 - user1170679
实际上我有一个问题:我的yw已知为0。 因此,根据您的方程式:zw = d * yw / yszw将始终等于0。我该如何处理这个问题? - user1170679
1
我的意思是,如果你在桌子旁边,直视它后面的墙壁/窗户。你仍然可以看到桌子的表面而不用低头。现在,慢慢蹲下直到你停止看到桌子的表面。当你的眼睛与表面平齐时,你将停止看到它。你只会看到一条线,而不是平面。这就是当相机的y值也为0时,ys=0的情况。 - Alexey Frunze
啊,我现在明白了。所以这些方程只适用于当相机坐标为y=x=z=0时?如果不是这种情况,方程会有所不同吗? - user1170679
明白了。谢谢你的耐心等待,我的朋友! :) 你帮了我很大的忙。 - user1170679
显示剩余4条评论

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