Инверсия матрицы 4x4 (комментарии)
Это сообщение сгенерировано автоматически.
Есть быстрая инверсия для частных случаев матрицы.
Например, для матрицы трансформации.
А можно не считать инверсию матриц. Можно просто на каждом этапе модификации исходной матрицы делать обратные модификации обратной матрицы. Матрицы же с неба обычно не сыпятся, они ж в процессе вычислений обычно формируются. А если и с неба, то не очень часто - считать однократно обратную в момент получения неизвестной матрицы "из внешнего мира", а потом модифицировать сразу пару прямая/обратная.
Для пущей красоты архитектуры иметь в качестве типа не просто матрицу, а сразу объект из прямой и обратной матрицы. И в операции ее умножения также требовать вторым аргументом такую же "двуликую" матрицу, и по возможности для всех последующих операций такие и хранить (если вопрос не стоит об ограничениях памяти).
Dmitry_Milk
Ну такое себе. Обратная матрица нужна раз в сто лет. А модификация MVP матрица происходит очень часто.
Ниже приведен вариант инверсии для матриц 4x4, где порядок элементов строки горизонтальный (RowMajor).
Бред же. Не важно RowMajor или ColMajor. Доказательтво: умножение матрицы на обратную - дает единичную.
@!!ex
> Обратная матрица нужна раз в сто лет
У меня инверсия матрицы в LookAt постоянно используется.
Также инверсия используется при просчете теней.
Так что 1 раз на кадр как минимум используется.
eDmk
> У меня инверсия матрицы в LookAt постоянно используется.
Обратные матрицы с ортонормированным базисом ищутся намного быстрее, через транспонирование.
MrShoor
> Так что 1 раз на кадр как минимум используется.
Я и говорю "раз в сто лет".
Относительно количества изменени матрицы MVP - "один раз за кадр" это "почти никогда".
UPD: Это было сказано в контексте "давайте на каждую операцию изменения матрицы сразу считать промежуточную инверсию для оптимизации". Соотношение вызовов изменения матрицы к получению обратной такое, что такая оптимизация только хуже сделает.
>Бред же. Не важно RowMajor или ColMajor.
Ну не бред. Не транспонированная как раз бред показывает в LookAt том же самом.
MrShoor
> Обратные матрицы с ортонормированным базисом ищутся намного быстрее, через
> транспонирование.
Пока ничего не нашел.
Ты на какое сейчас сообщение отвечаешь?
Код с обратной матрицей должен работать так, чтобы для случая:
1. Транспонируем
2. Ищем обратную
3. Транспонируем найденную матрицу
И для случая:
1. Сразу ищем обратную матрицу
Выдавать одинаковые результаты. Если это не так, то ты ищешь не обратную матрицу в общем случае, а обрабатываешь какой-то конкретный случай.
nes
> вы серьезно?
В подсказки и для новичков сгодится.
Вы погуглите - там такой код «зверский» в сети валяется, что мой просто лапочка :)
У меня лично оптимизация на SIMD работает. В 3,5 раза короче и быстрее.
eDmk
> Пока ничего не нашел.
Часть 3x3 с поворотом надо транспонировать. Часть со смещением умножить на минус 1
LookAtInverse := MatTranslate(- MyLookAt.Row[3].xyz) * Transpose( MyLookAt.AsMat3x3( ) );
Как то так.
MrShoor
Я по книжке делал:
2 точки в мировом пространстве указываешь и он туда смотрит.
+ вектор Up можно крутить и камера также крутится перпендикулярно оси зрения.
Более универсальное решение. Хотя я не спец в этом.
Тема в архиве.