該案例主要是對(duì)常見的圖元連接方式的運(yùn)用沿腰,常見的基本圖元連接方式見此鏈接
最終實(shí)現(xiàn)的效果如圖所示:
如圖所示颂龙,整體的繪制流程如下
- main函數(shù):程序入口
- ChangeSize函數(shù):主要是設(shè)置視口及投影方式
- SetupRC函數(shù):圖形數(shù)據(jù)配置,主要是頂點(diǎn)數(shù)據(jù)及圖元連接方式
- RenderScene函數(shù):主要用于圖形的繪制措嵌,可以系統(tǒng)觸發(fā),也可以開發(fā)者手動(dòng)觸發(fā)
- SpecialKeys函數(shù):對(duì)特殊鍵位的回調(diào)處理
- KeyPressFunc:針對(duì)空格鍵的回調(diào)處理
- DrawWireFrameBatch:用于立體圖形的填充及邊框繪制
主要對(duì)其中三個(gè)函數(shù)進(jìn)行一些說(shuō)明
ChangeSize函數(shù)
在之前的demo中枫慷,changeSize主要是用來(lái)設(shè)置視口大小以及當(dāng)視口發(fā)生變化時(shí)調(diào)用的浪规,而本案例中立體圖形的繪制需要使用投影矩陣流礁,因此需要在該函數(shù)中設(shè)置投影矩陣
主要涉及以下幾個(gè)步驟
- 設(shè)置圖形投影的方式:因?yàn)槭橇Ⅲw圖形罗丰,所以選擇透視投影
//參數(shù)1:垂直方向上的視場(chǎng)角度
//參數(shù)2:視口縱橫比 = w/h
//參數(shù)3:近裁剪面距離
//參數(shù)4:遠(yuǎn)裁剪面距離
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 500.0f);
- 通過(guò)設(shè)置的投影方式獲得投影矩陣,并將其存入投影矩陣中
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
- 初始化模型視圖矩陣堆棧找御,壓入一個(gè)單元矩陣
modelViewMatrix.LoadIdentity();
SetupRC函數(shù)
從流程圖上可以看出绍填,除了基本的背景色設(shè)置霎桅,存儲(chǔ)著色器初始化以及頂點(diǎn)數(shù)據(jù)的創(chuàng)建及傳輸外盖溺,還需要對(duì)陣矩陣及觀察者做一下設(shè)置
- 將模型視圖矩陣和投影矩陣放到變換管道中儒将,變換管道的作用是能幫助快速進(jìn)行矩陣相乘揭糕,在RenderScene函數(shù)中可以直接通過(guò)變換管道的Get方法得到相應(yīng)的矩陣
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
其中锻霎,變換管道通過(guò)get可獲得的矩陣有4種
方法 | 說(shuō)明 |
---|---|
GetProjectionMatrix() | 投影矩陣 |
GetNormalMatrix() | 法線矩陣 |
GetModelViewMatrix() | 模型視圖矩陣,簡(jiǎn)稱mv |
GetModelViewProjectionMatrix() | 模型視圖投影矩陣旋恼,簡(jiǎn)稱mvp |
- 設(shè)置觀察者位置
cameraFrame.MoveForward(-15.0f);
觀察者位置的設(shè)置有三種
方法 | 說(shuō)明 |
---|---|
void MoveForward(float fDelta) | 向外移動(dòng)的像素點(diǎn),修改z |
void MoveUp(float fDelta) | 向上移動(dòng)的像素點(diǎn)产徊,修改y |
void MoveRight(float fDelta) | 向右移動(dòng)的像素點(diǎn),修改x |
RenderScene函數(shù)
其流程如下所示舟铜,主要是立體圖形的渲染過(guò)程
從流程圖中可以看出,這個(gè)過(guò)程是將物體坐標(biāo)轉(zhuǎn)換為裁剪坐標(biāo)奕谭,然后經(jīng)過(guò)OpenGL的處理痴荐,轉(zhuǎn)換為NDC血柳,并顯示到屏幕上的一個(gè)過(guò)程生兆。在此過(guò)程中棧的變化如下所示
- ChangeSize函數(shù)中向棧中初始化了一個(gè)單元矩陣
- RenderScene函數(shù)中再次向棧中壓入一個(gè)單元矩陣:主要是為了圖形繪制完成后,矩陣的復(fù)原根吁,所以此時(shí)棧中有兩個(gè)單元矩陣
modelViewMatrix.PushMatrix();
- 將cameraFrame構(gòu)建為 觀察者矩陣合蔽,將棧頂單元矩陣取出击敌,與觀察者矩陣相乘拴事,得到新的觀察者矩陣,再將其入棧
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
- 將objectFrame構(gòu)建為 物體矩陣刃宵,取出棧頂?shù)挠^察者矩陣,與物體矩陣相乘哮针,得到模型視圖矩陣坦袍,并將其入棧
- 然后利用固定管線渲染圖形十厢,在圖像渲染完成后键闺,將棧中模型視圖矩陣pop澈驼,恢復(fù)其初始狀態(tài)。
具體代碼見Github 04_OpenGL點(diǎn)/線...
最后,附一個(gè)圓形中頂點(diǎn)坐標(biāo)(x挎塌,y)的求解圖示
補(bǔ)充:
圖形中關(guān)于邊框的繪制的詳解見案例03 補(bǔ)充:金字塔等圖形邊框的繪制