我正在OpenGL中为大学项目创建一个3D太阳系,我已经到了必须产生卫星的地步。现在生成绕行星运行的月球很简单,但我正在尝试创建一个循环,它将产生我告诉它的卫星量,并且在行星周围的随机位置,所以它们的轨道是不同的。 / p>
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();
}
这就是我想出来的,但它似乎一遍又一遍地创造了卫星。它创建我指定的数量但不断重新创建它们。有人有任何想法吗?
答案 0 :(得分:3)
您应该在创建月球时存储月球的位置,并在它们绕行星旋转时更新此位置。
您的代码,正如它当前编写的那样,每次执行时都会创建一个随机翻译。
所以为了简单起见,添加一个创建卫星的过程,一个更新卫星绕行星旋转的过程(你可能已经有一段代码可以处理围绕恒星的旋转?)然后渲染更新的太阳系
答案 1 :(得分:0)
在srand(0)
循环之前执行for
,以便每次都获得相同的随机数序列。
答案 2 :(得分:0)
您应该创建一个结构或类,如:
struct Moon
{
float x, y, z;
float rotAngle;
};
(让它变得如你所需要的那样复杂)
创建所需数量的对象(使用array / list / ...),在渲染循环之前初始化它们的值。
在渲染循环中,循环遍历所有这些对象,更新(,如果需要?)并使用它们的值显示。
答案 3 :(得分:0)
然而,似乎是
一遍又一遍地创建绘制卫星。
FTFY。 OpenGL 不是场景图。您不会生成带有它的场景,它以某种方式存储在内部并按需呈现给用户。 OpenGL是一个绘图 API。如果你在动画循环中调用绘图代码,但总是使用一些新的随机参数绘制,那么事情就会跳转。
解决方案:您需要一个场景图。在您的情况下,存储初始参数的简单列表就足够了。如果你想调整它,你也可以确定给定质量的行星给定距离的正确轨道速度。