GitHub项目地址OpenGL(glut)模拟太阳系:太阳,地球,月球,火星

核心代码如下:

// orgin.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>using namespace std;
bool bPersp = false;
int year = 0, day = 0,  marsYear = 0;
int speed = 12;
float light_angle = 0;
bool bWire = false;
float light_radius = 8.0;
float eye[] = {5.5, 1.7, 1.7};
float center[] = { 0, 0, 0 };
int wHeight = 0;
int wWidth = 0;
int state = 1;
float star[1000][3];
GLUquadricObj *g_text;
void lPosition()
{float y, z;y = light_radius * cos(light_angle);z = light_radius * sin(light_angle);float light_position[] = { 3.0, y, z, 0.0 };glLightfv(GL_LIGHT0, GL_POSITION, light_position);
}
void init(void)
{glClearColor(0.0, 0.0, 0.0, 0.0);lPosition();glShadeModel(GL_SMOOTH);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);glEnable(GL_COLOR_MATERIAL);g_text = gluNewQuadric();
}
void init_stars()
{for (int i = 0; i < 1000; i++)for (int j = 0; j < 3; j++)star[i][j] = rand() % 20 - 10;
}
void stars()
{glBegin(GL_POINTS);glColor3f(1.0f, 1.0f, 1.0f);for (int i = 0; i < 1000; ++i) {glVertex3f(star[i][0], star[i][1], star[i][2]);}glEnd();
}
void sun()
{glPushMatrix();glColor3f(1.0f, 0.0f, 0.0f);gluSphere(g_text, 0.7, 32, 32);glPopMatrix();
}
void earth()
{glPushMatrix();glColor3f(0.0f, 0.0f, 1.0f);glRotatef((GLfloat)year / 10, 0.0, 0.0, 1.0);glTranslatef(2.1, 0.0, 0.0);glRotatef((GLfloat)day / 10, 0.0, 0.0, 1.0);gluSphere(g_text, 0.25, 20, 16);glColor3f(1.0f, 1.0f, 0.0f);glRotatef((GLfloat)year / 10, 0.0f, 0.0f, 1.0f);glRotatef(day / 30.0 * 360.0, 0.0f, 0.0f, 1.0f);glTranslatef(0.3f, 0.0f, 0.0f);gluSphere(g_text, 0.06, 20, 16);glPopMatrix();
}
void mars()
{glPushMatrix();glColor3f(166.0 / 256, 119.0 / 356, 67.0 / 256);glRotatef((GLfloat)marsYear / 10, 0.0, -1.0, 1.0);glTranslatef(3.2, 1.0, 0.0);glRotatef((GLfloat)day, 0.0, 0.0, 1.0);gluSphere(g_text, 0.23, 20, 16);glPopMatrix();
}void redraw(void)
{lPosition();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);if (bWire) {glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);}else {glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);}glColor3f(1.0, 1.0, 1.0);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glEnable(GL_TEXTURE_2D);stars();sun();earth();mars();glDisable(GL_TEXTURE_2D);glutSwapBuffers();
}void cPosition()
{glLoadIdentity();cout << "eye[0] : " << eye[0] << " eye[1] : "<< eye[1] << " eye[2] : " << eye[2] << endl;gluLookAt(eye[0], eye[1], eye[2],center[0], center[1], center[2],0.0, 0.0, 1.0);}void updateView(int width, int height)
{glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (!bPersp) {gluPerspective(65.0f, (GLfloat)width / (GLfloat)height, 1.0f, 100.0f);}else {glOrtho(-3, 3, -3, 3, -100, 100);}glMatrixMode(GL_MODELVIEW);cPosition();
}
void reshape(int width, int height)
{wHeight = height;wWidth = width;updateView(wWidth, wHeight);}void move()
{year = (year + 8) % 3600;marsYear = (marsYear + 6) % 3600;day = (day + 30) % 3600;
}
void keyboard(unsigned char key, int x, int y)
{switch (key){case 'p': {bPersp = !bPersp;updateView(wWidth, wHeight);break;}case 'o': {bWire = !bWire; break; }case 'w': {eye[0] += 1;center[0] += 1;cPosition();break;}case 'a': {eye[1] += 1;center[1] += 1;cPosition();break;}case 's': {eye[0] -= 1;center[0] -= 1;cPosition();break;}case 'd': {eye[1] -= 1;center[1] -= 1;cPosition();break;}case 'z': {eye[2] -= 1;center[2] -= 1;cPosition();break;}case 'c': {eye[2] += 1;center[2] += 1;cPosition();break;}case 'r':eye[0] = 5.5;eye[1] = 1.7;eye[2] = 1.7;center[0] = 0;center[1] = 0;center[2] = 0;cPosition();break;case 'q': {exit(0); break; }default:break;}
}void myIdle(void)
{Sleep(speed);move();glutPostRedisplay();
}int main(int argc, char **argv)
{cout << "WASDZC change the Camera Position" << endl;cout << " O change GL_LINE GL_FILL" << endl;cout << " P change the Perspective orthographic projection" << endl;cout << " R reset the Camera" << endl;cout << endl<< endl<< "By Zhang Sidan : Nov. 2018" << endl;glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(1080, 680);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();init_stars();glutDisplayFunc(redraw);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(&myIdle);glutMainLoop();return 0;
}

