Я использую функцию rand() для переменной x и переменной y, которая будет использоваться в glRotatef. Рэнд работает отлично. То, что происходит, когда я получаю значение 0 как в X, так и в Y, куб колеблется, сокращаясь и раздуваясь. Я попробовал несколько способов убедиться, что этого не происходит, но, увы, я здесь. Вот функция, с которой я работаю:
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. То, что я пробовал, это некоторые, если другие условные выражения, но что происходит, я беру сжатие & раздуваются, но затем все кубы вращаются в одном направлении. Я надеюсь, кто-то может понять, что я делаю неправильно, и показать мне, что мне нужно делать. Я благодарю всех за помощь. При необходимости я добавлю больше кода.
Вот функция myDisplay, в которой используется вышеуказанная функция. Вышеупомянутая функция также называется в основном:
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();
}
}
Глядя на ваш код, я мог видеть, что вы вращаете свои кубы, используя эту функцию:
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
. Таким образом, каждый куб, который имеет одинаковые кубикиOrigins [i].rotateX и cubeOrigins [i].rotateY, получит одинаковые обороты. Здесь вам нужно получить некоторые изменения (изменение rotateAxis для каждого куба)
Наконец, вам не нужно вызывать оба:
glutSwapBuffers();
glFlush();
glutSwapBuffers() уже вызывает, внутренне glFlush
первые вещи первые PLS
(я не уверен, что вы уже это сделали)
перед использованием метода C rand() вам нужно дать ему семя, чтобы вы получили "реальные" случайные числа, используя функцию srand()