如何使用OpenGL围绕太阳旋转地球?

时间:2011-02-05 21:29:53

标签: opengl matrix rotation

请原谅我的问题

我发现了我的错误,这是一个愚蠢的错误。一切正常。那么我该如何删除这个问题?


我似乎无法用OpenGL让地球绕太阳旋转,我不知道为什么会这样。

这是(我相信的)相关源代码的简化版本(用c ++编写)。

这是在调用任何其他OpenGL函数之前调用一次Init()函数:

void Init() {

  glMatrixMode(GL_MODELVIEW);

  gluLookAt (
    0,  1, -3, // Where am I
    0,  0,  0, // Where am I looking at
    0,  1,  0  // Direction of 'my head'
  );

  // Going to Projection mode ...
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  // ... to set up perspective viewing.
  glFrustum   (-0.5,   0.5, 
               -0.5,   0.5, 
                1.0, 100.0);

  // Going back to Model view since drawing
  // is done entierly in Modelview.
  glMatrixMode(GL_MODELVIEW);
}

然后这是为了“动画”场景而被重复调用的Draw()函数:

void Draw() {

  glClear(
    GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT
  );

  // Draw yellow Sun
  glColor3d(1.0, 1.0, 0.0);
  sphere(radius_sun);


  // draw the path of the Earth around
  // the Sun. Assume distance Earth to Sun = 1

  glColor4d( 0.0, 0.0, 1.0, 0.5);
  glBegin(GL_LINE_LOOP);

    for (double q=0; q<=1; q+=0.01) {
      double rad = q * M_PI * 2.0;
      glVertex3d(std::cos(rad), 0, std::sin(rad));
    }

  glEnd(); 

  // the Earth
  glColor3d(1.0, 1.0, 1.0);

  glPushMatrix();

  // Assign a value to t dependant on the
  // time already passed.
  double t = IncreasingDouble(); 

  double angle = t * M_PI * 2.0;

  // Rotate scene angle degres about y-axis:
  glRotated   (angle, 0, 1, 0);

  // And then translate coordinate system 
  glTranslated(1, 0, 0);

  sphere(radius_earth);

  // Restore matrix for next call
  glPopMatrix();

  // Swap Buffers and the more snipped..
}

我没有发现我的错误,但是地球正在螺旋式地远离太阳而进一步移动尽管场景的其余部分(太阳和地球的轨道路径)被正确绘制。

1 个答案:

答案 0 :(得分:1)

问题必须在别处,也许在你的sphere()方法中。我跟你做了同样的步骤,但我的工作。这就是我所拥有的,它以你想要的方式工作(一个球体在另一个球体周围平滑旋转)(另外,请注意我的gluLookAt和glFrustum是不同的,但这应该没有区别。我只是这样做,所以我可以使用我的鼠标改变我的观察点):

// draw the scene
void myGlutDisplay( void )
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    // projection transform
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1, 1, -1, 1, 1, 1000);

    // camera transform
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(eye[0], eye[1], eye[2], lookat[0], lookat[1], lookat[2], 0, 1, 0);


    //
    // draw some stuff
    //

    // Draw yellow Sun
    glColor3d(1.0, 1.0, 0.0);
    glutSolidSphere(1, 128, 128);

    glPushMatrix();
    double angle = (t+=.1) * 3.14156 * 2.0;
    glRotated(angle, 0, 1, 0);
    glTranslated(5, 0, 0);
    glutSolidSphere(1,128,128);
    glPopMatrix();

    glutSwapBuffers(); 
}