Вращать вершины куба, используя матрицу вращения

0

Я пытаюсь повернуть вершины куба с матрицей вращения, но всякий раз, когда я запускаю программу, куб просто исчезает.

Я использую матрицу вращения, которая была дана нам в лекции, которая вращает координаты куба x.

double moveCubeX = 0;
float xRotationMatrix[9] = {1, 0, 0,
                            0, cos(moveCubeX), sin(moveCubeX),
                            0, -sin(moveCubeX), cos(moveCubeX) 
};

Я добавляю к переменной moveCubeX с клавишей 't' на моей клавиатуре

case 't':
    moveCubeX += 5;
    break;

И для выполнения умножения матрицы я использую

glMultMatrixf();

Однако, когда я добавляю это в свой код при его запуске, куб просто исчез. Здесь я добавляю функцию glMultMatrixf().

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    gluLookAt(pan, 0, -g_fViewDistance, 
              pan, 0, -1,
              0, 1, 0);

    glRotatef(rotate_x, 1.0f, 0.0f, 0.0f);   //Rotate the camera
    glRotatef(rotate_y, 0.0f, 1.0f, 0.0f);   //Rotate the camera

    glMultMatrixf(xRotationMatrix);

Я изо всех сил пытаюсь понять, где я, я ошибся.

Теги:
opengl
matrix
rotation

1 ответ

3
Лучший ответ

OpenGL использует матрицы размером 4x4. Поэтому ваша матрица вращения должна быть расширена до 4 строк и 4 столбцов, в общей сложности 16 элементов:

float xRotationMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
                             0.0f, cos(moveCubeX), sin(moveCubeX), 0.0f,
                             0.0f, -sin(moveCubeX), cos(moveCubeX), 0.0f,
                             0.0f, 0.0f, 0.0f, 1.0f};

Вам также нужно быть осторожным в отношении единиц для ваших углов. Поскольку вы добавляете 5 к вашему углу каждый раз, когда пользователь нажимает клавишу, похоже, что вы думаете в градусах. Стандартные функции cos() и sin() в библиотеках C/C++ ожидают, что угол будет в радианах.

Кроме того, похоже, что ваша матрица определена на глобальном уровне. Если вы это сделаете, элементы будут оцениваться только один раз при запуске программы. Вам нужно либо сделать определение матрицы локальным на display(), чтобы матрица была переоценена каждый раз, когда вы рисуете, либо обновляете матрицу каждый раз, когда изменяется угол.

Для второго варианта вы можете обновлять только элементы матрицы, которые зависят от угла при каждом изменении угла. В функции, которая изменяет moveCubeX, добавьте:

xRotationMatrix[5] = cos(moveCubeX);
xRotationMatrix[6] = sin(moveCubeX);
xRotationMatrix[9] = -sin(moveCubeX);
xRotationMatrix[10] = cos(moveCubeX);
  • 0
    Первоначально я читал википедию о матрицах вращения, как 4x4, и по какой-то причине изменил ее. В любом случае, хорошая новость заключается в том, что куб на самом деле появляется, когда я его запускаю, однако он не перемещается, когда я нажимаю клавишу. Что касается градусов / радианов, у меня сложилось впечатление, что OpenGL использует градусы в соответствии с этим stackoverflow.com/questions/2146884/… .
  • 0
    Я только что понял, что вы имели в виду под градусами и радианами, поскольку это в C ++, а не в OpenGL. Я только что попробовал, чтобы каждый раз добавлялось 0,175 радиана. Тем не менее, он все еще не работает, поскольку фактически ничего не делает с кубом.
Показать ещё 6 комментариев

Ещё вопросы

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