2012-03-28 57 views

回答

15

一點歷史在這裏需要。 GLM的unproject實際上是對使用不推薦的OpenGL固定功能渲染的gluUnProject函數的或多或少的直接替換。在這種模式下,模型和視圖矩陣實際上結合在「模型視圖」矩陣中。顯然,GLM筆者下降的命名,這更是混淆事物的「視圖」的一部分,但它歸結爲通過類似view*model

現在的實際使用:

  • 勝利是持有三個組件已經在窗口座標意義的載體。這些是視口中的座標'x,y',您通常通過讀取深度緩衝區來檢索'z'座標,如果您甚至想使用此功能,模型,視圖和投影矩陣應該自行說明。但一個好的(opengl專用)​​可能會有用。
  • 視區被定義爲在glViewport,這意味着(X,Y,W,H)。 X和Y指定視口的左下角(通常爲0,0)。寬度和高度(w,h)。請注意,在許多其他系統中,y,y指定左上角,那麼您必須轉換您的y座標,然後顯示在下面鏈接的NeHe代碼中。

應用時,您只需將提供的窗口座標轉換回對象座標,或多或少地與您的呈現代碼通常所做的相反。

對原始gluUnProject的半正式解釋可以找到NeHe article。但是,當然這是OpenGL特有的,而glm可以用在其他上下文中。

+3

除視區不被視爲矩陣。這是四個花車。因此,我對這些參數實際上在什麼順序等方面感到困惑。 – Puppy 2012-03-28 09:30:31

+0

@DeadMG:我已經更新了答案。 – KillianDS 2012-03-28 09:54:18

2

視區中傳遞四個浮點數:視口的x和y窗口座標,隨後其寬度和高度。這與使用的順序相同。通過glGetFloatv(GL_VIEWPORT, ...)。因此,在大多數情況下,前兩個值應爲0。

正如KillianDS已經指出的那樣,model說法其實是個模型視圖矩陣,看到的例子使用的unProject()gtx_simd_mat4.cpp,功能test_compute_gtx()

glm::mat4 E = glm::translate(D, glm::vec3(1.4f, 1.2f, 1.1f)); 
    glm::mat4 F = glm::perspective(i, 1.5f, 0.1f, 1000.f); 
    glm::mat4 G = glm::inverse(F * E); 
    glm::vec3 H = glm::unProject(glm::vec3(i), G, F, E[3]); 

如您所見,作爲第二個參數傳遞的矩陣基本上是翻譯和透視轉換的產物。