7

我正在做一个幕后 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 值,我就无法从屏幕坐标中检索世界坐标。

这里有什么解决方法?

编辑

我应该指出,取消项目的目的是为鼠标拾取获得光线..

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

4

3 回答 3

8

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

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

于 2009-05-26T20:09:05.057 回答
2

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

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

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

于 2009-05-26T20:05:58.883 回答
2

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

于 2009-05-26T20:32:24.820 回答