【问题标题】:Unprojecting an on screen point back to an isometrically projected world将屏幕上的点取消投影到等距投影的世界
【发布时间】:2009-05-26 19:59:04
【问题描述】:

我正在做一个幕后 3d 模拟,同时在我的 2d 等距引擎中渲染世界。我以前从未做过等距引擎,而且我的矩阵数学一般都生锈了,所以我遇到了问题。

我有一个投影矩阵,最简单的形式是这样的:

 0.7       0.35     0
 0        -0.87     0
-0.71      0.35     1

由于我的引擎坐标系是左上角的 0,0,+X 向右/东,+Z 向南,所以有几个符号被翻转。

现在,它的反面是:

1.4080  0.5670   0.0000
0.0000 -1.1490   0.0000
1.0000  0.8050   1.0000

现在,这些矩阵大部分都有效。

例如

WC: 500,0,500 = 屏幕: -1.44, 350, 500(X 和 Y 正确)

WC: 0,0,500 = 屏幕: -355、175、500(X 和 Y 再次正确)

但是,现在如果你需要走另一条路,你不再有那个方便的 Z 值,所以

屏幕: -1.44, 350, 0 = WC: -2, -402.97, 0(所以,垃圾。)

还有更多——一旦我不再拥有那个 Z 值,我就无法从屏幕坐标中检索世界坐标。

这里有什么解决方法?

编辑

我应该指出,unproject 的重点是获得用于鼠标拾取的光线..

似乎只是我对自己所做的事情的误解让我在这里搞砸了。

【问题讨论】:

  • 任何关于你如何到达这里的参考资料都会非常有帮助!我自己也在尝试找出一些类似的东西——在渲染 2D 时进行幕后 3D 模拟。
  • 我想通了 - 在 XNA 内部,您可以使用 Matrix.CreateOrthographic 等函数轻松创建这些矩阵。

标签: math 3d linear-algebra matrix isometric


【解决方案1】:

如您所见,转换回 3D 空间需要某种 Z 坐标才有意义。

我建议您进行反向转换两次。一次在屏幕附近使用 Z 坐标(最靠近观察者),一次在 3D 场景后面使用 Z 坐标。这两个 3D 点将为您提供一条 3D 线,它将占据该 2D 点“后面”的所有位置。

【讨论】:

    【解决方案2】:

    你不能。您正在投影到丢失信息的屏幕上。

    如果你想一想,几个 3d 坐标会投影到屏幕上的同一点上,仅仅知道屏幕坐标并不足以检索原始坐标。

    [编辑] 查看您的屏幕坐标,您将它们的 z 值全部设为 0。这意味着您的投影矩阵的最后一列应该全为零,从而使该矩阵不可逆。

    【讨论】:

      【解决方案3】:

      屏幕上的每个像素都代表着从旁观者的眼睛到屏幕后面想象中的 3D 世界的一条线。您必须将这条线与该世界中可能潜伏的任何物体相交才能获得 3D 坐标。

      【讨论】:

        猜你喜欢
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        相关资源
        最近更新 更多