Всем здрасте.
В GL правая система координат. Вперед значит -z, вправо +x, вверх +y. Это то, что я почерпнул из интернетов.
У меня же все не так.
При translate vec3(0, 0,-15) куб уезжает вперед от "камеры", тут все нормально
При translate vec3(2, 0,-15) куб уезжает вперед и почему-то влево
При translate vec3(0, 2,-15) куб уезжает вперед и почему-то вниз
Код перерасчета (после изменения позиции/углов/etc) model матрицы. Порядок перемножения вроде верный translate * rotation * scale
matrix = glm::translate(glm::mat4( 1.f), position); // glm::vec3 position matrix = matrix * glm::toMat4( rotation); // glm::quaternion rotation matrix = glm::scale( matrix, scale); // glm::vec3 scale matrixInverse = glm::inverse( matrix); if( parent) { matrix = parent->GetWorldMatrix( ) * matrix; matrixInverse = parent->GetWorldMatrixInv( ) * matrixInverse; }
Для view используется matrixInverse (свой трансформ камеры)
Для model используется matrix (свой трансформ куба)
Для projection - glm::projection(90.f, 4/3, 0.1f, 100.f)
Порядок перемножения матриц projection * view * model. Матрицу передаю в шейдер.
Внимание, вопрос. Это так и должно быть?
Dampire
> Внимание, вопрос.
Внимание, ответ.
Dampire
> matrix = glm::translate(glm::mat4(1.f), position); // glm::vec3 position
> matrix = matrix * glm::toMat4(rotation); // glm::quaternion rotation
Не знаю что ты хотел получить, но ты тут только что переставил позицию в зависимости от поворота.
Правильное перемножение матриц: SRT (scale*rotation*translation) ты же повернул свою позицию, теперь у тебя там повернутые координаты.
Hybernaculum
Чего? С каких это пор?
Почему view что matrixInverse? В общем случае это неверно.
+Порядок перемножения неверный, как уже отметили.
Так как вектор будет умножаться на modelMatrix справа в итоге, то modelMatrix = translate*rotate*scale
Стас
Цитата с opengl-tutorial.org
В C++, с GLM :
glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;
Тем не менее, даже при смене порядка умножения абсолютно аналогичная ситуация. Скейл = 1, поворотов нет. View матрицу выпилил пока из шейдера.
gl_Position = projection * transform * vec4(position, 1.0);
калдуй)
Dampire
>
> if(parent)
> {
> matrix = parent->GetWorldMatrix() * matrix;
> matrixInverse = parent->GetWorldMatrixInv() * matrixInverse;
> }
Не знаю что ты там еще на колдовал но даже в том что ты уже показал, много колдунств.
Операция inverse сама по себе очень тяжелая, а те ее еще и с умножением комбинируешь... Да еще не факт что правильно.
matrixInverse = parent->GetWorldMatrixInv() * matrixInverse; \\ Эта строчка типа для оптимизации?
Операцию инвертирования нужно использовать так редко как только возможно, лучше всего ее кешировать. И лучше всего делать только по запросу.
Не видя твоего остального кода, сложно сказать какую еще магию ты создал
Стас
> Чего? С каких это пор?
Это экранные координаты.
Hybernaculum
А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?
Стас
> А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?
Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.
Hybernaculum
> а по спецификациям у DirectX и OpenGL они отличаются.
И да, помнишь некий общий проект ? :) Там тоже было весело менять местами
Стас
> Операция inverse сама по себе очень тяжелая, а те ее еще и с умножением
> комбинируешь... Да еще не факт что правильно.
Все матрицы кешируются. Перересчет происходит когда была изменена позиция/угол/etc. Я уже писал об этом. GetWorldMatrix(Inv) проверяет на dirty флаг, при необходимости перерасчитывает и возвращает переменную matrix(Inv) матрицу.
Даже если перемножаю неправильно по парентам, сейчас что камера, что куб сами по себе, паренты нулевые.
glm::mat4 trans = glm::translate(glm::mat4( 1.f), position); glm::mat4 rot = glm::toMat4( rotation); glm::mat4 sca = glm::scale( glm::mat4( 1.f), scale); matrix = sca * rot * trans;
Методом научного тыка я определил, что матрица проекции переворачивает картинку на 180. Вроде бы. Буду смореть дальше.
Hybernaculum
> Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.
Экранные координаты вообще не как и ни где не описываются. Перевод из мировых в экранные осуществляются через WVP трансформацию, а уж как у тебя настроены матрицы,
это уже твои проблемы. Ты можешь сделать центр координат, в центре, сверху, снизу, зеркальный. Как настроишь так и будет.
Dampire
Если можешь заглянуть внутрь функции projection посмори какую систему они выставляют, право или левосторонню.