glutSolidSphere和GL_LINE_STRIP在不同的位置绘制但基于相同的位置

时间:2017-01-07 21:47:51

标签: c opengl

我正在创建一个行星模拟,其中有过围绕太阳旋转的glutSolidSpheres,并且应该有跟踪它的后跟线,使用GL_LINE_STRIP创建。

我遇到的问题是这条小道并不跟随它后面的行星,它看起来好像它出现了行星与太阳的距离,而在另一侧。请看下面的图片,看看我的意思。

enter image description here

行星存储在双重链接列表中,每个行星都包含一个链接列表,用于存储路径的位置。每次更新行星位置时,该位置都会添加到轨迹中。

用于绘制轨迹线的代码如下所示:

for (struct planet *planet = head; planet != 0; planet = planet->next) {
        glPushMatrix();
        glTranslatef(planet->position[0], planet->position[1], planet->position[2]);//X, Y, Z
        glutSolidSphere(planet->mass, 10, 10);//Radius, slices, stacks
        if (!planet->isSun) {
            if (planet->trailStarted) {
                glDisable(GL_LIGHTING);
                glBegin(GL_LINE_STRIP);
                glLineWidth(1);
                for (struct trail *trail = planet->trailHead; trail != 0; trail = trail->next)
                {
                    glVertex3f(trail->position[0], trail->position[1], trail->position[2]);
                }
                glEnd();
                glEnable(GL_LIGHTING);
            }
        }
        glPopMatrix();
    }
    glFlush();
    glutSwapBuffers();
}

这些位置按照它们应该相互跟随,在上面看到的for循环中打印出结果,从此模拟中得到以下结果。 P代表行星位置,T代表小径位置: enter image description here

如果有人能说明为什么会这样做,那就太好了。如果您需要任何进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

已有来自直线的有效翻译:

glTranslatef(planet->position[0], planet->position[1], planet->position[2]);

这意味着坐标系的起源就在这个星球上。因此,绘制时,您需要减去行星坐标:

for (struct trail *trail = planet->trailHead; trail != 0; trail = trail->next)
{
    glVertex3f(trail->position[0] - planet->position[0], trail->position[1] - planet->position[1], trail->position[2] - planet->position[2]);
}

或者你需要在绘制轨迹之前做一个glPopMatrix()。 我更喜欢第二种选择:

for (struct planet *planet = head; planet != 0; planet = planet->next) {
    glPushMatrix();
    glTranslatef(planet->position[0], planet->position[1], planet->position[2]);//X, Y, Z
    glutSolidSphere(planet->mass, 10, 10);//Radius, slices, stacks
    glPopMatrix();
    if (!planet->isSun) {
        if (planet->trailStarted) {
            glDisable(GL_LIGHTING);
            glBegin(GL_LINE_STRIP);
            glLineWidth(1);
            for (struct trail *trail = planet->trailHead; trail != 0; trail = trail->next)
            {
                glVertex3f(trail->position[0], trail->position[1], trail->position[2]);
            }
            glEnd();
            glEnable(GL_LIGHTING);
        }
    }
}
glFlush();
glutSwapBuffers();