2011-04-21 56 views
2

我試圖在GLUT中製作Solarsystem的動畫,但不知何故,所有行星都以相同的速度在太陽周圍飛行,而它們都有不同值。OpenGL:動畫時,所有行星在太陽周圍都有相同的速度

我是新的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 
} 
+6

或許有太陽系暗物質? – 2011-04-21 13:59:55

+1

我可能用「使用GLUT」代替「GLUT」中的「GLUT」,僅供將來參考:) – 2011-04-21 21:14:48

回答

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()的回調。不要在相同的功能中使用它們。

0

你確定你不是旋轉物體本身,而不是它們相對於中心點的位置?嘗試更改glPushMatrix()glPopMatrix()之間的語句順序。

+0

正如我所說的,我對此非常陌生,glPushMatrix()和glPopMatrix()的目的並不清楚我。我嘗試了不同的組合,並將它們放在代碼中的不同位置,但它沒用。我希望這裏有人可以發佈答案,並向我解釋它是如何工作的。 – Galip 2011-04-21 13:54:27

+0

@Galip:對不起,需要一些努力。 :)你讀過OpenGL紅皮書嗎?所有的答案都在那裏。 – 2011-04-21 13:56:04

0

你實際上正在旋轉和翻譯你已經渲染的所有對象。我建議讓每個行星都獨一無二地增加,這樣他們會以不同的速度旋轉。您可以創建一個承載旋轉和轉速等所有必要信息的結構,並使用結構數據創建所有行星。這樣,在你的if(spinMode)中,你可以做類似mars.revolve()的事情。這個想法適用於OpenGL的新手。

1

注意360.0 * DayOfYear/365.0在你的每個星球的旋轉中。如果您希望它們以不同的速度旋轉,那麼旋轉它們的量需要不同。將365.0更改爲不同的數字以生成多年不同的長度。較大的數字會創造更長的一年,而較小的數字會產生更短的一年。

+0

這是問題;不是所有年份都等於365(甚至不是地球(365.25));食品雜誌:88一年的金星持續224.7個地球日,這是地球上一年的62%。 (金星的一天是243天,因此金星的一天實際上比它的一年更長!)開普勒的第三定律:P^2 = a^3。請參閱: geowar 2015-03-25 17:05:16

1

你有實際渲染領域後你打電話glTranslateglRotate。現在,你正在做它,所以它會忽略旋轉!

例如:

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

我認爲您的電話訂單將圍繞其核心旋轉行星,而不是繞太陽旋轉。 – Dikei 2011-04-21 17:38:10

+0

@Dikei,正確 - 將解決它。 – ltjax 2011-04-21 23:32:03

相關問題