我正在尝试在GLUT中制作Solarsystem的动画,但不知怎的,所有行星都以相同的速度绕太阳飞行,而它们都有不同的值。
我是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
}
答案 0 :(得分:4)
您的通话顺序错误。所以每个行星都会围绕y轴旋转。 以mercurius为例。
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()。不要在同一个功能中使用它们。
答案 1 :(得分:1)
注意360.0 * DayOfYear / 365.0在你的星球每个旋转中。如果您希望它们以不同的速度旋转,那么旋转它们的量需要不同。将365.0更改为不同的数字以生成多年不同的长度。数字越大,年份越长,数字越小,年份越短。
答案 2 :(得分:1)
您必须在 <{1}}和glTranslate
之后实际渲染球体。现在,你在中间做,所以它只会忽略旋转!
例如:
glRotate
应该是
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);
答案 3 :(得分:0)
你确定你不是自己旋转物体,而不是它们相对于中心点的位置吗?请尝试更改glPushMatrix()
和glPopMatrix()
之间语句的顺序。
答案 4 :(得分:0)
您实际上正在旋转和翻译已渲染的所有对象。我建议将每个行星唯一增量,以便它们以不同的速度旋转。您可以创建一个包含所有必要信息(如旋转和转速)的结构,并使用结构数据创建所有行星。这样,在你的if(spinMode)中,你可以做类似mars.revolve()的事情。这个想法适用于OpenGL的新人。