我强烈建议你研究一些线性代数或矩阵数学用于3d图形.它既有趣又简单,但比SO答案要长一点.我会尝试:)免责声明:我不知道你正在使用的API!

看起来你正在为一个位置返回3个坐标(通常称为顶点).但是你也提到了一个投影矩阵,该函数有4个坐标.通常,着色器或API将为顶点采用4个坐标. X,Y,Z,W上.要在屏幕上显示它们,它会执行以下操作:

xscreen = x/w
yscreen = y/w
zbuffer = z/w

这很有用,因为你可以选择w.如果你只是做2d绘图,你可以把w = 1.但是,如果你正在做3D并想要一些透视效果,你想要除以相机的距离.这就是投影矩阵的用途.它主要取你的点的z,其中z表示与相机的距离并将其置于w中.它也可以扩展一些东西,比如视野.

回顾一下您发布的代码,这正是最后一个ScreenXImpl函数所做的.

它应用一个投影矩阵,它主要只是将z移动到w,然后除以w.最后它做了一个额外的比例并从(-1,1)偏移到(0,widhtinpixels),但我们可以忽略它.

现在,我为什么要谈论这些东西呢?你想要做的就是获得给定的xscreen,yscreen,zbuffer的x,y,z坐标,对吗?好吧,诀窍就是倒退了.为了做到这一点,你需要牢牢抓住前进:)

倒退有两个问题:1)你真的知道或关心zbuffer值吗? 2)你知道投影矩阵是做什么的吗?

1)让我们说我们不在乎.这有很多可能的值,所以我们可能只选择一个.对于2)你将不得不看看它做了什么.一些投影矩阵可能只取(x,y,z,w)和输出(x,y,z,1).那将是2d.或(x,y z,z,1)将是等距的.但从视角来看,它通常会(x,y,1,z).加上一些缩放等等.

我刚注意到你的第二个screenXImpl已经将x,y,z,w传递到下一个阶段.这有时是有用的,但是对于w将为1的所有实际情况.

在这一点上,我意识到我在解释事情上很糟糕. :)你真的应该拿起那本线性代数书,我从这一本书中学到了:http://www.amazon.com/Elementary-Linear-Algebra-Howard-Anton但它带来了一个很好的讲座,所以我不知道它有多么有用.

无论如何!让我们变得更实际.回到你的代码:screenXImpl的最后一个功能.我们现在知道输入w = 1并且ow = ~z和ox = ~x;这里的波浪线意味着一些规模加上一些偏移.我们必须开始的屏幕x是~ox / ow. (1/2,*宽..这是波浪线的意思).现在我们回到1)…如果你想要一个特殊的盎司 – 现在选择一个.否则,我们可以挑选任何.对于渲染,在相机前挑选任何东西并且易于使用可能是有意义的.喜欢1.

protected float screenXImpl(float x, float y, float z, float w==1) {
float ox = 1*x + 0*y + 0*z + 0*w; // == x
float ow = 0*x + 0*y + 1*z + 0*w; // == z == 1
ox /= ow; // == ox
float sx = width * (1 + ox) / 2.0f;
return sx;
}

WTF? sx =宽*(1牛)/ 2?我为什么不这么说呢?好吧,我放在那里的所有零都可能不是零.但它最终会变得如此简单.可能不是那些人.我试图展示你必须做出的重要假设才能回归.现在它应该像从sx回到牛一样容易.

那是困难的部分!但你仍然需要从最后一个功能到第二个功能.我想第一个第二个很容易. :)该函数正在进行线性矩阵变换.这对我们有好处.它需要输入四个值(x,y,z)和(w = 1)隐式输出四个其他值(ax,ay,az,aw).我们可以弄清楚如何手动返回那里!我必须在学校这样做..四个未知数,四个方程式.你知道ax,ay,az,aw …求解x,y,z你得到w = 1是免费的!非常可能和良好的运动,但也很乏味.好消息是这些方程的编写方式称为矩阵. (x,y,z,1)* MODELMATRIX =(ax,ay,az,aw).真的很方便,因为我们可以找到MODELMATRIX ^ -1.它被称为逆!就像1/2是2乘以实数的倒数,或-1是加1的倒数.你真的应该读一下这很有趣而不是很难,顺便说一下:).

无论如何,使用任何标准库来获得模型矩阵的逆.可能类似于modelView.Inverse().然后用它做同样的功能然后你倒退.简单!

现在,为什么我们之前没有对PROJECTION矩阵做同样的事情呢?很高兴你问!那一个需要4个输入(x,y,z,w)并且只吐出三个输出(screenx,screeny,zbufferz).所以没有做出一些假设我们无法解决它!一个直观的方式来看,如果你有一个3d点,你在二维屏幕上投影,那将会有很多可能的解决方案.所以我们必须选择一些东西.而且我们不能使用方便的矩阵逆函数.

如果这有点有帮助,请告诉我.我觉得它不是,但我写得很开心!另外google for unproject in processing给出了这个:http://forum.processing.org/topic/read-3d-positions-gluunproject