准备把自己这几天的学习opengl的经验写下来,自己是这方面的小白,希望大神可以对有问题以及可以优化的地方提出来。也欢迎指出不足和吐槽。希望帮到小白。

自己参考得比较多的网站是这个:
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
第一个实例也是上面的网站给出来的,但是进行了一点点优化。

所有代码都可以去github免费下载(不怎么喜欢CSDN的积分下载):
https://github.com/Iamttp/OpenGLTest

我一直比较推崇实例学习,并且网上opengl的实例比较少,所以会一直用实例。好先上这一节的效果图。

先把基本的框架弄出来,功能就是画一个白色的矩形,然后空闲时调用,会一直更新my_angle,如果不理解这里,可以查看刚刚提到的网站:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html

#include <gl/glut.h>
#include <stdio.h>
#include <time.h>
#include <cmath>// 表示旋转的角度
static int my_angle = 0;void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glRectf(-0.5f, -0.5f, 0.5f, 0.5f);glutSwapBuffers();
}
/*** 计时增加角度*/
void myIdle(void) {static int mm = 0;mm++;if (mm % 300000 == 0) {++my_angle;if (my_angle >= 360) my_angle = 0;myDisplay();}
}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100, 100);glutInitWindowSize(1000, 1000);glutCreateWindow("太阳,地球和月亮");  // 改了窗口标题// glutDisplayFunc(&myDisplay);glutIdleFunc(&myIdle);  // 表示在CPU空闲的时间调用某一函数// 在OpenGL中,默认是没有开启深度检测的,后绘制的物体覆盖先绘制的物体。// GL_DEPTH_TEST 用来开启更新深度缓冲区的功能glEnable(GL_DEPTH_TEST);glutMainLoop();return 0;
}

然后就可以更改myDisplay函数,来渲染地球月亮和太阳,这里太阳是静止的,地球就先调用函数:glTranslatef(0.5, 0.5, -0.5); //平移,参数分别表示平移的坐标xyz。

那为什么是0.5呢?
OpenGL仅当3D坐标在3个轴(x、y和z)上都为-1.0到1.0的范围内时才处理它。所有在所谓的标准化设备坐标(Normalized Device Coordinates)范围内的坐标才会最终呈现在屏幕上(在这个范围以外的坐标都不会显示)。

那为什么是0.5, 0.5, -0.5呢?
因为我想呈现三维效果,然后就假设旋转的轴是1,1,1,对着屏幕的右边为x正向,上边为y正向,屏幕朝外为z正向。

然后就是月亮,对于月亮,先假设原点为地球,让月亮绕着原点旋转,然后在平移到地球周围。注意渲染顺序是从下往上。

 glRotated(my_angle, 1.0, 1.0, 1.0);  //然后移动到地球旁边旋转glTranslatef(0.5, 0.5, -0.5);        //平移glRotated(my_angle, 1.0, 1.0, 1.0);  //先假设原点为地球旋转glTranslatef(-0.15, -0.15, 0.15);    //平移

然后总的代码就是:

#include <gl/glut.h>
#include <stdio.h>
#include <time.h>
#include <cmath>// 表示旋转的角度
static int my_angle = 0;void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 太阳glPushMatrix();glColor3f(1.0, 1.0, 0.0);glutSolidSphere(0.15, 200, 200);glPopMatrix();// 地球glPushMatrix();glColor3f(0.0, 0.0, 1.0);glRotated(my_angle, 1.0, 1.0, 1.0);  //公转glTranslatef(0.5, 0.5, -0.5);        //平移glutSolidSphere(0.1, 200, 200);glPopMatrix();// 月亮glPushMatrix();glColor3f(1.0, 1.0, 1.0);glRotated(my_angle, 1.0, 1.0, 1.0);  //然后移动到地球旁边旋转glTranslatef(0.5, 0.5, -0.5);        //平移glRotated(my_angle, 1.0, 1.0, 1.0);  //先假设原点为地球旋转glTranslatef(-0.15, -0.15, 0.15);    //平移glutSolidSphere(0.05, 200, 200);     //绘制月亮glPopMatrix();glutSwapBuffers();
}
/*** 计时增加角度*/
void myIdle(void) {static int mm = 0;mm++;if (mm % 300000 == 0) {++my_angle;if (my_angle >= 360) my_angle = 0;myDisplay();}
}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100, 100);glutInitWindowSize(1000, 1000);glutCreateWindow("太阳,地球和月亮");  // 改了窗口标题// glutDisplayFunc(&myDisplay);glutIdleFunc(&myIdle);  // 表示在CPU空闲的时间调用某一函数// 在OpenGL中,默认是没有开启深度检测的,后绘制的物体覆盖先绘制的物体。// GL_DEPTH_TEST 用来开启更新深度缓冲区的功能glEnable(GL_DEPTH_TEST);glutMainLoop();return 0;
}

