1
我想「將2D座標反投影回3D空間,到給定的z
平面。 (其中z是已知的,投影的2D配合物也是已知的,並且使用pMatrix
和mvMatrix
)。如何將2D座標反向投影到3D中的z = n平面
網頁搜索只顯示與gluUnProject
的變種具有完全不同的用途。
我想「將2D座標反投影回3D空間,到給定的z
平面。 (其中z是已知的,投影的2D配合物也是已知的,並且使用pMatrix
和mvMatrix
)。如何將2D座標反向投影到3D中的z = n平面
網頁搜索只顯示與gluUnProject
的變種具有完全不同的用途。
首先確保您的屏幕座標位於正確的座標空間中,即在-1
和1
之間。
然後,您需要將投影和模型視圖矩陣合併爲一個矩陣。使用JavaScript和glMatrix爲了方便示例代碼:
var m = mat4.create();
mat4.multiply(m, pMatrix, mvMatrix);
維基百科上,你可以找到基本formula used with projection。對於x
和y
分解出的乘法和解決這些問題會給你(從mxMaxima截圖):
注意在索引列優先格式。
的JS版本的式(帶x2
和y2
作爲投射二維座標,x
和y
是原始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];
原始2D座標系以什麼座標系開始?我有點驚訝你能夠在不知道視口映射的情況下做到這一點,但是假設你以窗口空間座標開始。 –
@ AndonM.Coleman二維座標必須位於「-1 .. + 1」空間。您只需將像素(鼠標)座標與視口的像素寬度和高度分開,因此(0,0)是視口的中心,幾乎肯定會否定「y」值。 - 其他(信息明智的)在你的兩個矩陣中。 – vbence