OpenGL: все планеты имеют одинаковую скорость вокруг Солнца при анимации - PullRequest
2 голосов
/ 21 апреля 2011

Я пытаюсь сделать анимацию Солнечной системы в 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
}

Ответы [ 5 ]

4 голосов
/ 21 апреля 2011

Ваш заказ на звонок неверный. Таким образом, каждая планета будет вращаться вокруг своего центра вдоль оси 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 () в обратных вызовах. Не используйте их обоих в одной и той же функции.

1 голос
/ 21 апреля 2011

Вы фактически должны визуализировать сферу после , которую вы называете 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);

должно быть

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); // <-- after you rotate!
1 голос
/ 21 апреля 2011

Примечание 360.0 * DayOfYear / 365.0 находится в каждом из вращений вашей планеты. Если вы хотите, чтобы они вращались на разных скоростях, то величина, которую вы вращаете, должна быть разной. Измените 365.0 на другое число, чтобы получить годы разной длины. Большее число создаст более длинный год, а меньшее - более короткий.

0 голосов
/ 21 апреля 2011

Вы фактически вращаете и переводите все объекты, которые вы визуализировали.Я рекомендую увеличивать каждую планету уникально, чтобы они вращались с разной скоростью.Вы можете создать структуру, несущую всю необходимую информацию, такую ​​как скорость вращения и вращения, и использовать данные структуры для создания всех планет.Таким образом, в вашем if (spinMode) вы можете сделать что-то вроде mars.revolve ().Эта идея для новичков в OpenGL.

0 голосов
/ 21 апреля 2011

Вы уверены, что вы не вращаете сами объекты, а не их положение относительно центральной точки? Попробуйте изменить порядок операторов между glPushMatrix() и glPopMatrix().

...