2014-11-14 3 views
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); 

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

ответ

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 использовал градусы в соответствии с этим http://stackoverflow.com/questions/2146884/why-does-opengl-use-degrees-instead-of-radians. – JaAnTr

+0

Я просто понял, что вы имели в виду о градусах и радианах, так как это на C++, а не в OpenGL. Я только что попробовал, чтобы каждый раз добавлял 0.175 радианов. Тем не менее, он все еще не работает, поскольку он фактически ничего не делает с кубом. – JaAnTr

+0

@JaAnTr - вам нужно пересчитывать ячейки матрицы каждый раз, когда вы меняете угол, а не просто определяете его один раз. –

Смежные вопросы