我正在创建一个行星模拟,其中有过围绕太阳旋转的glutSolidSpheres,并且应该有跟踪它的后跟线,使用GL_LINE_STRIP创建。
我遇到的问题是这条小道并不跟随它后面的行星,它看起来好像它出现了行星与太阳的距离,而在另一侧。请看下面的图片,看看我的意思。
行星存储在双重链接列表中,每个行星都包含一个链接列表,用于存储路径的位置。每次更新行星位置时,该位置都会添加到轨迹中。
用于绘制轨迹线的代码如下所示:
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代表小径位置:
如果有人能说明为什么会这样做,那就太好了。如果您需要任何进一步的信息,请告诉我。
答案 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();