2011-05-23 156 views
6

我想在OpenGL中創建一個傾斜(騎士)投影。我知道這個操作不是默認支持,而是我需要一個剪切矩陣,然後做一個正交投影。opengl斜投影

你能告訴我什麼是我必須做的OpenGl步驟/功能嗎?

回答

13

我以前沒使用斜/騎士的投影,但下面應該給你如何進行一個想法:

創建一個4x4矩陣剪切,

H(θ, Φ) = | 1, 0, -cot(θ), 0 | 
      | 0, 1, -cot(Φ), 0 | 
      | 0, 0, 1, 0 | 
      | 0, 0, 0, 1 | 

θ是X中的剪切力,Φ是Y中的剪切力,而Z是獨立的。

ref: slide 11 of http://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf

乘上你的正投影,

| 2/(r-l),  0,  0, -(r+l)/(r-l) | 
| 0, 2/(t-b),  0, -(t+b)/(t-b) | 
| 0,  0, 2/(f-n), -(f+n)/(f-n) | 
| 0,  0,  0,   1  | 

(由左,右,底部,頂部描述,遠近)

(參考:http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29

然後OpenGL允許你通過函數直接上傳這個矩陣(作爲16個浮點數組):

GLfloat proj[16] = { ... }; 
glMatrixMode(GL_PROJECTION); // Make sure we're modifying the *projection* matrix 
glLoadMatrixf(proj);   // Load the projection 

對於深入瞭解更在觀看和變換在OpenGL中是如何工作的,我想請您看看Chapter 3 of the OpenGL "Red Book"。在那裏,他們使用glOrtho()來創建和應用正交投影。

編輯:

由於datenwolf指出,請記住,在OpenGL中的矩陣元素在列優先順序指定。

6

OpenGL允許您指定任意投影矩陣。構建期望的投影矩陣自己在每個維度傳入頂點到-1的範圍內映射到1,然後使用

GLfloat custrom_projection[16] = { 
    ... 
}; 
glMatrixMode(GL_PROJECTION); 
glLoadMatrix(custom_projection); 

OpenGL的索引在式柱主要順序的矩陣元素加載它,即

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 
0

由於所謂的傾斜投影是通過將投影平面旋轉一段距離右側的一個角度而獲得的,這個角度除了沿着旋轉軸線產生一個延長的圖像外,我認爲正好可以縮放垂直正交沿着該軸投影,增加了\csc\theta。這個說法可以通過三角相等證明,例如\sin\theta+\cos\theta \cot\theta=\csc\theta。如果您的傾斜投影由\theta\phi指定(如盧克的答案中所示),則可以根據這兩個角度(例如\arctan(\tan\theta\sqrt(1+\cot^2\phi)))將軸角度計算爲三角函數。