美文网首页
OpenGL综合练习:大球自转+小球公转+移动

OpenGL综合练习:大球自转+小球公转+移动

作者: w執念 | 来源:发表于2020-07-18 20:09 被阅读0次

该案例的实现效果是在一个场景中绘制地板、大球、小球、公转自转和相机的移动,其中结合了OpenGL中大部分知识点,我们先看看最终的效果


效果图.gif

可以看到,这最终效果主要有以下3部分构成:
1.绿色的地板
2.自转的红色大球
3.50个随机分布的蓝色小球以及1个围绕大球公转的动态小球
下面我们主要说说这三部分是如何绘制的

地板

地板的绘制主要分为两步:
1.SetupRC函数:准备地板的顶点数据
2.RenderScene函数:利用平面着色器绘制地板

//SetupRC中
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();
//RenderScene中
 static GLfloat vFloorColor[] = { 0.0f, 1.0f, 0.0f, 1.0f};//颜色值
 shaderManager.UseStockShader(GLT_SHADER_FLAT,
                                 transformPipeline.GetModelViewProjectionMatrix(),
                                 vFloorColor);
 floorBatch.Draw();

大球

绘制大球,并实现其自转功能,主要步骤如下:
1.SetupRC函数:利用系统类创建大球
2.RenderScene函数:首先设置一个定时器,通过这个定时器得到弧度,再通过大球的绘制配合旋转方法实现大球的自转。这里为了可以直观的看到效果,我对大球设置了一个线填充

 gltMakeSphere(torusBatch, 0.3f, 40, 80);//后三个为球半径,片段数,堆叠数
static GLfloat vTorusColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
//设置点光源位置
M3DVector4f vLightPos = {0,10,10,1};
modelViewMatrix.Translate(0.0f, 0.2f, -3.0f);
modelViewMatrix.PushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//设置线填充
modelViewMatrix.Rotate(yRot, 0, 1, 0);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transform Pipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),vLightPos,vTorusColor);
torusBatch.Draw();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
modelViewMatrix.PopMatrix();

小球

大球绘制完后,我们继续绘制小球,方法如下:
1.SetupRC函数:初始化小球数据
2.RenderScene函数:首先绘制50个静态小球,每绘制一个小球都需要进行push和pop操作,再矩阵通过堆栈记录旋转+平移的变换,绘制动态小球。

gltMakeSphere(sphereBatch, 0.1f, 13, 26);
for (int i = 0; i < NUM_SPHERES; i++) {        
        //y轴不变,X,Z产生随机值
        GLfloat x = ((GLfloat)((rand() % 400) - 200 ) * 0.1f);
        GLfloat z = ((GLfloat)((rand() % 400) - 200 ) * 0.1f);
        //对spheres数组中的每一个顶点,设置顶点数据
        spheres[i].SetOrigin(x, 0.0f, z);
}
 //绘制静态小球
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();
    }
    
// 矩阵堆栈记录旋转,平移操作
    modelViewMatrix.Rotate(yRot * -1.0f, 0, 1, 0);
    modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),vLightPos,vSpereColor);
    sphereBatch.Draw();

注:这里的rotate+tranalate的顺序是不能互换的,因为矩阵相乘是叉乘,不满足交换律,修改后会产生不同的效果,具体大家可以自己修改代码尝试一下。

完整的代码见OpenGL整合

相关文章

  • OpenGL综合练习:大球自转+小球公转+移动

    该案例的实现效果是在一个场景中绘制地板、大球、小球、公转自转和相机的移动,其中结合了OpenGL中大部分知识点,我...

  • 案例09:球体世界

    OpenGL + OpenGL ES +Metal 系列文章汇总 本案例是基于案例06:大球自转+小球公转+移动的...

  • OpenGL综合案例(大球自转,小球公转)

    在之前我写过几篇博客,关于OpenGL的一些专业名词的介绍,绘制一些简单的图形(三角形,正方形,球,金字塔等图案)...

  • OpenGL纹理下的球体世界

    一.先看看整体效果 二.绘制流程 在OpenGl综合案例(地板,大小球,公转,自转,移动)文章中,我们绘制了大小球...

  • OpenGL(七) OpenGL综合学习——大球、小球公转自转

    我们先来看看具体效果 setupRC函数 该函数主要是数据初始化,包括顶点、纹理等。 由于使用了3种纹理,因此传入...

  • OpenGL 综合案例的学习

    利用前面学过的知识,来做一个综合的练习,包括地板的绘制、大球的自转,小球的公转以及观察者的移动。实现效果如下: 代...

  • OpenGL案例05:大球自转+小球公转+移动

    这个案例是OpenGL中的一个比较经典的综合案例,结合了OpenGL中大部分知识点,下面就来了解下这个案例 先来看...

  • OpenGL-公转自转demo

    开场白 本文主要介绍用OpenGL实现的效果:大球自转,小球围绕大球公转的效果。如图: 示例代码地址本例中使用的是...

  • OpenGL纹理综合案例

    之前用OpenGL做了一个关于大球公转,小球自转的案例,现在我们通过纹理去绘制大球小球和地板,呈现出一个有倒影的画...

  • OpenGL案例08:球体世界

    本案例是基于案例06:大球自转+小球公转+移动[https://www.jianshu.com/p/4896498...

网友评论

      本文标题:OpenGL综合练习:大球自转+小球公转+移动

      本文链接:https://www.haomeiwen.com/subject/pryfkktx.html