2014-12-23 41 views
3

我需要围绕太阳围绕地球旋转OpenGL。我目前能够围绕太阳旋转它,但是我需要将它旋转到椭圆轨道。现在椭圆已经生成,但我无法弄清楚如何沿着椭圆旋转它。在椭圆路径中旋转地球:OpenGL

绘制功能看起来像:

//orbit 
    glColor3f(1,1,1); 
    drawEllipse(3.2f,1.0f); //draws ellipse 
    //sun 
    glTranslatef(0,0,0);//suns position 
    glColor3d(1,1,0); 
    glutSolidSphere(2,50,50); 

    //EARTH 
    glRotatef(angle,0.0f,1.0f,0.0f); 
    glTranslatef(6.0f,0.0f,0.0f);//postion earths 


    glPushMatrix(); 
    glRotatef(angle2, 0.0f,1.0f,0.0f); 
    glColor3d(0.5,0.8,1); 

    glutSolidSphere(1,50,50); 
    glPopMatrix(); 
+3

您需要参数才能在每个时间步获得地球的目标位置 –

+0

借调,您不能简单地使用旋转+平移来获得椭圆上的正确位置。试着看看这个:http://en.wikipedia.org/wiki/Ellipse#General_parametric_form – vesan

回答

1
OpenGL does not store what you draw. If you draw a line in OpenGL, then OpenGL 
will take that line, perform various math operations on it, and write pixels 
into a framebuffer that makes the shape of a line. OpenGL does not remember 
that you drew a line; all OpenGL can do is write pixels to the framebuffer. 

所以,你可以在椭圆上的每个点绘制球体。

定义两个变量跟踪(X,Y)坐标为沿椭圆

float xForEarth, yForEarth; 

和计数器计数的程度(从0到360,然后再次转换地球0)

int counterForEarth = 0; 

,并使用下面的代码(您的绘图方法内),使椭圆并绘制地球上:

glBegin(GL_POINTS); 
    for (int i=0; i < 360; i++) 
    { 
     float degInRad = i*DEG2RAD; //const float DEG2RAD = 3.14159/180.0; 
     glVertex3f(cos(degInRad)*6.0, 
      sin(degInRad)*2.3,0.0f); 
    } 
    glEnd(); 
    if(counterForEarth>359) 
     counterForEarth = 0;//reset to 0 when becomes 360 
    else 
     counterForEarth++;//this will control the speed. Do counterForEarth += 2 to increase it's speed and vice-versa 

    xForEarth = cos(counterForEarth*DEG2RAD)*6.0f;//to change the x co-ordinate 
    yForEarth = sin(counterForEarth*DEG2RAD)*2.3f;//to change the y co-ordinate 
    glPushMatrix(); 
    glTranslatef(xForEarth,yForEarth,0.0f); 
    glRotatef(angle,0.0f,1.0f,0.0f); 
    glutSolidSphere(.4,30,30);//draw Earth 
    glPopMatrix();