OpenGL For loop(随机月亮生成)

OpenGL For loop (Random moon generation)

本文关键字:月亮 随机 For loop OpenGL      更新时间:2023-10-16

我正在OpenGL中为一个大学项目创建一个3D太阳系,我已经到了必须生成卫星的地步。现在生成一个围绕行星运行的卫星很简单,但我正在尝试创建一个循环,它将生成我告诉它的卫星数量,并且在行星周围的随机位置,因此所有这些卫星的轨道都是不同的。

for(int count = 0; count < 5; count ++)
{
    glPushMatrix();
    glEnable(GL_LIGHTING);
    glTranslated (rand() % 8+8, 0.0, 0.0); //FIRST 
    glRotated((GLdouble) spin, 1.0, 70, 0.0);
    glutSolidSphere(0.8, 20, 10);
    glPopMatrix();
}

这就是我想出的,但它似乎在一遍又一遍地创造月亮。它创建我指定的数量,但不断重新创建它们。有人有什么想法吗?

你应该在创建月亮时存储它们的位置,并在它们绕行星旋转时更新这个位置。

您的代码,正如它目前编写的那样,每次执行时都会创建一个随机翻译。

因此,为了简单起见,添加一个创建卫星的过程,一个更新卫星以围绕其行星旋转的过程(您可能已经有一段代码来处理围绕恒星旋转的代码?),然后渲染更新的太阳系。

for -循环之前执行一个srand(0),以便每次都获得相同的随机数序列。

您可能应该创建一个结构或类,如下所示:

struct Moon
{
    float x, y, z;
    float rotAngle;
};

让它像你需要的那样复杂

创建所需数量的对象(使用array/list/...),在渲染循环之前初始化它们的值。

在渲染循环中,遍历所有这些对象,更新(如果需要?)并使用它们的值进行显示。

然而,它似乎在一遍又遍地绘制月亮。

FTFY。OpenGL不是一个场景图。您不会用它生成场景,该场景以某种方式存储在内部并按需呈现给用户。OpenGL是一个绘图API。如果你在动画循环中调用绘图代码,但总是使用一些新的随机参数进行绘制,事情就会跳来跳去。

解决方案:你需要一个场景图。在您的情况下,存储初始参数的简单列表就足够了。如果你想给它增添趣味,你也可以确定与给定质量的行星保持给定距离的正确轨道速度。