2个旋转物体

2 rotating objects opengl

本文关键字:旋转物 2个      更新时间:2023-10-16

我有一个旋转的物体大约旋转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;
}

我已经正确进行了第一次旋转,但我不确定如何进行第二次旋转。

这里有一个提示.. 在你的显示回调函数中这样做:

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

尝试从绘制行星和月球部分注释一些线条,看看差异,将帮助您理解它。

希望这有帮助!

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

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

是不是你没有指定无旋转轴!!

尝试:

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

Y 轴旋转 !!

下面是一些伪代码:

声明时间浮点数。

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

对变换 X 值执行 Math.cos(time) *(所需的半径),对变换 Y 值执行 Math.sin(time) *(所需的半径)。这将导致基于围绕零的时间进展速率的轨道运行。

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

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

我会尝试如下:

  1. 在 0/0/0 绘制月亮
  2. 将月球转换为 0/0/0 左右的轨道
  3. 在 0/0/0 绘制地球
  4. 将地球转换为围绕太阳的轨道

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

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