1

我有一个旋转大约 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

4 回答 4

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;
}

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

希望这可以帮助!

于 2012-11-12T04:10:21.527 回答
1

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

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

是你没有指定 NoRotation Axis !

尝试:

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

Y 轴旋转!!!

于 2014-10-19T04:17:52.500 回答
0

这是一些伪代码:

声明时间浮动。

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

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

如果您需要将其偏移到“中心对象”的位置,则只需将第一个对象的平移添加到每个平移轴即可。

于 2012-11-11T13:46:25.067 回答
0

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

我会尝试如下:

  1. 在 0/0/0 处画月亮
  2. 将月球变换到 0/0/0 附近的轨道
  3. 在 0/0/0 处绘制地球
  4. 将地球转为绕太阳运行的轨道

所以一切都可以在 GPU 上完成......

PS:我没有试过你的代码。因此,可能必须对代码进行一些进一步的更改才能按预期工作......

于 2012-11-11T14:11:52.577 回答