这里有一个奇怪的地方就是深度(z方向上)有问题,月亮有时候本应该被遮挡却会在地球上面。解决方法是在glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);后面添加代码

 glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(75, 1, 0.001f, 1000000000000.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 0, 3, 0, 0, -1, 0.0f, 1.0f, 0.0f);

这样你的太阳、地球、月亮有“近大远小”的透视效果。并启动了深度测试(解决深度(z方向上)的问题)。

OpenGL专栏: https://blog.csdn.net/qq_40515692/article/details/103938499

【OpenGL】太阳、地球、月亮实例(一)相关推荐

  1. OpenGl太阳地球月亮运动系统

    在讲解这个运动系统,首先我们的来讲解OpenGl里有关几个图形变换的知识,这里就以球为例,我们需要知道将球平移,旋转的2个知识.因为系统必须用到平移和旋转. 1 平移变换: glTranslatef( ...

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

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

  3. Python模拟太阳-地球-月亮运动模型

    作者 | Charles,cv方向在读研究生.[Charles 的皮卡丘]专注于分享有趣好玩的Python小项目(AI.爬虫等等). 来源 | Charles 的皮卡丘 编辑 | Jane [导语]春 ...

  4. Python模拟登录,matplotlib模块,Python模拟太阳-地球-月亮运动模型

    前言 利用python模拟太阳-地球-月亮运动模型. 让我们愉快地开始吧~ 开发工具 **Python版本:**3.6.4 相关模块: pygame模块: matplotlib模块: numpy模块: ...

  5. webgl 绘制太阳 地球 月亮

    目录 1.开发环境 2.内容说明 1.计算球体的坐标和纹理 2.求顶点索引 3.数据加载到缓存中 4.绘制球体 5.其他 3.运行结果及代码下载 1.开发环境 浏览器 : 火狐 firefox(配置参 ...

  6. CSS太阳地球月亮转圈圈loading

    一个css例子 css太阳 月亮 地球转转转 知识点总结: justify-content: center; justify-content 用于设置或检索弹性盒子元 素在主轴(横轴)方向上的对齐方式 ...

  7. three.js旋转,材质,灯光使用 —— 太阳地球月亮运动

    import * as THREE from 'three' //引入控制器 import { OrbitControls } from 'three/examples/jsm/controls/Or ...

  8. Unity学生作业:太阳地球月亮自转和公转

    1.第一步 打开Unity. 2.第二步 在场景中创建3个Sphere球体并分别命名为Moon, Sun和Earth. 在命名完之后调整3个球的大小和位置,并贴上贴图.将Moon作为Earth的子物体 ...

  9. 纯css3制作的太阳地球月亮效果

    上课无聊看到的,虽然有很多兼容性问题,但先保存吧,原文链接如下: http://buluo.qq.com/p/detail.html?bid=16531&pid=9399270-1461480 ...

  10. javascript-动画animation自己学习做太阳地球和月球运转动画;

    首先声明一点:自己学习的程序来源于: https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Basic_animat ...

最新文章

  1. 2018秋寒假作业4—PTA编程总结1
  2. python教程app下载地址_python教程
  3. AndroidStudio导入httpmime jar编译不通过的解决办法
  4. CSS(1)——如何使用css选择器
  5. HTML <dfn> 标签的简单介绍
  6. flush方法和close方法的区别
  7. SqlServer Split功能函数
  8. Java中文乱码破碎重组_总结彻底解决Spring MVC+Mybatis中文乱码问题
  9. 新一代纯前端控件集 WijmoJS 2018V2发布,提供 Web 设计器,可动态设计页面并生成代码...
  10. 代码中有的《飞秋》只是一个照面
  11. 6月8日任务(12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件)
  12. 计算机网络 间接路由选择与直接路由选择
  13. 什么是低信噪比图像及处理方法
  14. R语言中的read.table()
  15. 计算机软件故障及其处理方法,计算机常见软件故障及其解决方法
  16. 微信公众号:地图定位
  17. 关于LNode 和* LinkList
  18. 取火柴 c语言程序,hdu 1907 John(取火柴游戏)
  19. python画circos图_Circos图--在线绘制
  20. 雷曼另类“死因”:巴菲特漏看求救短信

热门文章

  1. 【程序人生】浅谈锤子科技515发布会
  2. fincial words
  3. 敏捷教练----Scrum-冲刺
  4. 雨润集团破产重组 品牌域名为双拼域名yurun.com
  5. javaweb网上点歌系统
  6. kylinTOP下载安装
  7. Springboot、Mybatis(Mybatis-plus) 、Mysql
  8. java密码强度_java实现的密码强度检测功能完整示例
  9. Eurosystems Eurocut Pro/EuroVECTOR 6.1.0.9 Multilingual-ISO 1CD(多用途的矢量设计软件)
  10. c语言三元组作用,数据结构 C语言 三元组的具体实现