OpenGL学习10_绘制行星系统

下面的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.0f
    glutWireSphere(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.2f
    glutWireSphere(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

时间: 2024-08-01 14:28:20

OpenGL学习10_绘制行星系统的相关文章

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

写在前面 接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了.不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节我们将通过绘制一个三角形的程序来熟悉现代OpenGL的概念和流程. 通过本节可以了解到: 缓存对象VAO和VBO GLSL着色器程序的编译.链接和使用方法 OpenGL绘图的基本流程 绘图流水线简要了解 与使用高级绘图API(例如java里swing绘图,MFC里的绘图)不同,使用OpenGL绘制图

OpenGL学习07_绘制立方体

OpenGL在绘制场景之前,需要先产生或者说定义一个场景,这个产生目标场景视图的过程类似于照相机拍照的过程. 1.把照相机固定在三角架上,并让它对准场景(视图变换). 2.对场景进行安排,使各个物体在照片中的位置是我们所希望的(模型变换). 3.选择照相机镜头,并调整放大倍数(投影变换). 4.确定最终照片的大小.例如,我们很可能需要把它放大(视口变换). 5.在完成这些步骤之后,就可以进行拍照(或者绘制场景)了. // // main.cpp // OpenGL_08_CUBE // // C

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

OpenGL学习进程(4)第二课:绘制图形

本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形:     (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) { // clear all pixels glClear(GL_COLOR_BUFFER_BIT); // draw yellow polygon (rectangle) with corners at glColor3f(1.0, 1.0, 0.0); glBegin(GL_POLYGON); //绘制开

OpenGL学习进程(10)第七课:四边形绘制与动画基础

    本节是OpenGL学习的第七个课时,下面以四边形为例介绍绘制OpenGL动画的相关知识:     (1)绘制几种不同的四边形: 1)四边形(GL_QUADS) OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形. 注意:在使用四边形时必需记住四边形的四个角必须位于同一个平面中(不存在弯曲的四边形). 2)四边形带(GL_QUAD_STRIP) 该图元指定一个连接的四边形带.它们都保持相同方向的环绕. 3)通用多边形GL_POLYGON 我们可以用它绘制任意数

OpenGl学习进程(8)第六课:点、边和图形(三)绘制图形

本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识:     (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”.通过点.直线和多边形,就可以组合成各种几何图形.一段弧可以看成是是很多短的直线段相连,这些直线段足够短,以至于其长度小于一个像素的宽度.通过位于不同平面的相连的小多边形,还可以组成一个“曲面”. 什么是凸边形: 凸边形:多边形内任意两点所确定的线段都在多边形内,由此也可以推导出,凸多边形不能是空心的

OpenGL学习进程(11)第八课:颜色绘制的详解

    本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿.     (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. RGBA模式与索引模式的区别: 计算机必须为每个像素保存一些数据,在RGBA模式中数据就代表了颜色:而颜色索引模式中数据代表了一个索引,要获取真正的颜色值还需要查索引表.数据的数量是由帧缓存中的位面决定的.一个位面为一个像素的一个位的数据.假如是8位面的颜色,每个像素就有8个颜色位,因此就有2的8次方

OpenGl学习进程(9)在3D空间的绘制实例

    本节将演示在3D空间中绘制图形的几个简单实例:     (1)在3D空间内绘制圆锥体: #include <GL/glut.h> #include <math.h> #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #define PI 3.1416 GLfloat xRot = 0; GLfloat yRot =

opengl学习记录1——矩形绘制

1 #include <windows.h> 2 #include <gl/GL.h> 3 #include <gl/GLU.h> 4 #include <glut.h> 5 6 #pragma comment( lib, "glut.lib" ) 7 8 void display() 9 { 10 glClear( GL_COLOR_BUFFER_BIT ); 11 12 glColor3f( 1.0, 1.0, 1.0 ); 13 g