LearnOpenGL-P8 創(chuàng)建FPS游戲風(fēng)格的鏡頭調(diào)度

0 上一個(gè)章節(jié)我們將多個(gè)立方體隨機(jī)放置在了三維空間中,并讓立方體在各自的位置上自轉(zhuǎn)。本章我們將:
(1)創(chuàng)建攝像機(jī)矩陣,并調(diào)整視角讓攝像機(jī)圍繞著世界坐標(biāo)原點(diǎn)勻速旋轉(zhuǎn)。
(2)創(chuàng)造一個(gè)FPS游戲(First-person shooting game)攝像機(jī)風(fēng)格的視角,使用鍵盤(pán)的WSAD鍵控制攝像機(jī)的前后左右移動(dòng)。
(3)使用鼠標(biāo)滑動(dòng)來(lái)控制攝像機(jī)的俯仰角和偏航角,使用鼠標(biāo)滾輪來(lái)控制攝像機(jī)的投影視口角度。
(4)將攝像機(jī)抽象成camera類。
?

1 創(chuàng)建攝像機(jī)矩陣,并調(diào)整視角讓攝像機(jī)圍繞著世界坐標(biāo)中心勻速旋轉(zhuǎn)。
1.0 創(chuàng)建一個(gè)觀察矩陣,定義好攝像機(jī)在世界坐標(biāo)上的位置向量和目標(biāo)向量,由于我們的攝像機(jī)風(fēng)格是FPS的風(fēng)格,所以我將攝像機(jī)初始向上的向量設(shè)置為世界坐標(biāo)系的y軸正方向。由此可以計(jì)算出攝像機(jī)的三軸向量。將攝像機(jī)三個(gè)軸的向量值和攝像機(jī)位置向量代入到旋轉(zhuǎn)和位移矩陣中,即可得到觀察矩陣。



1.1 上述的觀察矩陣的生成過(guò)程比較麻煩,向量的構(gòu)造也很復(fù)雜。好在glm庫(kù)有包裝好的lookAt()接口供我們直接調(diào)用。

1.2 編譯運(yùn)行程序,可以得到一個(gè)擺放在我們正前方3個(gè)單位的多個(gè)立方體,此時(shí)的攝像機(jī)位于世界坐標(biāo)z軸正方向的3個(gè)單位處,鏡頭朝向正對(duì)著坐標(biāo)原點(diǎn)。

1.3 我們可以修改攝像機(jī)的位置,讓其繞著世界坐標(biāo)的y軸方向,沿著半徑為10個(gè)單位的圓周進(jìn)行旋轉(zhuǎn),在旋轉(zhuǎn)的過(guò)程中攝像機(jī)的朝向始終對(duì)準(zhǔn)著世界坐標(biāo)原點(diǎn)。



2 創(chuàng)造一個(gè)FPS游戲(First-person shooting game)攝像機(jī)風(fēng)格的視角,使用鍵盤(pán)的WSAD鍵控制攝像機(jī)的前后左右移動(dòng)。
2.0 將攝像機(jī)的位置和朝向等三個(gè)向量設(shè)置為全局變量。并設(shè)置好觀察矩陣。


2.1 在鍵盤(pán)按鍵回調(diào)函數(shù)里面設(shè)置好WSAD按鍵的觸發(fā)響應(yīng)方式。我們先設(shè)置好攝像機(jī)的移動(dòng)速度。當(dāng)觸發(fā)W和S時(shí),攝像機(jī)的位置向量將沿著攝像機(jī)的朝向做出改變。當(dāng)觸發(fā)A和D時(shí),我們需要先把攝像機(jī)朝前和朝上的向量進(jìn)行叉乘得到朝右的向量,此時(shí)攝像機(jī)的位置向量才能沿著朝右的向量方向做出改變。

2.2 按照前面設(shè)置的鍵盤(pán)響應(yīng)來(lái)控制攝像機(jī)會(huì)有一個(gè)問(wèn)題,那就是我們每次回調(diào)函數(shù)的觸發(fā)時(shí)機(jī)是跟本機(jī)的CUP處理速度相關(guān)的,CUP頻率越高,觸發(fā)的間隔就會(huì)越密,這會(huì)導(dǎo)致我們的程序在不同的機(jī)器上攝像機(jī)移動(dòng)的速度會(huì)不統(tǒng)一。為了解決這個(gè)問(wèn)題。我們需設(shè)置一個(gè)記錄每幀時(shí)間間隔的deltaTime。使用這個(gè)間隔時(shí)間來(lái)控制每幀中攝像機(jī)的移動(dòng)速度。



2.3 編譯運(yùn)行程序,我們可以通過(guò)觸發(fā)鍵盤(pán)的WSAD按鍵來(lái)控制攝像機(jī)位置。


3 使用鼠標(biāo)滑動(dòng)來(lái)控制攝像機(jī)的俯仰角和偏航角,使用鼠標(biāo)滾輪來(lái)控制攝像機(jī)的視口角度。
3.0 下圖是航空領(lǐng)域用到的表示飛機(jī)飛行姿態(tài)的參數(shù)。其中飛機(jī)繞x軸旋轉(zhuǎn)的角度為俯仰角(pitch)、繞y軸的旋轉(zhuǎn)角度為偏航角(yaw)、繞z軸的旋轉(zhuǎn)角度為滾轉(zhuǎn)角(roll)。

3.1 在全局變量位置處設(shè)置好攝像機(jī)姿態(tài)參數(shù)、鼠標(biāo)滑動(dòng)時(shí)在xy方向上產(chǎn)生的偏移量以及攝像機(jī)的投影視口夾角。

3.2 在創(chuàng)建窗口時(shí)設(shè)置好鼠標(biāo)滑動(dòng)和滾輪轉(zhuǎn)動(dòng)的回調(diào)。

3.3 實(shí)現(xiàn)鼠標(biāo)滑動(dòng)的回調(diào)。其中需要注意的是攝像機(jī)的俯仰角和偏航角根據(jù)鼠標(biāo)在xy方向上的偏移產(chǎn)生。鼠標(biāo)的滑動(dòng)轉(zhuǎn)換為攝像機(jī)狀態(tài)時(shí)同樣需要設(shè)置一個(gè)鼠標(biāo)靈敏度。攝像機(jī)的朝向則同時(shí)由俯仰角和偏航角根據(jù)三角關(guān)系獲得。為了不產(chǎn)生萬(wàn)向節(jié)死鎖等問(wèn)題,我們將俯仰角限制在正負(fù)89°之間。

3.4 設(shè)置鼠標(biāo)滾輪回調(diào)函數(shù),通過(guò)滾輪的滾動(dòng)量修改攝像機(jī)投影視口角度的大小。由于我們是FPS風(fēng)格的攝像機(jī),所以我們將角度限制在1到80°之間。


3.5 編譯運(yùn)行程序,此時(shí)我們可以通過(guò)鼠標(biāo)的移動(dòng)和滾輪滑動(dòng)來(lái)控制攝像機(jī)的朝向。

?

4 將攝像機(jī)抽象成camera類。
4.0 我們將散亂在各處的關(guān)于攝像機(jī)的代碼抽象出來(lái)整合成一個(gè)攝像機(jī)類進(jìn)行調(diào)用。

4.1 類具體實(shí)現(xiàn)都被封裝到接口中。


