Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL Вопросы

OpenGL Вопросы

Поделиться

Страницы: 1 2 3 4 ... 12 ... 21 22 23 Следующая

DampireПостоялецwww7 ноя. 201411:55#0
Всем здрасте.
В 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. Матрицу передаю в шейдер.

Внимание, вопрос. Это так и должно быть?

HybernaculumПостоялецwww7 ноя. 201412:09#1
Dampire
> Внимание, вопрос.
Внимание, ответ.
Изображение
СтасПостоялецwww7 ноя. 201412:11#2
Dampire
> matrix = glm::translate(glm::mat4(1.f), position); // glm::vec3 position
> matrix = matrix * glm::toMat4(rotation); // glm::quaternion rotation

Не знаю что ты хотел получить, но ты тут только что переставил позицию в зависимости от поворота.
Правильное перемножение матриц: SRT (scale*rotation*translation) ты же повернул свою позицию, теперь у тебя там повернутые координаты.

СтасПостоялецwww7 ноя. 201412:12#3
Hybernaculum
Чего? С каких это пор?

Coordinate Systems (Direct3D 9)

Правка: 7 ноя. 2014 12:13

AMM1AKПостоялецwww7 ноя. 201412:16#4
Почему view что matrixInverse? В общем случае это неверно.
+Порядок перемножения неверный, как уже отметили.
Так как вектор будет умножаться на modelMatrix справа в итоге, то modelMatrix = translate*rotate*scale
DampireПостоялецwww7 ноя. 201412:42#5
Стас
Цитата с opengl-tutorial.org
В C++, с GLM :
glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;

Тем не менее, даже при смене порядка умножения абсолютно аналогичная ситуация. Скейл = 1, поворотов нет. View матрицу выпилил пока из шейдера.
gl_Position = projection * transform * vec4(position, 1.0);

FDsagiziПостоялецwww7 ноя. 201412:44#6
калдуй)
СтасПостоялецwww7 ноя. 201412:55#7
Dampire
>
> if(parent)
> {
> matrix = parent->GetWorldMatrix() * matrix;
> matrixInverse = parent->GetWorldMatrixInv() * matrixInverse;
> }

Не знаю что ты там еще на колдовал но даже в том что ты уже показал, много колдунств.
Операция inverse сама по себе очень тяжелая, а те ее еще и с умножением комбинируешь... Да еще не факт что правильно.

matrixInverse = parent->GetWorldMatrixInv() * matrixInverse; \\ Эта строчка типа для оптимизации?

Операцию инвертирования нужно использовать так редко как только возможно, лучше всего ее кешировать.  И лучше всего делать только по запросу.
Не видя твоего остального кода, сложно сказать какую еще магию ты создал

HybernaculumПостоялецwww7 ноя. 201413:07#8
Стас
> Чего? С каких это пор?
Это экранные координаты.
СтасПостоялецwww7 ноя. 201413:15#9
Hybernaculum
А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?
HybernaculumПостоялецwww7 ноя. 201413:24#10
Стас
> А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?
Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.
innuendoПостоялецwww7 ноя. 201413:39#11
Hybernaculum
> а по спецификациям у DirectX и OpenGL они отличаются.

И да, помнишь некий общий проект ? :) Там тоже было весело менять местами

DampireПостоялецwww7 ноя. 201414:55#12
Стас
> Операция 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. Вроде бы. Буду смореть дальше.

СтасПостоялецwww7 ноя. 201415:10#13
Hybernaculum
> Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.
Экранные координаты вообще не как и ни где не описываются. Перевод из мировых в экранные осуществляются через WVP трансформацию, а уж как у тебя настроены матрицы,
это уже твои проблемы. Ты можешь сделать центр координат, в центре, сверху, снизу, зеркальный. Как настроишь так и будет.
СтасПостоялецwww7 ноя. 201415:11#14
Dampire
Если можешь заглянуть внутрь функции projection посмори какую систему они выставляют, право или левосторонню.

Страницы: 1 2 3 4 ... 12 ... 21 22 23 Следующая

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр