2009-05-26 108 views
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值,我无法从屏幕坐标中找回世界坐标。

这里有什么解决方法?

编辑

我要指出的是,unproject的一点是要获得鼠标选择一个射线..

看起来这只是我自己在做什么这是拧的误解我在这里。

+0

任何有关你如何到达这里的参考将他非常有帮助!我试图找出一些与我自己相似的东西 - 幕后3D渲染,同时呈现2D。 – 2012-04-16 20:20:18

回答

8

正如你发现的,你转换回3D空间需要某种Z坐标来完成任何意义。

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

2

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

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

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

2

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