2013-12-08 201 views
1

我想「將2D座標反投影回3D空間,到給定的z平面。 (其中z是已知的,投影的2D配合物也是已知的,並且使用pMatrixmvMatrix)。如何將2D座標反向投影到3D中的z = n平面

網頁搜索只顯示與gluUnProject的變種具有完全不同的用途。

回答

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作爲投射二維座標,xy是原始3D片源和原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]); 

作爲獎勵,你可以得到與投影面的距離爲:

var w = m[10]*z+m[6]*y+m[2]*x+m[14]; 
+0

原始2D座標系以什麼座標系開始?我有點驚訝你能夠在不知道視口映射的情況下做到這一點,但是假設你以窗口空間座標開始。 –

+0

@ AndonM.Coleman二維座標必須位於「-1 .. + 1」空間。您只需將像素(鼠標)座標與視口的像素寬度和高度分開,因此(0,0)是視口的中心,幾乎肯定會否定「y」值。 - 其他(信息明智的)在你的兩個矩陣中。 – vbence