zl程序教程

您现在的位置是:首页 >  其他

当前栏目

案例05:球的自转

案例 05
2023-09-27 14:25:58 时间

利用OpenGL中定时器 实现球体自转的效果 效果如图所示

微信图片_20220513234810.png

整体实现的流程图如下

微信图片_20220513234921.png


流程中的main、setupRC、DrawWireFrameBatch等函数与几何图形的绘制基本一致 这里就不再重复说明


着重说下RenderScene函数 这里包括定时器的开启及自转的实现


清理缓冲区 颜色和深度缓冲区开启定时器 基于时间的变化 获得旋转的角度 此时 就相当ios中NSTimer的创建
 //1、基于时间变化 CStopWatch--NSTimer定时器

 static CStopWatch rotTimer;

 //获得角度

 float yRot rotTimer.GetElapsedSeconds() * 60.0f;


根据模型变化 获得mvp矩阵


创建4个矩阵 平移、旋转、模型视图矩阵、模型视图投影矩阵将球围绕y轴旋转 得到旋转矩阵将平移矩阵 * 旋转矩阵 得到模型视图矩阵将模型视图矩阵与投影矩阵相乘 得到mvp矩阵。这里需要注意的是 mvp矩阵相乘是有顺序的 传入API的矩阵顺序必须先传p 再传mv 否则会发现没得我们想要的就跟 其根本原因是矩阵相乘不满足交换律 所以不能打乱它的顺序
//3、创建3矩阵: 平移、旋转、模型视图矩阵、模型视图投影

 M3DMatrix44f mTranslate, mRotate, mModelView, mModelViewProjection;

 //往z轴移动-2.5f

 m3dTranslationMatrix44(mTranslate, 0, 0, -2.5f);

 //围绕y轴旋转

 m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0, 1, 0);

 //矩阵相乘

 m3dMatrixMultiply44(mModelView, mTranslate, mRotate);

 //mvp是有顺序的 结果-p-mv 不满足交换律

// m3dMatrixMultiply44(mModelViewProjection, viewFrustum.GetProjectionMatrix(), mModelView);

 m3dMatrixMultiply44(mModelViewProjection, mModelView, viewFrustum.GetProjectionMatrix());


绘制球体交换缓冲区提交重新渲染 此时就相当于开启NSTimer 不断根据旋转的角度不断渲染球 实现自转的效果
下落棋 能够画出9*9格,有两个棋手A,B,交替输入列数0-9,由于重力原理,输入这个列下几行没有棋子,则自动下落;A显示棋子是X,B显示棋子O,要求当出现四连胜利!A和B交替进行: