2014-09-15 2 views
-1

Я изучаю компьютерную графику через modern OpenGL tutorials, и у меня возникают проблемы с рефакторингом моего кода из GLM в класс математической математики. Используя GLM, я могу достичь желаемого эффекта (который представляет собой пирамидальную форму, вращающуюся по экрану); однако, используя мой математический класс, я не могу получить правильное преобразование. Для справки, this - это то, как выглядит преобразование с моим математическим классом. Используя GLM, форма будет переводиться вдоль оси x (по горизонтали), которая является тем, что я хочу. Я предполагаю, что код GLSL верен, так как он работает с кодом GLM.Вопросы матрицы преобразования

В моем классе Transform у меня есть функция, которая возвращает матрицу модели и которая сопоставляется с соответствующей однородной переменной в моем классе шейдеров.

Matrix4f Transform::getModel() const // my math class - not working 
{ 
    Matrix4f transMat, rotMat, scaleMat; 
    transMat.initTranslation(trans.x, trans.y, trans.z); 
    rotMat.initRotation(rot.x, rot.y, rot.z); 
    scaleMat.initScale(scale.x, scale.y, scale.z); 

    return transMat * rotMat * scaleMat; 
} 

glm::mat4 Transform::getModel() const // glm - works fine 
{ 
    glm::mat4 transMat = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); 
    glm::mat4 scaleMat = glm::scale(glm::vec3(scale.x, scale.y, scale.z)); 
    glm::mat4 rotX = glm::rotate(rot.x, glm::vec3(1.0, 0.0, 0.0)); 
    glm::mat4 rotY = glm::rotate(rot.y, glm::vec3(0.0, 1.0, 0.0)); 
    glm::mat4 rotZ = glm::rotate(rot.z, glm::vec3(0.0, 0.0, 1.0)); 
    glm::mat4 rotMat = rotX * rotY * rotZ; 

    return transMat * rotMat * scaleMat; 
} 

Я думаю, что проблема заключается в моем Matrix4<T> классе, но есть совсем немного кода, чтобы показать, так что я буду link. Класс Matrix основан на учебники я связанных выше.

P.S. Если вам интересно, почему я использую собственный математический класс вместо GLM, он предназначен для обучения (я понимаю, что GLM гораздо более подходит для этого, чем моя непроверенная библиотека).

+0

Попробуйте добавить кучу заявлений на печать. Распечатайте каждую матрицу в методе GLM, а также используйте свой собственный класс. Теоретически они должны быть одинаковыми на каждом этапе. Это позволит вам сузить место ошибки. –

+0

Думаю, я нашел проблему. Когда я создаю свою матрицу перевода 4x4, я инициализирую значения x, y и z в 4-ом столбце (при этом значение w равно 1). Но в GLM они инициализируют четвертую ROW. Кто-нибудь знает, почему это? – 011235813

+0

Это может быть только то, что вокруг матрицы упорядочено, майор строки или столбца. См. Https://en.wikipedia.org/wiki/Row-major_order. –

ответ

0

Спасибо за полезные комментарии, все, что мне нужно было сделать, это изменить третий параметр в glUniformMatrix *, который выполнил транспонирование на матрице преобразования.

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