经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
OpenGL 球体世界
来源:cnblogs  作者:春天里的花骨朵  时间:2018/11/27 10:12:43  对本文有异议

一、类似公自转

二、核心代码

//图形渲染

  1. void RenderScene()
  2. {
  3. //清楚缓存区:颜色缓存区、深度缓存区、模版缓存区
  4. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  5. //设置颜色:地板、甜甜圈、球体
  6. GLfloat vFloorColor[] = {0.0f, 1.0f, 0.0f, 1.0f};
  7. GLfloat vTorusColor[] = {1.0f, 0.0f, 0.0f, 1.0f};
  8. GLfloat vSphereColor[] = {0.0f, 0.0f, 1.0f, 1.0f};
  9. //基于当前时间动画:当前时间*60s
  10. static CStopWatch rotTime;
  11. float yRot = rotTime.GetElapsedSeconds()*60.0f;
  12. //获取观察者矩阵并入栈
  13. M3DMatrix44f mCamera;
  14. cameraFrame.GetCameraMatrix(mCamera);
  15. modelViewMatrix.PushMatrix(mCamera);
  16. //设置光源矩阵
  17. M3DVector4f vLightPos = {0.0f, 10.0f, 5.0f, 1.0f};
  18. M3DVector4f vLightEyePos;
  19. //将光源矩阵和观察者矩阵相乘的结果放在vLightEyePos中
  20. m3dTransformVector4(vLightEyePos, vLightPos, mCamera);
  21. //使用管线控制器,平面着色器进行渲染
  22. shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vFloorColor);
  23. floorBatch.Draw();
  24. //在模型视图矩阵堆栈中绘制以下图形:先压栈,绘制完毕后再出栈——始终对栈顶矩阵图形渲染
  25. //绘制随机球体
  26. for (int i = 0; i < NUM_SPHERES; i++) {
  27. modelViewMatrix.PushMatrix();
  28. //模型视图矩阵堆栈栈顶矩阵与随机球体矩阵相乘的结果放入栈顶
  29. modelViewMatrix.MultMatrix(spheres[i]);
  30. shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix(), vLightEyePos, vSphereColor);
  31. //可与公转球体使用同一个容器类对象
  32. sphereBatch.Draw();
  33. modelViewMatrix.PopMatrix();
  34. }
  35. //设置甜甜圈平移距离(z轴负方向2.5)和旋转角度;
  36. modelViewMatrix.Translate(0.0f, 0.0f, -2.5f);
  37. modelViewMatrix.PushMatrix();
  38. modelViewMatrix.Rotate(yRot, 0.0f, 0.1f, 0.0f);
  39. //使用点光源着色器渲染
  40. shaderManager.UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix(), vLightEyePos, vTorusColor);
  41. torusBatch.Draw();
  42. modelViewMatrix.PopMatrix();
  43. //设置公转球体:反方向旋转,在x轴上平移0.8
  44. modelViewMatrix.Rotate(yRot *-2.0f, 0.0f, 1.0f, 0.0f);
  45. modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
  46. shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vSphereColor);
  47. sphereBatch.Draw();
  48. modelViewMatrix.PopMatrix();
  49. //后台渲染完成后交给前台
  50. glutSwapBuffers();
  51. //基于时间动画:实时刷新窗口
  52. glutPostRedisplay();
  53. }

//图形定位

  1. void SetupRC()
  2. {
  3. //设置窗口背景颜色
  4. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  5. //初始化管线控制器
  6. shaderManager.InitializeStockShaders();
  7. //开启深度测试:图形间重叠部分无须重复绘制
  8. glEnable(GL_DEPTH_TEST);
  9. //提交甜甜圈数据:三角形批次类对象、外圈半径、内圈半径、主半径三角形对数x、小半径三角形对数y(尽量:x=2*y,更圆滑)
  10. gltMakeTorus(torusBatch, 0.4f, 0.15f, 30, 15);
  11. //提交公转球体数据:三角形批次类对象、半径、底部到顶部三角形带的数量、一条三角形带中的三角形对数(一般指球体中间那条,为最大数)
  12. gltMakeSphere(sphereBatch, 0.1f, 26, 20);
  13. //线段模式,325个顶点
  14. floorBatch.Begin(GL_LINES, 325);
  15. for (GLfloat x = -20.0f; x <= 20.0f; x+=0.5f) {
  16. /*
  17. 1.一个格子四个顶点,格子方向朝屏幕里面;
  18. 2.只绘制x和z轴方向上的顶点;
  19. 3.y轴坐标保持不变,负值,展示随机球体悬浮效果;
  20. */
  21. floorBatch.Vertex3f(x, -0.55f, 20.0f);
  22. floorBatch.Vertex3f(x, -0.55f, -20.0f);
  23. floorBatch.Vertex3f(20.0f, -0.55f, x);
  24. floorBatch.Vertex3f(-20.0f, -0.55f, x);
  25. }
  26. floorBatch.End();
  27. //随机悬浮球体:y值不变,x、z值随机
  28. for (int i = 0; i < NUM_SPHERES; i++) {
  29. GLfloat x = (GLfloat)(((rand()%400)-200)*0.1f);
  30. GLfloat z = (GLfloat)(((rand()%400)-200)*0.1f);
  31. spheres[i].SetOrigin(x, 0.0f, z);
  32. }
  33. }

三、效果

 

GitHub

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号