OpenGL入门记录--“太阳,地球和月亮”系统代码

抄的别人的代码,运行时发现窗口里全是黑的,,后来在网上找到说在启用深度测试后加上这句 glDepthFunc(GL_EQUAL);就可以了;后来我把这句注释掉,将gluPerspective(60.0, 1.0, 1, 400000000);的第三个参数改成10000时,发现也是可以的,具体什么情况 我也还没搞清楚。。。然后,自己加入了鼠标左键单击事件,每单击一次,day加1,可以模拟地球绕太阳、月球绕地球旋转,,,,


#include "stdafx.h"
#include <math.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include "gl/glut.h"

// 太阳、地球和月亮
// 假设每个月都是30天
// 一年12个月,共是360天
static int day = 180; // day的变化:从0到359
void myDisplay()
{
 glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_EQUAL);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(60.0, 1.0, 1, 400000000);
// gluPerspective(60.0, 1.0, 10000, 400000000);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);

 // 绘制红色的“太阳”
 glColor3f(1.0f, 0.0f, 0.0f);
 glutSolidSphere(69600000, 40, 40);
 
 // 绘制蓝色的“地球”
 glColor3f(0.0f, 0.0f, 1.0f);
 glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
 glTranslatef(150000000, 0.0f, 0.0f);
 glutSolidSphere(15945000, 40, 40);

 // 绘制黄色的“月亮”
 glColor3f(1.0f, 1.0f, 0.0f);
 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);

 glFlush();
}

void mymouse(int button, int state, int x, int y)
{
 if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  day++;
 if (day > 360)
  day = 0;
 
 myDisplay();
}

int main(int argc, char *argv[])
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(400, 400);
 glutCreateWindow("OpenGL学习");
 glutDisplayFunc(&myDisplay);
 glutMouseFunc(&mymouse);
 glutMainLoop();
 return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值