? ? ? V表示攝像機的觀察矩陣(View Matrix),它的作用是把對象從世界坐標系變換到攝像機坐標系。因此,對于世界坐標系下的坐標值worldCoord(x0, y0, z0),如果希望使用觀察矩陣VM將其變換為攝像機坐標系下的坐標值localCoord(x’, y’, z’),則有:
localCoord = worldCoord * VM
此外,觀察矩陣可理解為“攝像機在世界坐標系下的位姿矩陣的逆矩陣”,也可理解為"世界坐標系在攝像機坐標系下的位姿矩陣。因此Camera 類也專門提供了getInverseViewMatrix 這樣一個函數,它的實際意義是表示攝像機在世界坐標系下的位置;而Camera 類的getViewMatrix函數則表示世界坐標系下的某個物體的位姿矩陣變換到以攝像機坐標系為基準下的矩陣。這個有點繞,具體參見如下博文:
淺談在操控器類中,為何要通過osgGA::CameraManipulator的逆矩陣改變視點位置
? ? ? ? P 表示投影矩陣(Projection Matrix),當我們使用 setProjectionMatrixAsPerspective 之類的函數設置攝像機的投影矩陣時,我們相當于創建了一個視截錐體,并嘗試把包含在其中的場景對象投影到鏡頭平面上來。如果投影矩陣為PM,而得到的投影坐標為projCoord(x”, y”, z”)的話,那么:
projCoord = localCoord * PM
? ? ? W表示視口矩陣(Window Matrix),它負責把投影坐標變換到指定的二維視口(viewport)中去, 對于視口矩陣WM,通過下面的公式可以得到最終的窗口坐標windowCoord(x”', y”', 0):
windowCoord = projCoord * WM
將所有的公式整合之后,得到:
windowCoord = worldCoord * VM * PM * WM
而這個所謂的窗口坐標windowCoord,實際上也就是世界坐標系下的坐標值worldCoord 在指定的攝像機視口中(也就是我們的屏幕上)對應的平面位置。怎么樣,不知不覺中,我 們已經實現了gluProject函數所完成的功能了。記:
VPW = VM * PM * WM
則:
windowCoord = worldCoord * VPM
?對上式左右兩邊乘以VPM的逆,如下:
即反轉這三個步驟就可以得到視口中指定位置所對應的世界坐標了(也就是gluUnProject的工作)即:
參考資料:
【1】:王銳 .《最長的一幀》?