我想知道如何将2D屏幕坐标映射到3D世界(特别是xz平面)知道:
- 相机的位置
- 屏幕平面的等式
- xz平面的等式
当我将鼠标悬停在xz平面上时,我想做的就是点亮它。
非常感谢任何帮助!
谢谢!
答案 0 :(得分:5)
如果你的世界被旋转和移动使得相机处于x=y=z=0
(世界坐标),则世界z
坐标会远离观察者(进入屏幕),并且投影平面是与屏幕平行且位于z=d
(世界坐标; d > 0
),然后您通过这种方式从世界坐标确定屏幕坐标:
xs = d * xw / zw
ys = d * yw / zw
这非常直观:物体离观察者/投影平面越远,其zw
越大,xs
和ys
越小,越接近{{}的消失点1}}和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
(0,0是屏幕/窗口中心),摄像机和投影平面ys
和地平面的d
你得到鼠标指向的陆地位置:
yw
xw = xs * yw / ys
当然,这些zw = d * yw / ys
和xw
位于旋转和移位的世界坐标中,如果您想要土地“地图”中的原始绝对坐标,则可以取消旋转和取消改变他们。
这就是它的要点。