如何在2D中将2D坐标反转投影到z = n平面

时间:2013-12-08 12:57:24

标签: opengl 3d webgl

我想将2D坐标“取消投影”回3D空间,到达给定的z平面。 (其中z是已知的,投影的二维坐标和使用的pMatrixmvMatrix也是如此。

网络搜索仅显示gluUnProject的变体,其使用方式完全不同。

1 个答案:

答案 0 :(得分:1)

首先确保您的屏幕坐标位于正确的坐标空间中,即-11之间。

然后,您需要将投影和模型视图矩阵组合成一个矩阵。为方便起见,使用Javascript和glMatrix的示例代码:

var m = mat4.create();
mat4.multiply(m, pMatrix, mvMatrix);

在维基百科上,您可以找到基本的formula used with projection。将这些乘法分解并为xy求解它们会给你(mxMaxima的截图):

Perspective matrix solved for x and y 请注意索引中的列主格式。

此公式的JS版本(x2y2是投影的2d坐标,xy是原始的3d和原始的{{1} }已知):

z

作为奖励,您可以通过以下方式获得投影平面的距离:

var x=-((m[8]*(m[5]-m[6]*y2)+m[4]*(m[10]*y2-m[9])+(m[6]*m[9]-m[10]*m[5])*x2)*z+m[4]*(m[14]*y2-m[13])-m[12]*m[6]*y2+(m[13]*m[6]-m[14]*m[5])*x2+m[12]*m[5])/(m[4]*(m[2]*y2-m[1])-m[0]*m[6]*y2+(m[1]*m[6]-m[2]*m[5])*x2+m[0]*m[5]);
var y=((m[8]*(m[1]-m[2]*y2)+m[0]*m[10]*y2+(m[2]*m[9]-m[1]*m[10])*x2-m[0]*m[9])*z-m[12]*m[2]*y2+m[0]*m[14]*y2+(m[13]*m[2]-m[1]*m[14])*x2-m[0]*m[13]+m[1]*m[12])/(m[4]*(m[2]*y2-m[1])-m[0]*m[6]*y2+(m[1]*m[6]-m[2]*m[5])*x2+m[0]*m[5]);