game programming (4)

三維圖形變換

 

 

向量、矩陣、平面以及相應的數學操作
三維點、齊次座標和變換矩陣
三維繪製流程
三維繪製中的變換
三維繪製流程
三維繪製中的變換
照相機系統和相機模型
視域、背面剔除和裁剪
齊次座標:
三維空間上的點 ( x,y,z ) T 可以表示爲四維空間中的一個齊次點 ( x,y,z,w ) T ,其中 w=1
用齊次座標表示空間中的點,能夠方便進行各種運算。同樣的,可將矩陣寫作齊次形式,即將原來的 3 x 3 大小的矩陣擴充爲 4 x 4 大小的矩陣。

 

 

 

 

 

 

對一個點或者向量進行變換等價於將一個矩陣乘以該點或向量的齊次座標 .
矩陣複合:
矩陣複合可完成對空間點的任意操作
矩陣乘法不滿足交換率,因此複合的次序非常重要!
例如:先縮放後平移 不等於 先平移後縮放
通常情況下,給出的旋轉矩陣是繞原點旋轉的。因此首先要將物體平移至原點,進行旋轉,再平移回來。

如何得到變換矩陣:
將物體平移至原點
繞座標軸旋轉
將物體重新平移至其原先的位置
圖形流水線中的物體座標系:
建模時所採用的座標系
選取物體上或靠近物體的某一點作爲原點,物體上的其他點相對於該點的座標進行表示
針對物體的局部座標系
圖形流水線中的世界座標系:
全局座標系
所有物體組成一個場景,場景座標系稱爲世界座標系
所有物體必須變換至該座標系,以確定彼此之間的相對空間位置
將物體放至場景內等價於定義一個從物體局部座標系至世界座標系的變換矩陣
場景需要定義光照

 

 

模型變換

 

將局部座標系變換到世界座標系
包括縮放、旋轉、平移等
相機變換
將世界座標系中的一點變換至照相機座標系
可以分成平移和旋轉兩部分

 

 

問題:透視投影矩陣?

 

透視變換規則:

利用相似三角形定理

 

背面剔除:

 

可見性測試在視見空間內進行。計算每一個多邊形的法向,並檢查法向與視線方向點積後值的符號,符號大於0保留
問題:
視線方向:眼睛到物體的向量。
那麼物體可見部分的法向與視線的點積應該小於0。
三維物體裁剪
用視域四棱錐對物體進行裁剪
視域四棱錐裁剪的四種情況:
兩個頂點完全位於視域四棱錐內,把第二個頂點加入輸出頂點表
第一個頂點在裁剪平面內側,第二個頂點在裁剪平面外側,將交點加入輸出頂點表
兩個頂點均在裁剪平面外側,輸出頂點表不加任何頂點
第一個頂點在裁剪平面外側,第二個頂點在裁剪平面內側,將交點和第二個頂點加入輸出頂點表
從世界座標系到屏幕座標系:
將物體從世界座標系變換至屏幕座標系,可以看成是:將物體首先作相機變換,再作透視變換
OpenGL 中的變換矩陣
相機變換: 指定照相機位置和方向 ( 也叫照相機座標系統 )
模型變換 : 將物體在場景中移動,也可以視爲從局部座標系到全局座標系
ModelView 變換 : 相機變換和模型變換的混合 .
投影變換 : 定義視域體並指向投影
視區變換 : 將二維投影后的場景變換到繪製窗口 .
將相機放置到世界座標系統中定義相機變換

      glMatrixMode (GL_MODELVIEW);

      glLoadIdentity ();

      gluLookAt ( eye.x , eye.y , eye.z , look.x ,

                       look.y , look.z , up.x , up.y , up.z );

 

 

 

ModelView 變換式建模矩陣 M 和相機變換 V 的乘積 C = VM
所有在 OpenGL 中的變換函數只能設置 modelview 矩陣 . 因此, ModelView 在物體被操作之前被調用 .

 

 

 

建模變換 :
glLoadIdentity :   C = I
glLoadMatrix (m) :  C =  m
glMultiMatrix (m) :  C = C m
glRotatef ( q,x,y,z ) :  C = C R (q)
glTranslatef ( x,y,z ) :  C = C T( x,y,z )
glScalef ( x,y,z ) :  C = C S( x,y,z )
平行(正交)投影
定義正交視域體 :

         glOrtho (left, right, bottom, top, near, far);

    或者 :   glOrtho2D (left, right, bottom, top);

定義投影矩陣 :

       glMatrixMode (GL_PROJECTION);

        glLoadIdentity ( );

       glOrtho (left,  right, bottom, top, near, far)

 

視域四堎錐的定義 :

     glFrustum (left,  right, bottom, top, near, far)

 

 

投影矩陣

glMatrixMode (GL_PROJECTION);

     glLoadIdentity ();

    glFrustum (left,  right, bottom, top,

                       near, far)

 

glMatrixMode (GL_PROJECTION);

    glLoadIdentity ();

    gluPerspective (angle, aspect, near, far)

 

glViewport ( GLint left, GLint bottom, GLint width,

                       GLint height)

 

 

發佈了28 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章