标签:opengl
一 视点变换
六 太阳地球月球示例
#include <glut.h> #include <stdio.h> #include <time.h> static int day = 200; double getFPS() { static int count; static double save; static clock_t last, current; double timegap; ++count; if (count <= 50){ return save; } count = 0; last = current; current = clock(); timegap = (current-last)/(double)CLK_TCK; save = 50.0f / timegap; return save; } void display() { // 打印FPS double FPS = getFPS(); printf("FPS = %f\n", FPS); glEnable(GL_DEPTH_TEST);// 开启更新深度缓冲区的功能,被挡住的像素不绘制 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除颜色缓冲|深度缓冲 glMatrixMode(GL_PROJECTION);// 设置当前矩阵模式:对投影矩阵应用随后的矩阵操作 glLoadIdentity(); //将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵,即之前的矩阵变换带来的影响到此为止 gluPerspective(75, 1, 1, 400000);// 设置透视投影矩阵 glMatrixMode(GL_MODELVIEW);// 设置当前矩阵模式:对模型视景矩阵堆栈应用随后的矩阵操作. glLoadIdentity();//将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵,即之前的矩阵变换带来的影响到此为止 gluLookAt(0, -200000, 200000, 0, 0, 0, 0, 0, 1);// 设置视点 //sun glColor3f(1, 0, 0);// 设置绘制颜色为红色 glutSolidSphere(69600, 20, 20);// 渲染一个球体 // earth glColor3f(0, 0, 1);// 设置绘制颜色为蓝色 glRotatef(day, 0, 0, -1);// 旋转 glTranslatef(150000, 0, 0);// 平移 glutSolidSphere(15945, 20, 20);// 渲染一个球体 //moon glColor3f(1, 1, 0); glRotatef(day / 30.0 * 360 - day, 0, 0, -1);// 旋转 glTranslatef(38000, 0, 0);// 平移 glutSolidSphere(4345, 20, 20);// 渲染一个球体 glFlush();// 清空缓冲区,立即执行绘制命令 glutSwapBuffers();// 双缓冲时交换两个缓冲区指针 } void idle() { ++day; if (day > 360){ day = 0; } display();// 调用display方法进行强制刷新 } int main(int argc, char **argv) { glutInit(&argc, argv);// 初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);// 显示显示模式(RGB颜色|双缓冲) glutCreateWindow("earth,moon,sun");// 设置窗口标题 glutInitWindowSize(400, 400);// 设置窗口大小 glutDisplayFunc(display);// 设置绘制函数 glutIdleFunc(&idle); glutMainLoop();// 开启消息循环 return 0; }
标签:opengl
原文地址:http://blog.csdn.net/xufeng0991/article/details/45225993