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

OpenGL Вопросы

Страницы: 1 2 396 97 Следующая »
#0
11:55, 7 ноя 2014

Всем здрасте.
В 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. Матрицу передаю в шейдер.

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

#1
12:09, 7 ноя 2014

Dampire
> Внимание, вопрос.
Внимание, ответ.
Изображение

#2
12:11, 7 ноя 2014

Dampire
> matrix = glm::translate(glm::mat4(1.f), position); // glm::vec3 position
> matrix = matrix * glm::toMat4(rotation); // glm::quaternion rotation

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

#3
12:12, 7 ноя 2014

Hybernaculum
Чего? С каких это пор?

Coordinate Systems (Direct3D 9)

#4
12:16, 7 ноя 2014

Почему view что matrixInverse? В общем случае это неверно.
+Порядок перемножения неверный, как уже отметили.
Так как вектор будет умножаться на modelMatrix справа в итоге, то modelMatrix = translate*rotate*scale

#5
12:42, 7 ноя 2014

Стас
Цитата с opengl-tutorial.org
В C++, с GLM :
glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;

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

#6
12:44, 7 ноя 2014

калдуй)

#7
12:55, 7 ноя 2014

Dampire
>
> if(parent)
> {
> matrix = parent->GetWorldMatrix() * matrix;
> matrixInverse = parent->GetWorldMatrixInv() * matrixInverse;
> }

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

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

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

#8
13:07, 7 ноя 2014

Стас
> Чего? С каких это пор?
Это экранные координаты.

#9
13:15, 7 ноя 2014

Hybernaculum
А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?

#10
13:24, 7 ноя 2014

Стас
> А при чем здесь экранные координаты? У ОпенГЛ они по твоему будут отличаться?
Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.

#11
13:39, 7 ноя 2014

Hybernaculum
> а по спецификациям у DirectX и OpenGL они отличаются.

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

#12
14:55, 7 ноя 2014

Стас
> Операция 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. Вроде бы. Буду смореть дальше.

#13
15:10, 7 ноя 2014

Hybernaculum
> Не по моему, а по спецификациям у DirectX и OpenGL они отличаются.
Экранные координаты вообще не как и ни где не описываются. Перевод из мировых в экранные осуществляются через WVP трансформацию, а уж как у тебя настроены матрицы,
это уже твои проблемы. Ты можешь сделать центр координат, в центре, сверху, снизу, зеркальный. Как настроишь так и будет.

#14
15:11, 7 ноя 2014

Dampire
Если можешь заглянуть внутрь функции projection посмори какую систему они выставляют, право или левосторонню.

Страницы: 1 2 396 97 Следующая »
ПрограммированиеФорумГрафика