【问题标题】:Unprojecting 2D Screen Coordinates to 3D Coordinates将 2D 屏幕坐标取消投影到 3D 坐标
【发布时间】:2012-04-15 20:01:23
【问题描述】:

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

-相机的位置

-屏幕平面方程

-xz平面方程

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

非常感谢任何帮助!

谢谢!

【问题讨论】:

    标签: 3d mapping 2d coordinates intersection


    【解决方案1】:

    如果您的世界被旋转和移动以使相机位于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 是屏幕/窗口中心)中描述的设置,相机和投影平面之间的距离@ 987654346@, 和陆地飞机的yw 你得到了鼠标指向的陆地点的位置:

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

    当然,这些xwzw 是在旋转和移动的世界坐标中,如果你想在土地的“地图”中获得原始绝对坐标,你可以取消旋转和取消移动它们。

    这就是它的要点。

    【讨论】:

    • 对于这个非常全面且易于理解的答案,我感激不尽。
    • 其实我有一个问题:我的 yw 已知为 0。因此给定您的等式:zw = d * yw / ys zw 将始终等于 0。我该如何解释呢?
    • 如果 ys=0 并且您从其世界 y=0 的点(您的相机在设置中的位置)看,那么您看不到飞机。如果你想看到它,ys 必须是非零的。
    • 我不确定我是否理解你的解释。为了更清楚地充实我的情况: - 我的相机放置在我的投影平面的绝对中间,即 xy 平面(zw = 0) - 我的相机距离投影平面 1000 像素(zw = -1000) - 我的地形是 xz 平面 (yw=0) 因此,例如求解 xw,我们得到 xw = xs*0/ys = 0。对于不理解您的最后解释,我深表歉意:/
    • 我的意思是,如果您在一张桌子旁,请直视它后面的墙壁/窗户。不用向下看,您仍然可以看到桌子的表面。现在,慢慢蹲下,直到你看不到桌子的表面。当您的眼睛处于表面水平时,您将不再看到它。你只会看到一条线,而不是平面。这就是当相机的y也为0时ys=0的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多