学习于OpenGL入门、OpenGL编程指南、gluPerspective

#include "pch.h"
#include <GL/glut.h>
#include <iostream>
#include <stdio.h>
#include <time.h>
const GLdouble Pi = 3.1415926536;/*太阳半径69600km地球半径6378km月球半径1739km地球到太阳的距离约为1.5亿km=150000000km月亮到地球的距离约为      380000km
*//*修改不至于比例差距太大太阳半径69600000km(放大100倍)地球半径15945000km(放大 2500 倍)月球半径4345000km (放大 2500 倍)地球到太阳的距离约为1.5亿km=150000000km(保持不变)月亮到地球的距离约为        38000000km(放大 100 倍)
*//*假设三个天体都是球体,都处于同一平面假设每个月都是30天,一年12个月,共有360天太阳中心为原点,天体轨迹所在的平面表示了 X 轴与 Y 轴决定的平面,且每年第一天,地球在 X 轴正方向上,月亮在地球的正 X 轴方向。
*/static int day = 200;double CalFrequency() {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.0 / timegap;     return save;
}void myDisplay(void)
{double FPS = CalFrequency();     printf("FPS = %f\n", FPS);//glEnable(GL_DEPTH_TEST);  //启动深度测试 //glClear清除   GL_COLOR_BUFFER_BIT 表示清除颜色,GL_DEPTH_BUFFER_BIT表示清空深度缓冲glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/**************第一步确立可视空间*****************/glMatrixMode(GL_PROJECTION);//操作投影矩阵glLoadIdentity();    //将当前矩阵设置为单位矩阵//为了透视效果,使用gluPerspective设置可视空间,设定视角为75(可修改)//窗口大小为(400,400),所以高宽比为1.0。//最近可视距离为1.0。最远可视距离为200000000*2=400000000gluPerspective(75,1,1, 400000000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/*gluLookAt();前三个参数表示了观察点的位置,中间三个参数表示了观察目标的参数,最后三个参数表示从(0,0,0)到(x,y,z)的直线,他表示观察者认为上的方向观察目标设置为太阳中心,选择Z轴正方向为上方向,将地球半径取整200000000 */gluLookAt(0, -200000000, 200000000, 0, 0,0, 0, 0, 1);/****************绘制红色的太阳**************************/glColor3f(1.0f,0.0f,0.0f);glutSolidSphere(69600000, 20, 20);//球体半径,薄片数值,堆数值(后面两个都是描述球体精确度的)//绘制蓝色的地球glColor3f(0.0f,0.0f,1.0f);//今年已经经过的天数已知为 day,则地球转过的角度为 day/一年的天数*360 度。 前面已经假定每年都是 360 天// 注意地球公转是“自西向东”的,因此是饶着 Z 轴负方向进行逆时针旋转 glRotatef(day / 360.0*360.0, 0.0f, 0.0f, -1.0f);//glTranslatef(地球轨道半径, 0, 0); glTranslatef(150000000, 0.0f, 0.0f);glutSolidSphere(15945000, 20, 20);//绘制黄色的月亮glColor3f(1.0f,1.0f,0.0f);/*在绘制地球是,坐标已经旋转过的,现在的旋转是在以前的基础上进行旋转的,所以要处理差值可以在绘制地球前用glPushMatrix保存矩阵,绘制完地球后用glPopMatrix恢复矩阵。再设计一个跟地球位置无关的月亮位置公式绘制月亮*/glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f);     glTranslatef(38000000, 0.0f, 0.0f);    glutSolidSphere(4345000, 20, 20);/* OpenGL 把三维坐标中的物体绘制到二维屏幕,绘制的顺序是按照代码的顺序来进行的。因此 后绘制的物体会遮住先绘制的物体,即使后绘制的物体在先绘制的物体的“后面”也是如此。*/glFlush();glutSwapBuffers();
}void myIdle(void) {     /* 新的函数,在空闲时调用,作用是把日期往后移动一天并重新绘制,达到动画效果 */     ++day;     if (day >= 360)         day = 0;     myDisplay();
}int main(int argc, char *argv[])
{glutInit(&argc, argv);     /*glutInit,对 GLUT 进行初始化,这个函数必须在其它的 GLUT 使用之前调用一次。 */glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // 设置显示方式,使用RGB颜色 GLUT_DOUBLE 双缓冲    glutInitWindowPosition(100, 100);     /*设置窗口在屏幕中的位置*/glutInitWindowSize(400, 400);     /*设置窗口的大小*/glutCreateWindow("太阳,地球和月亮");   // 改了窗口标题     glutDisplayFunc(&myDisplay);     glutIdleFunc(&myIdle);                   glutMainLoop();      /*进行一个消息循环*/return 0;
}

