绘制恒星行星卫星三星系统

来源:互联网 发布:sql server 声明变量 编辑:程序博客网 时间:2024/05/06 22:20

这次的博客略微有点偷懒了,主要利用上次博客的成果略微加了一点点东西形成的,因为网上流传着一份三星系统,我这次就是先制作了一个两星系统,其实也就是多加了一个函数void glTranslatef(GLfloat  x, GLfloat  y, GLfloat  z);

意思非常容易,就是往x,y,以及z方向上平移的向量

插一句,其实利用这个和之前的旋转,略微控制下旋转的速度就可以制作出三星系统,对了,为了表示的更加清楚我还专门用几种不同的颜色表示不同的星球

代码如下

#include<GL/GLUT.H>  #include <windows.h>      #include <math.h>      #include <gl/GL.h>      float pi = 3.1415927f;float r = 0.3f;//earthfloat r1 = 0.8f;//sunfloat r2 = 0.1f;//moonGLfloat ra = 45,rb=45,rc=45;//rotate anglevoid myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(100.0f, 1.0f, 1.0f, 10.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, -3.0, 3.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glColor3f(1.0, 0.0, 0.0);glRotatef(rb, 0, 0, 1);for (int j = 0; j < 20; ++j){glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r1*sin(pi*j / 20)*cos(2 * pi*i / 20), r1*sin(pi*j / 20)*sin(2 * pi*i / 20), r1*cos(pi*j / 20));}glEnd();glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r1*sin(pi*i / 20)*cos(2 * pi*j / 20), r1*sin(pi*i / 20)*sin(2 * pi*j / 20), r1*cos(pi*i / 20));}glEnd();}glColor3f(0,0,1);glRotatef(ra, 0, 0, 1);glTranslatef(2.5, 0, 0);for (int j = 0; j < 20; ++j){glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r*sin(pi*j / 20)*cos(2 * pi*i / 20), r*sin(pi*j / 20)*sin(2 * pi*i / 20), r*cos(pi*j / 20));}glEnd();glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r*sin(pi*i / 20)*cos(2 * pi*j / 20), r*sin(pi*i / 20)*sin(2 * pi*j / 20), r*cos(pi*i / 20));}glEnd();}glColor3f(1.0, 1.0, 0.0);glRotatef(rc, 0, 0, 1);glTranslatef(0.8, 0, 0);for (int j = 0; j < 20; ++j){glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r2*sin(pi*j / 20)*cos(2 * pi*i / 20), r2*sin(pi*j / 20)*sin(2 * pi*i / 20), r2*cos(pi*j / 20));}glEnd();glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r2*sin(pi*i / 20)*cos(2 * pi*j / 20), r2*sin(pi*i / 20)*sin(2 * pi*j / 20), r2*cos(pi*i / 20));}glEnd();}glutSwapBuffers(); //交换两个缓冲区}void myIdle(void){ra++;rb = rb + 2;rc = rc + 10;if (ra >= 360)ra = 0;if (rb >= 360)rb = 0;if (rc >= 360)rc = 0;//myDisplay(); glutPostRedisplay();}int main(int argc, char *argv[]){glutInit(&argc, argv);//glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutIdleFunc(&myIdle);glutMainLoop();return 0;}  
这里想要说明的一点是各种变换的矩阵都会叠加在之前的变换上面,比如在地球围绕太阳旋转的时候用到的矩阵,在月亮旋转地球的时候依然是有效的

留个疑问,就是如何去掉上面一种变换的效果

好像要用到 glPopMatrix();函数,挖个坑

来来来,上图

下一步的目标是用面片绘制立体图形,并且进行颜色处理,貌似要进入正题了哟
2 0
原创粉丝点击