Я пытаюсь повернуть вершины куба с матрицей вращения, но всякий раз, когда я запускаю программу, куб просто исчезает.
Я использую матрицу вращения, которая была дана нам в лекции, которая вращает координаты куба 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 использует матрицы размером 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);