c++ - OpenGL:动画时所有行星绕太阳的速度相同

标签 c++ opengl animation glut

我正在尝试在 GLUT 中制作太阳系的动画,但不知何故,所有行星都以相同的速度绕太阳飞行,而它们都有不同的值。

我是 OpenGL/GLUT 新手,所以如果您能解释您的答案,我们将不胜感激:)

这是我的动画方法:

void renderScene(void) 
{
glClearDepth(1);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if (spinMode) {
    // Update the animation state
    HourOfDay += AnimateIncrement;
    DayOfYear += AnimateIncrement/24.0;

    HourOfDay = HourOfDay - ((int)(HourOfDay/24))*24;
    DayOfYear = DayOfYear - ((int)(DayOfYear/365))*365;
}

glLoadIdentity();

glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);

glRotatef(15.0, 1.0, 0.0, 0.0 );

//Drawing the sun
glTranslatef(0.0f, 0.0f, f);
glColor3f(1.0, 1.0, 0.0);
//glPushMatrix();
gluSphere(quad[0], 1.0f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();

//Drawing mercurius
glColor3f(0.5, 0.5, 0.5);
glPushMatrix();
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();

//Drawing the earth
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.4f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();

//Drawing the earth1
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.6f, 64, 64);
glRotatef(360.0*3*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();

//Drawing the earth2
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(4.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.3f, 64, 64);
glRotatef(360.0*4*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();

//Drawing the earth3
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(4.3, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.75f, 64, 64);
glRotatef(360.0*2*DayOfYear/365.00, 0.0, 1.0, 0.0);
glPopMatrix();

// Flush the pipeline, and swap the buffers
glFlush();
glutSwapBuffers();

if ( singleStep ) {
    spinMode = GL_FALSE;
}

glutPostRedisplay();        // Request a re-draw for animation purposes
}

最佳答案

您的通话顺序错误。所以每个行星都会沿着 y 轴绕其中心旋转。 以水星为例。

glTranslatef(2.0, 0.0, 0.0);//Move to new position
gluSphere(quad[1], 0.2f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0); //Rotate y axis

正确的顺序应该是

glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0); //Rotate y axis
glTranslatef(2.0, 0.0, 0.0); //Move to new position
gluSphere(quad[1], 0.2f, 64, 64);

但是,如果这是唯一的错误,那么您的行星将根本不会绕太阳旋转。使你的行星绕太阳旋转的是第二个错误,你忘记在与太阳进行变换之前插入矩阵。因此,每个星球都会继承这些转变。 正确的代码应该是

//Put every global transformation here


//Drawing the sun
glPushMatrix();
glColor3f(1.0, 1.0, 0.0);
glRotatef(360.0 * DayOfYear / 365.0, 0.0, 1.0, 0.0); //This will self-rotate the sun
gluSphere(quad[0], 1.f, 64, 64);
glPopMatrix();

//Drawing mercurius
glPushMatrix();
glColor3f(0.5, 0.5, 0.5);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64);
glPopMatrix();

//Drawing the earth1
glPushMatrix();
glColor3f(0.2, 0.2, 1.0);
glRotatef(360.0*3*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.6f, 64, 64);
glPopMatrix();

此外,您应该只在主渲染函数中使用 glutSwapBuffers() ,并在回调中使用 glutPostRedisplay() 。不要在同一个函数中使用它们。

关于c++ - OpenGL:动画时所有行星绕太阳的速度相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5744929/

相关文章:

animation - 如何在 Beamer 上添加 gif/动画(Adobe 停用 Flash 后)

jQuery 显示/隐藏不触发回调

c++ - 使用 OpenGL 绘制时钟的小时标记

c++ - GLFW 第一响应者错误

python - 如何使用 matplotlib 在 Python 中对沿圆周移动的多个点进行动画处理?

c++ - 如何找出内存访问粒度?

c++ - 最大缓冲区数

c++ - 虚函数触发 protected 变量的编译错误

c++ - c++的构造函数和析构函数汇编

c++ - 如何在 stdlib.h 中启用 __BEGIN_NAMESPACE_STD