我正在做幕后的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值,我就无法从屏幕坐标中找回世界坐标。
这里的解决方法是什么?
修改
我应该指出,非项目的目的是获取用于鼠标拾取的光线。
这似乎只是我对我正在做的事情的误解,这让我搞砸了。
答案 0 :(得分:8)
正如您所发现的那样,您转换回3D空间需要某种Z坐标才能有意义。
我建议您进行两次的反向转换。一旦屏幕附近的Z坐标(最接近观察者),并且在3D场景的背面有一个Z坐标。这两个3D点会给你一条3D线,它将占据2D点“后面”的所有位置。
答案 1 :(得分:2)
如果你考虑一下,几个3d坐标会被投射到屏幕上的同一个点,只知道屏幕坐标不足以检索原始坐标。
[编辑] 查看你的屏幕坐标,你给它们所有的z值0.这意味着你的投影矩阵的最后一列应该全部为零,使该矩阵不可逆。
答案 2 :(得分:2)
屏幕上的每个像素代表从旁观者的眼睛到屏幕后面的虚拟3D世界的一条线。你必须将这条线与该世界潜伏的任何物体相交以获得3D坐标。