2013-05-16 62 views
2

我可以讓地球圍繞太陽旋轉並圍繞自己的軸旋轉,但是我無法讓月球繞着地球旋轉。 (我只是希望它的流通周圍,我並不需要計算重力或類似的東西。)與太陽有關的月球軌道

這裏是我的代碼:

double earth_x = 50.0 * cos(orbit/180.0 * Math::Constants<double>::pi); 
double earth_y = 45.0 * sin(orbit/180.0 * Math::Constants<double>::pi); 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
//sun 
glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(1.5f,1.0f,0.0f)); 
glTranslate(0.0f, 0.0f, 0.0f); 
glRotate(0.0, 0.0, 0.0, 00.0); 
drawEllipsoid(10.0, 1.0, 4, 4); 



//Earth 
glPushMatrix(); 
glTranslate(earth_x, earth_y, 0.0); 
glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(0.2f,50.0f,50.5f)); 
glRotatef(110,0.0,23.0,110.0f); 

glRotatef(orbit2, 0.0f, 0.0f,1.0f); 
drawPlanetGrid(5, 1, 20, 20, 1.5); 

glPopMatrix(); 

glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(50.2f,50.0f,50.5f)); 
//Moon 
glTranslate(earth_x+10, earth_y+10, 0.0); 
glRotate(moonOrb, 0.0, 0.0, 1.0); 

drawEllipsoid(1, 1, 9, 9); 

moonOrb += .5; 
if (moonOrb > 360) 
moonOrb = 0.0; 
orbit += .9; 
if (orbit > 360)  
{ 
    orbit = 0; 
} 
orbit2 += 6.5; 
if (orbit2 > 360) 
{ 
orbit2 = 0; 
} 

任何想法可能是錯我的代碼? 截至目前,我的物體沒有紋理,所以這就是爲什麼它從代碼中缺失。我只是試圖瞭解太陽系如何在對尺寸,軌道形狀等進行任何改變之前進行工作。

+0

通過軌道,你只是指圓圈,而不是計算重力和力量等。 –

+0

是的,這是正確的。我只是想讓它在我的「地球」球體周圍流通。 – TRod

回答

3

假設你做了我在https://stackoverflow.com/a/16594168/252687中推薦的內容,你所要做的就是再次爲月球複製代碼。由於天體並沒有嚴格的約束,所以獨立計算它們的軌道是更明智的,而不是嵌套它們的參考幀。

地球的位置是:

earth_x = 30.0 * cos(earth_orbit/180.0 * PI) 
earth_y = 30.0 * sin(earth_orbit/180.0 * PI) 

月亮的位置是:

moon_x = earth_x + 15.0 * cos(moon_orbit/180.0 * PI) 
moon_y = earth_y + 15.0 * sin(moon_orbit/180.0 * PI) 

和代碼應該是這樣的:

drawTheSun(); 

glPushMatrix(); // enter the Earth's frame of reference 
glTranslate(earth_x, earth_y, 0.0); // move to the position of the Earth 
glRotate(110, 0.0, 23.0, 110.0f); // earth-local transformations 
drawTheEarth(); 
glPopMatrix(); // exit the Earth's frame of reference 

glPushMatrix(); // enter the Moon's frame of reference 
glTranslate(moon_x, moon_y, 0.0); // move to the position of the Moon 
glRotate(110, 0.0, 23.0, 110.0f); // moon-local transformations 
drawTheMoon(); 
glPopMatrix(); // exit the Moon's frame of reference 
+0

當我這樣做時,它開始在地球周圍移動,但不是圍繞它旋轉,而是做了更多的曲折。任何想法爲什麼會發生?謝謝 – TRod

+0

我不確定你的意思是什麼zig-zag。確保你的'moon_orbit'增量不是太大,行星轉換不會相互影響。 –

+0

我是這樣一個小菜!我有我的罪和cos倒...我知道了...謝謝你 – TRod

1

給這一個鏡頭:

#include <GL/glut.h> 

void display() 
{ 
    static int lastMs = glutGet(GLUT_ELAPSED_TIME); 
    int curMs = glutGet(GLUT_ELAPSED_TIME); 
    double dt = (curMs - lastMs)/1000.0; 
    lastMs = curMs; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    gluPerspective(60, w/h, 0.1, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0, 0, -20); 

    static float earth = 0; 
    static float moon = 0; 

    earth += 2 * dt; 
    moon += 36 * dt; 

    glPushMatrix(); 
    { 
     glColor3ub(255, 255, 0); 
     glutSolidSphere(4, 8, 8); 

     glPushMatrix(); 
     { 
      glRotatef(earth, 0, 0, 1); 
      glTranslatef(10, 0, 0); 

      glColor3ub(0, 255, 255); 
      glutSolidSphere(1.5, 8, 8); 

      glPushMatrix(); 
      { 
       glRotatef(moon, 0, 0, 1); 
       glTranslatef(2, 0, 0); 

       glColor3ub(128, 128, 128); 
       glutSolidSphere(0.5, 8, 8); 
      } 
      glPopMatrix(); 
     } 
     glPopMatrix(); 
    } 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void timer(int extra) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(16, timer, 0); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutTimerFunc(0, timer, 0); 
    glutMainLoop(); 
    return 0; 
}