Я изучаю компьютерную графику через 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 гораздо более подходит для этого, чем моя непроверенная библиотека).
Попробуйте добавить кучу заявлений на печать. Распечатайте каждую матрицу в методе GLM, а также используйте свой собственный класс. Теоретически они должны быть одинаковыми на каждом этапе. Это позволит вам сузить место ошибки. –
Думаю, я нашел проблему. Когда я создаю свою матрицу перевода 4x4, я инициализирую значения x, y и z в 4-ом столбце (при этом значение w равно 1). Но в GLM они инициализируют четвертую ROW. Кто-нибудь знает, почему это? – 011235813
Это может быть только то, что вокруг матрицы упорядочено, майор строки или столбца. См. Https://en.wikipedia.org/wiki/Row-major_order. –