这次的博客略微有点偷懒了,主要利用上次博客的成果略微加了一点点东西形成的,因为网上流传着一份三星系统,我这次就是先制作了一个两星系统,其实也就是多加了一个函数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;//earth
float r1 = 0.8f;//sun
float r2 = 0.1f;//moon
GLfloat ra = 45,rb=45,rc=45;//rotate angle
void 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();函数,挖个坑
来来来,上图
下一步的目标是用面片绘制立体图形,并且进行颜色处理,貌似要进入正题了哟