下面的Demo还使用了多种组合变换来实现地球绕太阳公转和自转的实现,还是直接看代码,有详细的注释。

<span style="font-size:12px;">//
//  main.cpp
//  OpenGL_11_Planet
//
//  Created by apple on 15/1/20.
//  Copyright (c) 2015年 cc. All rights reserved.
//
#include <iostream>#include <GLUT/GLUT.h>static int year = 0, day = 0;/***  初始化操作*/
void init() {//设置清屏色glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置着色模式,填充色与顶点一致glShadeModel(GL_FLAT);
}/***  展示绘制效果*/
void display() {//清理颜色缓冲区glClear(GL_COLOR_BUFFER_BIT);//设置绘制颜色glColor3f(1.0, 1.0, 1.0);//复制当前矩阵并保存到栈顶glPushMatrix();//渲染一个太阳,半径1.0fglutWireSphere(1.0f, 20.0f, 16.0f);//绕y轴旋转year度,此时地球的局部坐标系统与全局坐标系统不一致,表现出公转glRotatef((GLfloat)year, 0.0f, 1.0f, 0.0f);//沿x轴方向移动2个单位长度,此时地球的局部坐标系统已经与全局的坐标系统偏移glTranslatef(2.0f, 0.0f, 0.0f);//沿y轴旋转day度,此时地球的局部坐标系统与全局坐标系统一致,表现出自转glRotatef((GLfloat)day, 0.0f, 1.0f, 0.0f);//绘制一个地球,半径0.2fglutWireSphere(0.2f, 10.0f, 8.0f);//弹出栈顶矩阵glPopMatrix();//交换缓冲区数据glutSwapBuffers();//强制完成绘制指令//    glFlush();
}/***  调整窗口尺寸**  @param width  宽度*  @param height 高度*/
void reshape(int width, int height) {//设置视口矩形区域,在默认情况下,视口被设置为占据打开窗口的整个像素矩形glViewport(0, 0, (GLsizei)width, (GLsizei)height);//之后的矩阵操作定义为投影矩阵操作glMatrixMode(GL_PROJECTION);//等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!glLoadIdentity();//创建一个表示对称透视视图平截头体的矩阵//设置眼睛睁开的角度,视景体的宽高比,近截面的距离,远截面的距离gluPerspective(60.0f, (GLfloat)width / (GLfloat)height, 1.0f, 20.0f);//之后的矩阵操作定义为模型视图矩阵操作glMatrixMode(GL_MODELVIEW);glLoadIdentity();//相机位置(0, 0, 5),相机镜头朝向(0, 0, 0),相机顶部朝上gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//如果并没有调用gluLookAt(),那么照相机就被设置为默认的位置和方向。在默认情况下,照相机位于原点,指向z轴的负方向,朝上向量为(0,1,0)。}/***  键盘事件回调**  @param key 键位*  @param x   宽度*  @param y   高度*/
void keyboard(unsigned char key, int x, int y) {switch (key) {case int('d'):day = (day + 10) % 360;glutPostRedisplay();break;case int('D'):day = (day - 10) % 360;glutPostRedisplay();break;case int('y'):year = (year + 5) % 360;glutPostRedisplay();break;case int('Y'):year = (year - 5) % 360;glutPostRedisplay();break;default:break;}
}int main(int argc, const char * argv[]) {//初始化GLUT库glutInit(&argc, (char**)argv);//设置单缓冲,RGB像素格式的窗口glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//设置窗口大小glutInitWindowSize(500, 500);//设置窗口坐标glutInitWindowPosition (100, 100);//创建窗口glutCreateWindow("行星系统");//初始化操作init();//设置展示的回调方法glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);//绘制线程开始循环glutMainLoop();return 0;
}
</span>

本文由CC原创总结,如需转载请注明出处:http://blog.csdn.net/oktears/article/details/43150363

OpenGL学习10_绘制行星系统相关推荐

  1. 基于C++和OpenGL (GLUT) 实现太阳系行星系统

    基于C++和OpenGL (GLUT) 实现太阳系行星系统 效果图: 分析与设计 OpenGL 包含了很多渲染函数,但是他们的设计目的是独立于任何窗口系统或操作系统的.因此,它自身并没有包含创建打开窗 ...

  2. 【OpenGL学习】绘制三角形

    绘制三角形 上节中完成了窗口的绘制,这节我们主要实现在窗口中完成一个最简单的三角形的绘制,同样,要完成一个三角形的绘制,需要以下内容: Vertex Array 存放顶点数据的数组(实际上存放的是顶点 ...

  3. opengl学习2 绘制三角形和矩形

    在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的图形 ...

  4. OpenGL学习脚印: 绘制一个三角形

    写在前面 接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了.不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节 ...

  5. OpenGL学习笔记--绘制图元

    图元 图元primitive,即图形元素,是可以编辑的最小图形单位.图元是图形软件用于操作和组织画面的最基本的素材.一幅画面由图元组成,图元是一组最简单的.最通用的几何图形或字符. 在OpenGL中最 ...

  6. openGL学习之glut库的使用

    对于初学者来说,做小项目用的glut已经很足够了,它的定义是用于简单程序和初学者学习使用的简单的.容易的.小的. vs2015创建空项目: 然后在项目中添加glut中include路径: 先创建一个调 ...

  7. OpenGL学习脚印: 二维纹理映射(2D textures)

    写在前面  前面两节介绍了向量和矩阵,以及坐标和转换相关的数学,再继续讨论模型变换等其他包含数学内容的部分之前,本节介绍二维纹理映射,为后面学习做一个准备.纹理映射本身也是比较大的主题,本节只限于讨论 ...

  8. OpenGL学习之着色器详解

    OpenGL着色器语言(GLSL)看上去很像C语言,它由OpenGL实现进行编译和连接,并且(经常是)完全在图形硬件中运行. 我们有顶点着色器.片段着色器和几何着色器,前两种是必需的,后一种是可选的. ...

  9. OpenGL/C++实战——C++实现太阳系行星系统

    注:本教程版权归实验楼所有,有兴趣的同学也可点进官网蓝桥网课:C++实现太阳系行星系统学习(免费课程) 文章目录 框架设计 认识 OpenGL 和 GLUT 类设计 stars.hpp solarsy ...

最新文章

  1. centos7下docker 部署javaweb
  2. HDU4390(容斥原理)
  3. 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
  4. 如何将索引碎片数量降至最低
  5. BiCubic Interpolation
  6. 嵌入式linux驱动开发答辩问题,嵌入式Linux驱动工程师/BSP开发工程师面试笔试题集锦...
  7. iphone投屏ipad_幕享免费无线投屏:你朝思暮想的屏幕互联方式
  8. linux脚本pend什么意思,LSF Basis
  9. Mars3D中 popup 弹窗问题汇总
  10. 《LOL》从代码上来说最难的是哪个英雄?
  11. FastQC 与 质控
  12. 基于C#实现的小型动物识别推理系统
  13. 小学数学测试软件报告,第二学小学数学期末测试质量分析报告
  14. Github标星 8K+,免费又好用的Redis客户端工具!
  15. 2007年新兴网络服务
  16. (JAVA)将(acc/m4a)音频转换成Mp3格式
  17. 【Matlab】将.mat文件转换为多个excel文件
  18. 重装系统无法安装在efi分区_提示“在EFI系统上windows只能安装到GPT磁盘”解决方法...
  19. dubbo源码分析学习---dubbo 重要内容Invoker 和服务注册过程
  20. 华为java社招面试题目及全部流程详解

热门文章

  1. 智能电视关机后需不需要拔插头或关闭电源?
  2. 解决安装了VirtualBox之后C爆满的情况
  3. 资料搜集-JAVA系统的梳理知识10-操作系统
  4. Linux命令之查看磁盘空间使用情况df
  5. Winform 工具栏ToolStrip的使用
  6. 给一朋友的关于项目组建设的建议
  7. python 股票分析库_GitHub - MrFiona/stock: stock,股票系统。使用python进行开发。
  8. [转载]《狼》-bressanon布列瑟农 一次触动每个人心灵的感受
  9. MyBatis-Plus - 字段类型处理器
  10. 【面向对象】多项式求导——第一单元课程总结