Результаты glRotatef на Wirecube

0

Я использую функцию 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();
}
}
Теги:
opengl

2 ответа

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. Таким образом, каждый куб, который имеет одинаковые кубикиOrigins [i].rotateX и cubeOrigins [i].rotateY, получит одинаковые обороты. Здесь вам нужно получить некоторые изменения (изменение rotateAxis для каждого куба)

Наконец, вам не нужно вызывать оба:

glutSwapBuffers();
glFlush();

glutSwapBuffers() уже вызывает, внутренне glFlush

  • 0
    Я полагаю, вопрос в том, как мне этого избежать? Я попробовал несколько вещей, как упомянуто выше, и это моя проблема.
  • 0
    Я решил, это было ясно. Используйте вместо rotateAxis rand ()% 180 и условие if (если x == 0 && y == 0) x = 1)
Показать ещё 6 комментариев
0

первые вещи первые PLS

(я не уверен, что вы уже это сделали)

перед использованием метода C rand() вам нужно дать ему семя, чтобы вы получили "реальные" случайные числа, используя функцию srand()

  • 0
    Это было отлично посеяно. Ребята, это функция, которую я получаю желаемые результаты ранда. Теперь я хотел бы, чтобы я никогда не упоминал ранд.
  • 0
    хорошо, тогда: rand ()% 2 вернет только 0 или 1, и ничего больше не означает, что вы должны сделать что-то вроде (float) 1 / rand ()
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню