Суть проблемы заключается в том, что я работаю над 3D-проектом, в котором используются отдельные инструменты для экспорта данных сетки и данных анимации.Эти инструменты имеют разные исходные точки.
- Сетки экспортируются с 0,0,0 в качестве нижней выровненной по левому краю точки сетки AABB.
- Анимации центрированы по x, z, а снизу выровнены по y.
Недавно я представил физический движок, который использует отдельный, полностью центрированный 0,0,0 жесткий корпус.пробел.
Я использую физический движок в качестве источника истины и пытаюсь соответствующим образом перевести различные исходные точки.
Мой текущий расчет положения вертика выглядит следующим образом:
gl_Position = projection * view * model * joint * (centerOffset * vec4(position.xyz, 1));
У меня есть ряд матриц преобразования, применяемых к трехмерным вершинам.
position.xyz
- исходные позиции vert
centerOffset
- переводпреобразование, которое смещает вершины в их соответствующую позицию в 0,0,0 центрированной AABB.
joint
- это матрица преобразования из экспортированной совместной анимации Blender.
model
- это матрица положения и вращения мира
Проблема, с которой я сталкиваюсь при таком подходев том, что вершины теперь центрированы вокруг мировой позиции model
правильно, но когда применяется совместная анимация, она искажается, потому что матрицы анимации joint
смещены относительно + Y, а данные сетки центрированы на Y: 0
То, что я ожидал бы сделать здесь, это смещение матрицы joint
, чтобы они находились в правильном диапазоне Y 0,0,0 центрированных вершин.
Я попытался умножить матрицу joint
на матрицу преобразования со смещением по Y, но в итоге она сдвигает весь искаженный набор вершин на новое смещение, а не конкретное совместное преобразование.
По сути, мне нужна эквивалентная операция: войти в Blender и вручную переместить все соединения вниз по оси Y, чтобы они были по центру Y, а не выровнены снизу, а затем повторно экспортировать матрицы соединений