openGL之天体运动

计算机图形学模拟天体运动的方法
天体运动:
1、模拟地球自转和公转
2、模拟月亮卫星绕地球转

以下涉及了计算机图形学中的三维观察的内容

  glViewport(0, 0, (GLsizei)w, (GLsizei)h);//定义视区大小
    glMatrixMode(GL_PROJECTION);//将矩阵设置成投影模式,满足绘图所需执行的矩阵变换
    glLoadIdentity();//将当前矩阵设为单位矩阵,在变换前需要将矩阵设置为单位矩阵
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);

    /*
        透视投影gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)
        fovy: 眼睛上下睁开的幅度,值越小,视野范围越狭小(眯眼),值越大,视野范围越宽阔(睁开铜铃般的大眼),值为0,闭眼
        aspect: 实际窗口的横纵比
        zNear: 近截面(不能为负数)
        zFar: 远截面(不能为负数)
    */
    glMatrixMode(GL_MODELVIEW);//将矩阵设置成模型视图模式,满足绘图所需执行的矩阵变换
    glLoadIdentity();//将当前矩阵设为单位矩阵,在变换前需要将矩阵设置为单位矩阵

    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

glutWireSphere函数是openGL里面自定义的一个函数,用来画球体

    void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
    radius: 球体的半径
    slices: 以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)
    stacks: 围绕在Z轴周围的线的条数(类似于地球上纬线)

year表示行星绕着太阳中心公转时,每次改变的角度的变量
day表示地球自转时,每次旋转的角度变量

    glPushMatrix();//保存当前位置
    
    /*太阳*/
    glColor3f(1.0, 0.0, 0.0);
    glutWireSphere(1.0, 20, 16); //网状球体,模拟太阳,红色
    
    /*太阳与地球之间的行星*/
    glRotatef((GLfloat)year1, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟行星绕太阳转动
    glTranslatef(1.5, 0.0, 0.0);//平移,x正方向
    glColor3f(0.0, 0.0, 1.0);
    glutWireSphere(0.15, 10, 8); //绘制一个小的网状球体,模拟行星,蓝色
    
    glPopMatrix();//恢复之前保存的位置
    
    glPushMatrix();//保存当前位置
    
    /*地球*/   
    glRotatef((GLfloat)year, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟地球绕太阳转动
    glTranslatef(2.0, 0.0, 0.0);//平移,x正方向
    glRotatef((GLfloat)day, 0.0, 1.0, 0.0);//绕y逆时针旋转day度,GLfloat32位浮点数,模拟地球自转

    glPushMatrix();//保存当前位置
    
    glMatrixMode(GL_MODELVIEW);//设置为模型视图模式,使用该模式能够良好的对当前对象进行变换
    glRotatef(60.0, 0.0, 1.0, 1.0);//地球轴旋转变换
    glColor3f(0.0, 1.0, 0.0);
    glutWireSphere(0.2, 10, 8); //绘制一个小的网状球体,模拟地球,绿色
    
    glPopMatrix();//恢复之前保存的位置


    /*月亮*/
    glRotatef((GLfloat)year, 0.0, 1.0, 0.0);//绕y逆时针旋转year度,GLfloat32位浮点数,模拟月亮绕地球转动
    glTranslatef(0.5, 0.0, 0.0);//平移,x正方向
    glColor3f(1.0, 1.0, 0.0);
    glutWireSphere(0.05, 10, 8); //绘制一个小的网状球体,模拟月亮,黄色
    glPopMatrix();//恢复之前保存的位置

    glutSwapBuffers();//GLUT_DOUBLE双缓冲,屏幕显示调用glutSwapBuffers()

在刚开始做这个天体运动的时候,对于月亮卫星绕地球转动时,总是不成功,原因是在编写代码的时候,总是使用glPopMatrix();函数回到画太阳的最初位置,最后导致月亮在转动时总是绕着太阳转,没有达到最初想要的效果。
所以,要达到月亮转的效果,必须使月亮相对位置的是地球,才能够达到所需效果。

实现效果图(依次分别为:最初,公转,自转月亮绕地球转)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值