在屏幕上取消投影指向等距投影的世界

时间:2009-05-26 19:59:05

标签: math 3d linear-algebra matrix isometric

我正在做幕后的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值,我就无法从屏幕坐标中找回世界坐标。

这里的解决方法是什么?

修改

我应该指出,非项目的目的是获取用于鼠标拾取的光线。

这似乎只是我对我正在做的事情的误解,这让我搞砸了。

3 个答案:

答案 0 :(得分:8)

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

我建议您进行两次的反向转换。一旦屏幕附近的Z坐标(最接近观察者),并且在3D场景的背面有一个Z坐标。这两个3D点会给你一条3D线,它将占据2D点“后面”的所有位置。

答案 1 :(得分:2)

你不能。你正投射到丢失信息的屏幕上。

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

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

答案 2 :(得分:2)

屏幕上的每个像素代表从旁观者的眼睛到屏幕后面的虚拟3D世界的一条线。你必须将这条线与该世界潜伏的任何物体相交以获得3D坐标。