首先在main函數(shù)里面注冊(cè)函數(shù)回調(diào)
//注冊(cè)回調(diào)函數(shù)(改變尺寸)
? ? glutReshapeFunc(ChangeSize);
? ? //點(diǎn)擊空格時(shí),調(diào)用的函數(shù)
? ? glutKeyboardFunc(KeyPressFunc);
? ? //特殊鍵位函數(shù)(上下左右)
? ? glutSpecialFunc(SpecialKeys);
? ? //顯示函數(shù)
? ? glutDisplayFunc(RenderScene);
函數(shù)說(shuō)明
ChangeSize函數(shù)
主要是用來(lái)設(shè)置視口大小以及當(dāng)視口發(fā)生變化時(shí)調(diào)用的,我們需要在這里使用投影矩陣,對(duì)于3D圖形要?jiǎng)?chuàng)建透視投影viewFrustum
//參數(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ù)
初始化manager,設(shè)置矩陣堆棧,設(shè)置頂點(diǎn)
? ? //設(shè)置變換管線以使用兩個(gè)矩陣堆棧
transformPipeline.SetMatrixStacks(modelViewMatrix,projectionMatrix);
RenderScene函數(shù)
RenderScene函數(shù)向棧中壓入一個(gè)單元矩陣:主要是為了圖形繪制完成后,矩陣的復(fù)原,所以此時(shí)棧中有兩個(gè)單元矩陣(ChangeSize中一開始加載了一個(gè)單元矩陣)
modelViewMatrix.PushMatrix();
將cameraFrame構(gòu)建為 觀察者矩陣,將棧頂單元矩陣取出,與觀察者矩陣相乘,得到新的觀察者矩陣,再將其入棧
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
將objectFrame構(gòu)建為 物體矩陣,取出棧頂?shù)挠^察者矩陣,與物體矩陣相乘,得到模型視圖矩陣,并將其入棧
M3DMatrix44fmObjectFrame;
? ? //只要使用 GetMatrix 函數(shù)就可以獲取矩陣堆棧頂部的值,這個(gè)函數(shù)可以進(jìn)行2次重載。用來(lái)使用GLShaderManager 的使用?;蛘呤谦@取頂部矩陣的頂點(diǎn)副本數(shù)據(jù)
? ? objectFrame.GetMatrix(mObjectFrame);
? ? //矩陣乘以矩陣堆棧的頂部矩陣,相乘的結(jié)果隨后簡(jiǎn)存儲(chǔ)在堆棧的頂部
? ? modelViewMatrix.MultMatrix(mObjectFrame);
然后利用固定管線渲染圖形,在圖像渲染完成后,將棧中模型視圖矩陣pop,恢復(fù)其初始狀態(tài)。
? ? shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
//還原到以前的模型視圖矩陣(單位矩陣)
? ? modelViewMatrix.PopMatrix();
? ? // 進(jìn)行緩沖區(qū)交換
? ? glutSwapBuffers();
其中,變換管道通過(guò)get可獲得的矩陣有4種
GetProjectionMatrix() ?投影矩陣
GetNormalMatrix() ?法線矩陣
GetModelViewMatrix() ?模型視圖矩陣,簡(jiǎn)稱mv
GetModelViewProjectionMatrix() ?模型視圖投影矩陣,簡(jiǎn)稱mvp