我想知道如何将 2D 屏幕坐标映射到 3D 世界(特别是 xz 平面),因为我知道:
-相机位置
-屏幕平面方程
-xz 平面的方程
我想做的就是当我将鼠标悬停在 xz 平面上的土地上时,它会亮起。
非常感谢任何帮助!
谢谢!
最佳答案
如果您的世界发生旋转和移动,使得相机位于 x=y=z=0
(世界坐标),则世界 z
坐标将远离查看器(进入屏幕),并且投影平面与屏幕平行且位于 z=d
(世界坐标;d > 0
),然后确定屏幕坐标从世界坐标这样:
xs = d * xw/zw
ys = d * yw/zw
这非常直观:物体距观察者/投影平面越远,其 zw
越大,xs
和 ys
越小,靠近 xw=yw=0
和 zw=+infinity
的消失点,投影到投影平面的中心 xs=ys=0
.
通过重新排列上述每个内容,您将得到 xw
和 zw
:
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
位于旋转和移动的世界坐标中,如果您想要土地“ map ”中的原始绝对坐标,您可以取消旋转和取消移动它们。
这就是要点。
关于3d - 将 2D 屏幕坐标取消投影到 3D 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971701/