一.总体效果图
红球自转,蓝球围绕红球公转,并实现键盘按钮移动(推荐一款录屏并制作动图的软件---licecap,是一款屏幕录制工具,支持导出 GIF 动画图片格式,轻量级、使用简单,录制过程中可以随意改变录屏范围。运行后会以窗口的方式显示在桌面,拖动选取一个合适的大小范围。点击 Record 选取保存路径就开始录屏了,下载地址------https://474b.com/file/5288736-230664723)
绘制流程图:
二.绘制地板
三.绘制红球并自转
特别说明:
1)黑色是因为我关闭了深度测试,为了让自转效果看的清楚一点
2)modelViewMatrix.PushMatrix()和modelViewMatrix.PopMatrix()压栈和出栈是成对出现,其目的是告诉GLShaderManager shaderManager; // 着色器管理器我要使用不同的批次类画不同的图形,所以在代码中你会看到着色管理器调用批次类出现了两次:
//3.绘制地面
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vFloorColor);
//8.指定合适的着色器(点光源着色器)
shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(),
transformPipeline.GetProjectionMatrix(), vLightPos, vTorusColor);
不成对出现,会出现上一压栈的结果影响下一次图形绘制,特别注意出栈写的位置:
四.绘制小蓝球
五.绘制一个小蓝球并绕着红球公转,并让小蓝球自转
//13. 让一个小篮球围绕大球公转自转
modelViewMatrix.Rotate(yRot * -2.0f,0.0f,1.0f,0.0f);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f); shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF,transformPipeline.GetModelViewMatrix(),transformPipeline.GetProjectionMatrix(),vLightPos,vSphereColor);
sphereBatch.Draw();
modelViewMatrix.PopMatrix();
说明:开启了定时器,当前窗口会自动调用void RenderScene进行绘制,此时我们只需要改变这个小球的位置modelViewMatrix.Rotate(yRot * -2.0f,0.0f,1.0f,0.0f);控制小蓝球自转,modelViewMatrix.Translate(0.8f, 0.0f, 0.0f); 控制其位置,给观察者公转的视觉效果
说明:开启和关闭主要是为了我们看清楚效果图
六.移动
最后附上完整代码:链接: https://pan.baidu.com/s/1EfHD63f3hDBfd0fn0UYWNg 提取码: h7ew