void gluPerspective(
GLdouble fovy, //角度
GLdouble aspect,//视景体的宽高比
GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处
GLdouble zFar //沿z轴方向的两裁面之间的距离的远处
)
这个函数指定了观察的视景体(frustum为锥台的意思,通常译为视景体)在世界坐标系中的具体大小。

(1)参数fovy,指定视景体的视野的角度,以度数为单位,y轴的上下方向(Specifies the field of view angle, in degrees, in the y direction.)

(2)参数aspect,应该与窗口的宽高比大小相同。比如说,aspect=2.0表示在观察者的角度中物体的宽度是高度的两倍,在视口中宽度也是高度的两倍,这样显示出的物体才不会被扭曲。(Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).)

(3)参数zNear,指定观察者到视景体的最近的裁剪面的距离(必须为正数)
(Specifies the distance from the viewer to the near clipping plane (always positive).)

(4)参数zFar,指定观察者到视景体的最远的裁剪面的距离(必须为正数)
(Specifies the distance from the viewer to the far clipping plane (always positive).)

由gluPerspective产生的矩阵是与当前矩阵与指定的矩阵相乘得到的,就好像是调用glMatrix()产生的矩阵一样。为了使透视矩阵替代当前矩阵,在调用gluPerspective之前要先调用glLoadidentity()这个函数(就是把当前矩阵s设置为单位矩阵)。

OpenGL-入门-初级日地月相关推荐

  1. 【SQL开发实战技巧】系列(十六):数据仓库中时间类型操作(初级)日、月、年、时、分、秒之差及时间间隔计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  2. OpenGL入门学习

    OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合.  2.强大的可移植性.  3.高性能的图形渲染. 总之,OpenGL是一个很NB的图形 ...

  3. 最全面的openGL 入门学习

    自己在找openGL学习资料的时候,找到此篇openGL入门学习(虽然不是移动开发,但给我提供了非常好的思路),所以转一下让更多人知道,本文来自http://www.cppblog.com/doing ...

  4. OpenGL入门学习 (转)

    OpenGL入门学习 (转) 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜 ...

  5. 【待完善】OpenGL入门学习

    严正声明:本文转载自网络,但具体出处未知.如果有读者了解,请联系我更正. 为了阅读方便,我对文字格式进行了修改,并填补了缺少的图片. 我尊重每位作者的权益,如果本文存在侵权行为,请联系我删除并道歉. ...

  6. 【转载】OpenGL入门学习

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

  7. OpenGL入门教程(转)

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  8. 大神的日语学习方法,10天入门,2个月达到N3水平,7个月突破N1

    标题:大神的日语学习方法,10天入门,2个月达到N3水平,7个月突破N1,我先收藏起来,我晕,颠覆了我学习语言的思维,按照这个办法可以去攻克其他语种了         一.前言  很多同学问我学习日语 ...

  9. opengl 入门学习

    转自 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#include <gr ...

最新文章

  1. Android SQLite数据库之事务的学习
  2. 201705-201706 任务书单
  3. mybatis 配置_MyBatis教程3:优化MyBatis配置文件中的配置
  4. 经过 Webpack 处理过的 SAP Spartacus main.js
  5. java mod函数的使用方法_java 数学计算的具体使用
  6. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
  7. 情人节民宿预定量同比增200% 北京建国门最火
  8. 随手记android面试题,微众银行风险模型面试随手记(一面+二面)
  9. shopex服务器信息,shopex_全手册.doc
  10. linux如何后台执行程序?
  11. 职能式管理和流程式管理
  12. 中国计算机学会(CCF)推荐中文科技期刊目录(2020年发布,官网转载)
  13. 基于SAAS的都昌商业平台设计
  14. 大航海时代: 流行5掠夺篇
  15. 基于Java的ATM系统
  16. 【UE4 C++】 UE4 C++ 入门(无参考项目)——技术宅阿棍儿 学习笔记
  17. Cause: java.sql.SQLException: connection closed问题排查、解决
  18. u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)
  19. maven仓库配置及搜索顺序
  20. 大湾区创新创业孵化基地开展常态化项目申报,引入区块链与量子信息企业 | 产业区块链发展周报...

热门文章

  1. 线性代数中向量、矩阵深度理解(PartI)
  2. 关于程序语言的蛋生鸡 鸡生蛋问题
  3. nginx: [emerg] CreateFile() “D:\soft\nginx-1.18.0/logs/nginx.pid“ failed (5: Access is denied)
  4. quill自定义清除格式功能,选中内容清除格式
  5. python自动售货机
  6. MATLAB不同时频信号处理方法介绍及效果对比
  7. 一招完美解决vscode安装go插件失败问题
  8. 《大话设计模式》——读后感 (8)好菜每回味不同——建造者模式之经典案例(2)
  9. weixin sdk java 开源_weixin4j(微信公众开发平台SDK)
  10. IT运维管理工具大全