利用OpenGL中定時(shí)器念秧,實(shí)現(xiàn)球體自轉(zhuǎn)的效果寿弱,效果如圖所示
案例——球自轉(zhuǎn)效果.gif
整體實(shí)現(xiàn)的流程圖如下
整體流程
流程中的main疤坝、setupRC摩泪、DrawWireFrameBatch等函數(shù)與幾何圖形的繪制基本一致故爵,這里就不再重復(fù)說(shuō)明
著重說(shuō)下RenderScene函數(shù),這里包括定時(shí)器的開(kāi)啟及自轉(zhuǎn)的實(shí)現(xiàn)
- 清理緩沖區(qū):顏色和深度緩沖區(qū)
- 開(kāi)啟定時(shí)器:基于時(shí)間的變化,獲得旋轉(zhuǎn)的角度,此時(shí)铡原,就相當(dāng)ios中NSTimer的創(chuàng)建
//1、基于時(shí)間變化 CStopWatch--NSTimer定時(shí)器
static CStopWatch rotTimer;
//獲得角度
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;
- 根據(jù)模型變化商叹,獲得mvp矩陣
- 創(chuàng)建4個(gè)矩陣:平移燕刻、旋轉(zhuǎn)、模型視圖矩陣剖笙、模型視圖投影矩陣
- 將球圍繞y軸旋轉(zhuǎn)卵洗,得到旋轉(zhuǎn)矩陣
- 將平移矩陣 * 旋轉(zhuǎn)矩陣,得到模型視圖矩陣
- 將模型視圖矩陣與投影矩陣相乘,得到mvp矩陣过蹂。這里需要注意的是十绑,mvp矩陣相乘是有順序的,傳入API的矩陣順序必須先傳p酷勺,再傳mv本橙,否則會(huì)發(fā)現(xiàn)沒(méi)得我們想要的就跟,其根本原因是矩陣相乘不滿足交換律脆诉,所以不能打亂它的順序
//3甚亭、創(chuàng)建3矩陣: 平移、旋轉(zhuǎn)击胜、模型視圖矩陣亏狰、模型視圖投影
M3DMatrix44f mTranslate, mRotate, mModelView, mModelViewProjection;
//往z軸移動(dòng)-2.5f
m3dTranslationMatrix44(mTranslate, 0, 0, -2.5f);
//圍繞y軸旋轉(zhuǎn)
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0, 1, 0);
//矩陣相乘
m3dMatrixMultiply44(mModelView, mTranslate, mRotate);
//mvp是有順序的:結(jié)果-p-mv,不滿足交換律
// m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(), mModelView);
m3dMatrixMultiply44(mModelViewProjection, mModelView, viewFrustum.GetProjectionMatrix());
- 繪制球體
- 交換緩沖區(qū)
- 提交重新渲染:此時(shí)就相當(dāng)于開(kāi)啟NSTimer偶摔,不斷根據(jù)旋轉(zhuǎn)的角度不斷渲染球暇唾,實(shí)現(xiàn)自轉(zhuǎn)的效果
完整的Demo實(shí)現(xiàn)見(jiàn)github - 05_OpenGL_03_球自轉(zhuǎn)