- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一个行星模拟,其中有 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代表轨迹位置:
如果有人能阐明它为什么这样做,那就太好了。如果您需要任何进一步的信息,请告诉我。
最佳答案
已经有来自以下行的有效翻译:
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();
关于c - glutSolidSphere 和 GL_LINE_STRIP 在不同位置绘制但基于相同位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526948/
我必须在类似“ Spring 质量”的系统的 3D 物理模拟中绘制大量球体。 我想知道一种绘制球体的有效方法,而不必在模拟的每一步都编译显示列表(每一步可能从毫秒到秒不等,具体取决于计算中涉及的物体数
我需要将地球纹理添加到 glutSolidSphere。问题是我无法弄清楚如何使纹理在整个球体上拉伸(stretch)并且仍然能够旋转。 我们正在启用纹理。 glTexGeni(GL_S, GL_TE
嗨,我的程序应该在屏幕中央显示一个纯红色的球体,我得到的只是球体的边界: int main(int argc, char **argv) { glutInit(&argc, argv); gl
当我使用此代码示例时,我得到一个平坦的白色球体。 我期待一个从侧面发光并旋转的球体。 #include #include int angle = 0; int _refreshmillisecon
我需要向 glutSolidSphere 添加地球纹理。问题是我无法弄清楚如何使纹理在整个球体上拉伸(stretch)并且仍然能够旋转。 我们正在启用纹理。 glTexGeni(GL_S, GL_TE
如何将纹理应用于 glutSolidSphere? 这是我已经尝试过但不起作用的方法: GLuint textureid; glGenTextures(1, &textureid);
我正在创建一个行星模拟,其中有 glutSolidSpheres 围绕太阳运行并且应该有跟踪线跟随它,使用 GL_LINE_STRIP 创建。 我遇到的问题是,这条轨迹并没有直接跟随行星在它后面,它看
我是一名优秀的程序员,十分优秀!