0

我正在为一个大学项目在 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();
}

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

4

4 回答 4

3

您应该在创建月球时存储月球的位置,并在它们围绕行星旋转时更新此位置。

您当前编写的代码将在每次执行时创建一个随机 Translate。

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

于 2012-11-20T16:10:51.987 回答
0

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

于 2012-11-20T17:22:30.647 回答
0

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

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

让它像你需要的那样复杂

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

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

于 2012-11-20T17:42:10.083 回答
0

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

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

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

于 2012-11-20T17:46:46.703 回答