坐標系統(tǒng)
有5個不同的坐標系統(tǒng)比較重要:
局部坐標(Local Coordinates):局部坐標是物體自身的坐標系統(tǒng),相對于物體自身的原點。
世界坐標(World Coordinates):世界坐標是指物體在整個場景中的位置和定位。這是一個全局坐標系統(tǒng),描述了物體相對于整個場景的位置。
觀察坐標(View Coordinates):也稱為相機坐標或視圖坐標,是指將物體從世界坐標系轉換到相機坐標系的坐標系統(tǒng)。
裁剪坐標(Clip Coordinates):裁剪坐標會被處理至-1.0到1.0的范圍內(nèi),并判斷哪些頂點將會出現(xiàn)在屏幕上。
屏幕坐標(Screen Coordinates):裁剪坐標通過視口變換映射到屏幕坐標,即glViewport函數(shù)所定義的坐標范圍內(nèi)。屏幕坐標描述了在屏幕上實際呈現(xiàn)的位置。
模型矩陣
局部坐標通過模型矩陣(Model Matrix)變換為世界坐標。模型矩陣是一種變換矩陣,它能通過對物體進行位移、縮放、旋轉來將它置于它本應該在的位置或朝向。
觀察矩陣
觀察坐標就是將世界空間坐標轉化為用戶視野前方的坐標。這通常是由一系列的位移和旋轉的組合來完成,它們通常存儲在一個觀察矩陣(View Matrix)中。
投影矩陣
將觀察坐標變換為裁剪坐標有兩種投影矩陣:正射投影矩陣(Orthographic Projection Matrix)和透視投影矩陣(Perspective Projection Matrix)。
正射投影矩陣定義了一個裁剪空間,在這空間之外的頂點都會被裁剪掉。創(chuàng)建一個正射投影矩陣需要指定可見空間的寬、高和長度,其中長度由遠近兩個平面確定。
我們使用函數(shù)glm::ortho()創(chuàng)建一個正射投影矩陣。

前兩個參數(shù)指定了空間的左右坐標,第三和第四參數(shù)指定了底部和頂部,最后兩個參數(shù)則定義了近平面和遠平面的距離。
我們使用函數(shù)glm::perspective()創(chuàng)建一個透視投影矩陣。

fov:視野(Field of View),通常以弧度為單位。
aspect:屏幕的寬高比(寬度除以高度)。
near:近裁剪平面的距離。
far:遠裁剪平面的距離。
3D化
一個頂點坐標將會根據(jù)以下過程被變換到裁剪坐標:

首先,需要創(chuàng)建一個模型矩陣。

這個矩陣讓平面繞x軸旋轉,使其看起來像一個水平面。
接下來是觀察矩陣。
注意:OpenGL中是右手坐標系,垂直于屏幕向外是正z軸方向。

這個矩陣讓觀察視角在場景中稍向后退。
最后是投影矩陣。

下一步就是把矩陣傳入著色器。
聲明uniform變量:

發(fā)送矩陣數(shù)據(jù):

最終效果如下:
