我想将2D坐标“取消投影”回3D空间,到达给定的z
平面。 (其中z是已知的,投影的二维坐标和使用的pMatrix
和mvMatrix
也是如此。
网络搜索仅显示gluUnProject
的变体,其使用方式完全不同。
答案 0 :(得分:1)
首先确保您的屏幕坐标位于正确的坐标空间中,即-1
和1
之间。
然后,您需要将投影和模型视图矩阵组合成一个矩阵。为方便起见,使用Javascript和glMatrix的示例代码:
var m = mat4.create();
mat4.multiply(m, pMatrix, mvMatrix);
在维基百科上,您可以找到基本的formula used with projection。将这些乘法分解并为x
和y
求解它们会给你(mxMaxima的截图):
请注意索引中的列主格式。
此公式的JS版本(x2
和y2
是投影的2d坐标,x
和y
是原始的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]);