2个旋转对象opengl

时间:2012-11-11 13:29:16

标签: c++ opengl

我有一个旋转对象旋转大约0,0,0。我现在想要另一个对象围绕另一个对象旋转。有点像地球围绕太阳旋转然后月球围绕地球旋转。 我不知道该怎么做。

void earth(){
glPushMatrix();
    glRotatef(anglee, 1.0f, 0.0f, 0.0f);
    glTranslatef(0.0,20,0);
    glutSolidSphere(0.8,50,50);
glPopMatrix();

glPushMatrix();
    glRotatef(anglee, 0.0f, 0.0f, 0.0f);
    glTranslatef(0.0,20.0,8);
    glutSolidSphere(0.4,50,50);
glPopMatrix();
anglee+=4.0f;
}

我的第一次旋转是正确的,但我不知道如何进行第二次旋转。

4 个答案:

答案 0 :(得分:1)

这是一个提示..在显示回调函数中执行此操作:

void display()
{
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(10,10,10, 0,0,0, 0,1,0);

    /* current position is by default the origin */

    //draw sun
    glutSolidSphere(1,100,100);

    //draw planet
    glRotated(angle1,0,1,0);        //rotates position by angle1
    glTranslated(0,0,5);            //translates position by sun-planet distance
    glutSolidSphere(0.7,100,100);   //draw planet at this new position

    //draw moon
    glRotated(angle2,0,1,0);        //rotates position by angle1+angle2
    glTranslated(0,0,2);            //translates position by planet-moon distance
    glutSolidSphere(0.3,100,100);   //draw moon at this new position

    glutSwapBuffers();

    angle1 += 0.2;
    angle2 += 0.2;
    if(angle1 > 360) angle1 = 0;
    if(angle2 > 360) angle2 = 0;
}

尝试评论绘制行星和月亮部分的某些线条并查看差异,这将有助于您理解它。

希望这有帮助!

答案 1 :(得分:1)

您在第二次轮播中遇到的问题:

glRotatef(anglee, 0.0f, 0.0f, 0.0f);

你还没有指定NoRotation Axis !!

尝试:

glRotatef(anglee, 0.0f, 1.0f, 0.0f);

围绕 Y轴旋转 !!!

答案 2 :(得分:0)

这是一些伪代码:

宣布时间浮动。

在更新/绘制循环中将其增加一个小值,如.01

为变换Y值执行Math.cos(时间)*(您想要的半径),为变换Y值执行Math.sin(时间)*(您想要的半径)。这将导致基于零时间的进展速率的轨道运行。

如果你需要让它偏离“中心对象”的位置,那么只需将第一个对象的平移添加到每个平移轴。

答案 3 :(得分:0)

你实际上在做的是在太空中彻底改变两个球体。你需要做的是相对于地球的位置进行月球的定位 - >在绘制地球和月球之间不要做glPopMatrix()。通过这样做,您可以重置opengl转换矩阵。

我会尝试如下:

  1. 在0/0/0
  2. 画月亮
  3. 将月球变换为0/0/0附近的轨道
  4. 在0/0/0
  5. 画地球
  6. 将地球转变为围绕太阳的轨道
  7. 所以一切都可以在GPU上完成......

    PS:我还没有尝试过您的代码。因此,为了按预期工作,可能需要对代码进行一些进一步的更改......