3d - 将 2D 屏幕坐标取消投影到 3D 坐标

标签 3d mapping 2d coordinates intersection

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

-相机位置

-屏幕平面方程

-xz 平面的方程

我想做的就是当我将鼠标悬停在 xz 平面上的土地上时,它会亮起。

非常感谢任何帮助!

谢谢!

最佳答案

如果您的世界发生旋转和移动,使得相机位于 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

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

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

当然,这些xwzw位于旋转和移动的世界坐标中,如果您想要土地“ map ”中的原始绝对坐标,您可以取消旋转和取消移动它们。

这就是要点。

关于3d - 将 2D 屏幕坐标取消投影到 3D 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971701/

相关文章:

ios - 具有方向和速度的2D矢量数学

python - 如何打印出格式化为网格的二维列表?

c++ - opengl 3d 点云从 x,y,z 二维数组渲染

matlab - 从 3D 数组中提取任意旋转的数据平面作为 2D 数组

ffmpeg - FFMPEG 中的 `-map data-re` 选项有什么作用?

elasticsearch - 在映射中设置自定义类型名称

c# - Direct3D 11 WorldViewProjection 矩阵转换不工作

input - 根据到目标的距离缩放 3D 相机平移/缩放

javascript - 如何从 react 中的映射数据中过滤数据

java - 查找长度为零的二维数组的宽度