我正在使用rand()函数和x变量和y变量在glRotatef中使用。兰德工作得很好。发生的事情是当我在X和Y都得到0值时,立方体通过收缩和膨胀而波动。我已经尝试了几种方法来确保这不会发生,但唉,我在这里。这是我正在使用的功能:
void initRandoms()
{
maxCubes = rand() % (CUBE_HIGH - CUBE_LOW + 1) + CUBE_LOW;
for (int i = 0; i < maxCubes; i++)
{
cubeOrigins[i].x = X_LOW + (float)rand() / (float)RAND_MAX * (X_HIGH - X_LOW);
cubeOrigins[i].y = Y_LOW + (float)rand() / (float)RAND_MAX * (Y_HIGH - Y_LOW);
//cubeOrigins[i].z =
cubeOrigins[i].size = SIZE_LOW + (double)rand() / (double)RAND_MAX * (SIZE_HIGH - SIZE_LOW);
cubeOrigins[i].rotateX = rand() % 2;
cubeOrigins[i].rotateY = rand() % 2;
}
正如我之前所说,每个立方体将在X轴,Y轴,XY轴上旋转或收缩和膨胀。这是我需要移除的收缩和膨胀对应于0 = X和0 = Y.我可以有X = 0或Y = 0.我试过的是一些if else条件但是会发生什么是我采取收缩和放大器;膨胀但随后所有立方体都朝同一方向旋转。我希望有人能弄清楚我做错了什么,并告诉我我需要做什么。我感谢大家的帮助。如果需要,我会添加更多代码。
这是myDisplay函数,其中使用了上述函数。上面的函数也在main中调用:
void myDisplay()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < maxCubes; i++)
{
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -120.0);
glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
//glRotatef(rotateAxis, 1, 1, 0);
glutWireCube(cubeOrigins[i].size);
}
cubeZ += 0.050f;
glutSwapBuffers();
glFlush();
if (cubeZ > 120.0f)
{
cubeZ -= 100.f;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < maxCubes; i++)
{
initRandoms();
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -120.0);
glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
//glRotatef(rotateAxis, 1, 1, 0);
glutWireCube(cubeOrigins[i].size);
}
cubeZ += 0.050f;
glutSwapBuffers();
glFlush();
}
}
答案 0 :(得分:2)
查看你的代码,我可以看到你正在使用这个函数旋转你的立方体:
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
问题是:当cubeOrigins [i] .rotateX和cubeOrigins [i] .rotateY都为零时会发生什么? OpenGL通过使用名为quaternion(http://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml)的数学函数来旋转矩阵,当x,y和z为零时,我想(因为你违反了它的一个前提,即|| x,y,z ||必须是1)它被简化为这个矩阵:
|cos(angle) 0 0 0|
| 0 cos(angle) 0 0|
| 0 0 cos(angle) 0|
| 0 0 0 1|
本质上是一个比例矩阵。这解释了你之前收缩和膨胀的影响。
所以,正如你之前观察到的那样,你需要避免这种情况。
其次,对于所有多维数据集,您使用相同的rotateAxis
。因此,具有相同cubeOrigins [i] .rotateX和cubeOrigins [i] .rotateY的每个立方体将获得相同的旋转。你需要在这里得到一些变化(改变每个立方体的rotateAxis)
最后,你不需要同时打电话:
glutSwapBuffers();
glFlush();
glutSwapBuffers()已经调用,内部glFlush
答案 1 :(得分:0)
首先要做的事情
(我不确定你是否已经这样做了)
在使用C rand() 方法之前,您需要给它一个种子,以便使用 srand获得“真实”的随机数() 功能