之前讲了很多关于OpenGL
相关的案例,接下来用一个综合的案例,来熟悉一下OpenGL
相关的API
,以便于更深入的了解OpenGL
相关的使用。
可以先看一下效果图

整体流程图如下所示

在绘制出整体效果之前,我们把总的流程分为四步:
- 地板
- 打球带自传
- 小球(包含50个动态小球+一个围绕大球公转的小球)
- 移动
相信我们之前的案例解析中,大家对于这几个函数内部的使用,已经非常熟悉,如果不熟悉的大家可以翻看我以前的博客,绘制正放形。
地板
//3. 地板数据(物体坐标系)
floorBatch.Begin(GL_LINES, 324);
for(GLfloat x = -20.0; x <= 20.0f; x+= 0.5) {
floorBatch.Vertex3f(x, -0.55f, 20.0f);
floorBatch.Vertex3f(x, -0.55f, -20.0f);
floorBatch.Vertex3f(20.0f, -0.55f, x);
floorBatch.Vertex3f(-20.0f, -0.55f, x);
}
floorBatch.End();
大球
绘制过程中,其实跟其他的案例没有什么区别,只是多了个定时器设置,让大球和要公转的小球自动的旋转。相似的代码我这里就不在叙述,我这里只列出来函数中跟以前不太一样的地方加以注释,大家有什么都可以看Demo
。
// 动画
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds()*60.0f;
//大球自传
modelViewMatrix.PushMatrix();
modelViewMatrix.Rotate(yRot, 0, 1, 0);
小球
//8. 小球
for (int i = 0; i < NUM_SPHERES; i++) {
modelViewMatrix.PushMatrix();
modelViewMatrix.MultMatrix(spheres[i]);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),vLightPos,vSpereColor);
sphereBatch.Draw();
modelViewMatrix.PopMatrix();
}
公转的小球
这里平移小球是为了让公转可视化,因为小球的位置和大球是重叠的。
//9.让一个小球围着大球公转
modelViewMatrix.Rotate(yRot * -2.0f, 0, 1, 0);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
详细Demo。
网友评论