Как рассчитать матрицу вида для объекта камеры

У меня был старый проект, где я рассчитывал свою матрицу вида, как это

float4x4 world = m_Frame.GetWorldMat();

float4x4 orthoN = world;
orthoN.XAxis.x = world.XAxis.x;
orthoN.XAxis.y = world.YAxis.x;
orthoN.XAxis.z = world.ZAxis.x;

orthoN.YAxis.x = world.XAxis.y;
orthoN.YAxis.y = world.YAxis.y;
orthoN.YAxis.z = world.ZAxis.y;

orthoN.ZAxis.x = world.XAxis.z;
orthoN.ZAxis.y = world.YAxis.z;
orthoN.ZAxis.z = world.ZAxis.z;

orthoN.WAxis.x = -float3::dotProduct( world.XAxis, world.WAxis );
orthoN.WAxis.y = -float3::dotProduct( world.YAxis, world.WAxis );
orthoN.WAxis.z = -float3::dotProduct( world.ZAxis, world.WAxis );

m_mView = orthoN;

но теперь я пытаюсь сделать это с openGL, реализующим объекты библиотеки GLM

я подумал, что так будет работать

m_mView = glm::inverse( m_Frame.GetWorldMat() );

это не похоже на работу. я делаю что-то неправильно? если все выглядит хорошо, я приму предположение, что я делаю что-то еще неправильно, и это не мое мнение.

Пример числа приводит к обоим

мои результаты были странными с GLM :: Inverse я получил

1.0, -0.12, -0.85, 0.0,
0.0, 0.87, -0.85, 0.0,
0.0, -0.12, 0.14, 0.0,
0.0, -0.12, -0.85, 1.0

с первым методом я получил целые числа

1.0, 0.0, 0.0, 0.0,
5.0, 6.0, 4.0, 0.0,
35.0, 36.0, 36.0, 0.0,
-1250, -1255, -1285, 1.0

1

Решение

При условии, что m_Frame.GetWorldMat() дает вам представление о трансформации мира, вы должны инвертировать матрицу, чтобы мир увидел трансформацию. Оба фрагмента делают то же самое.

В старом коде вы делаете это путем транспонирования верхней матрицы 3х3, которая показывает, что исходная матрица состояла только из поворота, поскольку вращение ортогонально, а обратное — его транспонирование. Исходный перевод также правильно перевернут.

Во втором фрагменте вы делаете то же самое, используя GLM только для того, чтобы он был немного менее производительным, поскольку он не знает, что M ортогонально (чистое вращение); поэтому вместо транспонирования он будет выполнять правильную обратную операцию, используя правило Крамера. Если вы хотите, вы можете избежать этого, используя функцию транспонирования, предоставляемую GLM. Убедитесь, что вы не транспонируете всю матрицу 4х4, а только верхнюю матрицу 3х3. Затем обработайте перевод оригинала отдельно, как в предыдущем коде.

Однако, что касается конечного результата, оба выдали бы одинаковый результат (приблизительно). Вы можете убедиться в этом, распечатав их или проверив значения в отладчике.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]