LearnOpenGL-P7 立方體三維空間坐標(biāo)轉(zhuǎn)換

0 上一章講到移動旋轉(zhuǎn)和縮放一個2維平面上的圖像。本章將要講的內(nèi)容是如何繪制3維場景中的立方體,并讓其在三維場景中做移動旋轉(zhuǎn)。
(1)將2維矩形圖像通過MVP轉(zhuǎn)換矩陣轉(zhuǎn)成3維空間中的矩形圖片。
(2)在三維空間中繪制一個立方體,并讓其在三維空間中進行旋轉(zhuǎn)。
(3)在三維空間中繪制多個立方體,并將其擺放到不同的位置,以不同的速率進行自轉(zhuǎn)。
?

1.0 坐標(biāo)系統(tǒng)的轉(zhuǎn)換流程如下圖:
(1)定義對象基于局部坐標(biāo)系上的坐標(biāo)位置向量。
(2)將對象局部坐標(biāo)系上的坐標(biāo)位置向量乘以“模型轉(zhuǎn)換矩陣“得到對象在世界坐標(biāo)系上的位置向量。
(3)確定好相機的位置,將“觀察矩陣“乘以對象世界坐標(biāo)系的坐標(biāo)向量得到對象在相機觀察空間上的位置向量。
(4)選擇正射或透視的投影方法,將“投影矩陣”乘以相機觀察空間中的位置向量得到裁剪空間中的位置向量。
(5)最后通過“視口變換”,將坐標(biāo)向量轉(zhuǎn)換到屏幕空間中進行輸出。

1.1 在頂點著色器中設(shè)置三個矩陣變量分別表示模型矩陣、觀察矩陣和投影矩陣。最后的點坐標(biāo)向量輸出為MVP和局部坐標(biāo)系點坐標(biāo)向量相乘的結(jié)果。(要注意矩陣的運算先后順序)。

1.2 在main()的渲染循環(huán)中,設(shè)置模型矩陣。讓模型在局部坐標(biāo)上繞x軸順時針旋轉(zhuǎn)55°。

1.3 設(shè)置擺好攝像機的位置(設(shè)置觀察矩陣),讓圖像在世界坐標(biāo)系的z軸負方向移動3個單位(相當(dāng)于把攝像機放在了世界坐標(biāo)系z軸正方向3個單位的位置處)。

1.4 創(chuàng)建投影矩陣(可選擇透視投影或正射投影)。

1.5 將我們設(shè)置好的mvp矩陣數(shù)據(jù)傳入著色器程序中。編譯運行程序,可得到圖像。



2 在三維空間中繪制一個立方體,并讓其在三維空間中進行旋轉(zhuǎn)。
2.0 設(shè)置立方體6個面36個角點的局部坐標(biāo)位置以及紋理坐標(biāo)位置。并解釋vertices中的頂點數(shù)據(jù),對應(yīng)頂點著色器。


2.1 將圖元繪制方式改為glDrawArrays(),由于沒有重復(fù)利用頂點數(shù)據(jù),所以暫時不按ebo的頂點索引規(guī)則繪制三角形。

2.2 設(shè)置好著色器源碼,暫時不需要傳入顏色變量。


2.3 編譯運行程序,可得到一個立方體。(此時立方體在z軸方向上圖像的前后關(guān)系是錯誤的)

2.4 在渲染循環(huán)中,將模型矩陣中的旋轉(zhuǎn)角度改為隨時間變化的動態(tài)轉(zhuǎn)動。編譯運行程序后可得到一個動態(tài)旋轉(zhuǎn)的但是前后關(guān)系錯誤的立方體。


2.5 打開Opengl的深度測試開關(guān),并在每次的渲染循環(huán)的起始處清空深度緩沖。編譯運行程序即可得到一個前后關(guān)系正確的旋轉(zhuǎn)的立方體。



2.6 我們還可以修改模型矩陣中旋轉(zhuǎn)軸的信息,讓立方體繞著不同的方向進行旋轉(zhuǎn)。


?

3 在三維空間中繪制多個立方體,并將其擺放到不同的位置,以不同的速率進行自轉(zhuǎn)。
3.0 設(shè)定10個立方體在世界坐標(biāo)中的移動位置向量數(shù)組。

?3.1 在渲染循環(huán)中,生成投影矩陣和觀察矩陣。并分別將其傳入著色器程序中。

3.2 綁定VAO對象,并循環(huán)繪制10個立方體。在每次循環(huán)中,我們先讓立方體旋轉(zhuǎn),再根據(jù)cubePositions數(shù)組中的向量分別將10個立方體移動至指定的位置。編譯運行程序,可得到10個不同位置的立方體以不同的速率自轉(zhuǎn)的場景。



