【OpenGL】太阳、地球、月亮实例(一)
准备把自己这几天的学习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】太阳、地球、月亮实例(一)相关推荐
- OpenGl太阳地球月亮运动系统
在讲解这个运动系统,首先我们的来讲解OpenGl里有关几个图形变换的知识,这里就以球为例,我们需要知道将球平移,旋转的2个知识.因为系统必须用到平移和旋转. 1 平移变换: glTranslatef( ...
- openGl编程实现一个太阳地球月亮的一个简单运动系统
一. 项目目的 使用openGl编程实现一个太阳地球月亮的一个简单运动系统,要求实现三维转动.点光源变化.纹理映射及阴影等效果 二. 任务实现 \1. 满足三者实际大小/距离的比例关系: \2. 满足 ...
- Python模拟太阳-地球-月亮运动模型
作者 | Charles,cv方向在读研究生.[Charles 的皮卡丘]专注于分享有趣好玩的Python小项目(AI.爬虫等等). 来源 | Charles 的皮卡丘 编辑 | Jane [导语]春 ...
- Python模拟登录,matplotlib模块,Python模拟太阳-地球-月亮运动模型
前言 利用python模拟太阳-地球-月亮运动模型. 让我们愉快地开始吧~ 开发工具 **Python版本:**3.6.4 相关模块: pygame模块: matplotlib模块: numpy模块: ...
- webgl 绘制太阳 地球 月亮
目录 1.开发环境 2.内容说明 1.计算球体的坐标和纹理 2.求顶点索引 3.数据加载到缓存中 4.绘制球体 5.其他 3.运行结果及代码下载 1.开发环境 浏览器 : 火狐 firefox(配置参 ...
- CSS太阳地球月亮转圈圈loading
一个css例子 css太阳 月亮 地球转转转 知识点总结: justify-content: center; justify-content 用于设置或检索弹性盒子元 素在主轴(横轴)方向上的对齐方式 ...
- three.js旋转,材质,灯光使用 —— 太阳地球月亮运动
import * as THREE from 'three' //引入控制器 import { OrbitControls } from 'three/examples/jsm/controls/Or ...
- Unity学生作业:太阳地球月亮自转和公转
1.第一步 打开Unity. 2.第二步 在场景中创建3个Sphere球体并分别命名为Moon, Sun和Earth. 在命名完之后调整3个球的大小和位置,并贴上贴图.将Moon作为Earth的子物体 ...
- 纯css3制作的太阳地球月亮效果
上课无聊看到的,虽然有很多兼容性问题,但先保存吧,原文链接如下: http://buluo.qq.com/p/detail.html?bid=16531&pid=9399270-1461480 ...
- javascript-动画animation自己学习做太阳地球和月球运转动画;
首先声明一点:自己学习的程序来源于: https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Basic_animat ...
最新文章
- 2018秋寒假作业4—PTA编程总结1
- python教程app下载地址_python教程
- AndroidStudio导入httpmime jar编译不通过的解决办法
- CSS(1)——如何使用css选择器
- HTML <dfn> 标签的简单介绍
- flush方法和close方法的区别
- SqlServer Split功能函数
- Java中文乱码破碎重组_总结彻底解决Spring MVC+Mybatis中文乱码问题
- 新一代纯前端控件集 WijmoJS 2018V2发布,提供 Web 设计器,可动态设计页面并生成代码...
- 代码中有的《飞秋》只是一个照面
- 6月8日任务(12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件)
- 计算机网络 间接路由选择与直接路由选择
- 什么是低信噪比图像及处理方法
- R语言中的read.table()
- 计算机软件故障及其处理方法,计算机常见软件故障及其解决方法
- 微信公众号:地图定位
- 关于LNode 和* LinkList
- 取火柴 c语言程序,hdu 1907 John(取火柴游戏)
- python画circos图_Circos图--在线绘制
- 雷曼另类“死因”:巴菲特漏看求救短信
热门文章
- 【程序人生】浅谈锤子科技515发布会
- fincial words
- 敏捷教练----Scrum-冲刺
- 雨润集团破产重组 品牌域名为双拼域名yurun.com
- javaweb网上点歌系统
- kylinTOP下载安装
- Springboot、Mybatis(Mybatis-plus) 、Mysql
- java密码强度_java实现的密码强度检测功能完整示例
- Eurosystems Eurocut Pro/EuroVECTOR 6.1.0.9 Multilingual-ISO 1CD(多用途的矢量设计软件)
- c语言三元组作用,数据结构 C语言 三元组的具体实现