OpenGL(glut)模拟太阳系:太阳,地球,月球,火星相关推荐

  1. opengl的配置和太阳-地球-月球演示

    详细配置过程请点击链接 https://www.cnblogs.com/flylinmu/p/7823019.html 下面介绍opengl实例,太阳-地球-月球演示 建立一个控制台程序 sun.cp ...

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

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

  3. openGl编程实现一个太阳地球月亮的一个简单运动系统

    一. 项目目的 使用openGl编程实现一个太阳地球月亮的一个简单运动系统,要求实现三维转动.点光源变化.纹理映射及阴影等效果 二. 任务实现 \1. 满足三者实际大小/距离的比例关系: \2. 满足 ...

  4. html5之太阳地球月球,使用html5画出地球月球和太阳之间的环绕关系

    本文主要是描述了使用html5画出地球月球和太阳之间的环绕关系,其实他们比较简单,主要是通过旋转来控制各个之间的环绕关系!~ 输入代码,里面有注释: ------------------------- ...

  5. Canvas模拟太阳地球月球的运动过程

    先看效果图 代码 package com.test.paintdemo.pathrelate;import android.content.Context; import android.graphi ...

  6. matlab地球公转,Unity模拟太阳地球月球公转自转

    1. 打开Unity编辑器,创建三个sphere,依次重命名为Sun,Earth,Moon.将三个球体大小比例控制在5:3:1,并适当调整位置. 2. 分别为三个小球附上材质 3. 新建脚本文件,重命 ...

  7. python怎么画地球绕太阳转_如何利用Python动态模拟太阳系运转

    前言 提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫.发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙伴可以深入了解一下,这里就不多说了. 太阳以巨大的引力使周 ...

  8. OpenGL模拟太阳系运行

    程序要实现的目标功能 1.绘制太阳系中太阳,八大行星及各自的卫星的三维球体模型,包括太阳在内的各天体具备合理的相对位置大小,在各自的运转轨道上有序分布和运行. 2.程序应有较好的动画效果,各大行星和卫 ...

  9. opengl实现太阳系、地球系,并加上地球的贴图

    实验要求:实现太阳系,地球系,即实现地球绕着太阳转,月球绕着地球转,并且给球体加上地球的贴图. 效果如下: 附一张地球的贴图(哎呀,我怎么这么贤惠) 这其中需要用到glaux系列的包,emmmmmmm ...

最新文章

  1. vscode拼写错误提醒消失
  2. HTML(WEB)开发day01
  3. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
  4. 简单线性回归(Simple Linear Regression)和多元线性回归(Multiple Regression)学习笔记
  5. Installshield 文件及文件夹操作
  6. Linux 软件包管理
  7. Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法
  8. java多线程-CountDownLatch
  9. 使用自制ADempiere 3.6.0 LTS安装软件进行安装(基于Ubuntu Desktop 12.04 LTS)
  10. “office for mac”模板文件的目录
  11. 5G来了,普通人看热闹,程序员看颠覆
  12. Excel 数据透视表小技巧之 05 如何计算重复项,一个包含重复的邮政编码列表,需要每个邮政编码有多少个实例(教程含数据)
  13. mplayer播放器管道重构版
  14. 一键重装系统win7旗舰版系统教程
  15. TLC2543和mini2440通信的速率
  16. 数据挖掘第二章 认识数据
  17. 费诺编码 c++代码实现 信息论实验
  18. 关于虚拟机检测技术的研究
  19. Windows 11 相機獲得新更新
  20. EAIDK-610(RK3399)使用体验

热门文章

  1. 第二课.Python编程基础(一)
  2. Java中的多态(for myself)
  3. html 右边是iframe 左右结构_HTML速查表
  4. 在线作图|FAPROTAX数据库在线注释
  5. ISME:西农沈锡辉+韦革宏+王瑶揭示细菌铁获取和外膜囊泡招募新机制
  6. NC:潮湿的墙体和家具中微生物迅速增长!
  7. 宏基因组实战4. 基因注释Prokka
  8. R语言ggplot2可视化小提琴图(violin plot)并使用ggsignif添加分组显著性(significance)标签
  9. R语言Affinity Propagation+AP聚类实战
  10. plotly自定义股票数据绘图