2013年8月29日 星期四

Rendering 3D Anaglyph in OpenGL - 4

since: 2013/08/24
update: 2013/08/29

reference:
0. 原文: Rendering 3D Anaglyph in OpenGL
1. I touchs: Rendering 3D Anaglyph in OpenGL - 1
2. I touchs: Rendering 3D Anaglyph in OpenGL - 2
3. I touchs: Rendering 3D Anaglyph in OpenGL - 3

G.
立體視錐變量

      1. 到此為止, 我們已經有充分的認識, 可以計算立體視錐的變量, 以用在將來的
          OpenGL 程式中. 觀察以下的圖示:

                                                      圖九: 計算視錐變量

      2. 雖然上面這張圖看起來蠻可怕的, 但是實際上並沒有加入新的資料. 如果, 到
          目前為止你都瞭解所有討論的東西, 你將可以輕而易舉地從頭到尾聽懂這簡單
          的計算. 如之前所述, 二個攝影機位在 X 軸上的 L 點與 R 點. L與R這二點的間隔
          為 Deye, 並且它們的位移是對稱於原點的. 二台攝影機的方向是平行的, 都是
         朝著負 Z 軸方向. 視錐的近截距(near clipping distance)為 Dnear , 收斂距離為 C.
         從頂視圖來看, 虛擬螢幕的二個端點為 A 與 B. A 點為二個視錐的左邊會合之處,        
         而 B 點為二個視錐的右邊會合之處.

      3. 在 OpenGL 中, 建立非對稱視錐的唯一方式是經由 glFrustum(). 而 
           gluPerspective() 只能建立對稱的視錐, 因此在此例中不能使用.
           gluPerspective() 採用自然觀看的變量, 例如: 沿著 Y 方向的視野
           (field of view) θFOVY (見: 圖. 七(a)), 以及視錐的寬高比(aspect ratio),
           近截距和遠截距. 然而, 對於 glFrustum(), 你必須要提供近截面
           (near clipping plane)的上, 底, 左與右邊的座標, 而且還要有近截距和遠截距.
           我們將會從上方的二個視錐幾何中, 計算這些變量.

      4. 在圖中, 對應於虛擬螢幕的單一視錐等同於 AOB. 其沿著 Y 方向的視野為:
          θFOVY , 並且寬高比為 raspect (在 gluPerspective() 中也是如此).
         
      5. glFrustum() 函式:
          glFrustum( GLdouble leftX, GLdouble rightX,
                                GLdouble bottomY, GLdouble topY,
                                GLdouble nearZ, GLdouble farZ);


      6. 所以, glFrustum() 中的頂部和底部座標計算為: 

top=DneartanθFOVY2


bottom=top

          這些值, 同時適用於左邊和右邊的視錐.

          虛擬螢幕的一半寬度 a 為:

a=raspectCtanθFOVY2

         接著, 看看左邊的視錐 ALB. 近截面與 LL 左邊相交的距離為 dleft , 而與 LL
         右邊相交的距離為 dright. 在三角形 ΔALL 與三角形 ΔBLL中,

dleftb=drightc=DnearC
         而且, 我們也知道:
b=aDeye2

c=a+Deye2

         所以, 我們就能夠很快地計算出 dleftdright. 同樣地, 在右邊的視錐 ARB 中,
         藉由交換 b 與 c 的值, 就可以獲得 dleftdright 的值. 

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。