PavelBlend / blender-xray

STALKER (aka xray-engine) import/export plugin for Blender 3D
BSD 2-Clause "Simplified" License
187 stars 39 forks source link

При редактировании шейпа кости, объект шейпа поворачивается #799

Closed PavelBlend closed 2 weeks ago

PavelBlend commented 3 weeks ago

Краткое описание проблемы:

После нажатия Edit Shape, в сцену добавляется объект шейпа, который имеет не правильные трансформации. Шейп повёрнут не правильно.

Как воспроизвести ошибку:

  1. Импортировать этот *.ogf файл: stalker_bandit_1.zip (это файл из ТЧ)
  2. Зайти в режим позы и выбрать кость bip01_l_foot (левая ступня). Для других костей этого бага нет.
  3. Начать редактирование шейпа с помощью нажатия кнопки Edit Shape
  4. В 3д окне добавится объект шейпа с неправильным вращением

Ожидаемое поведение:

Трансформации шейпа должны совпадать с теми трансформациями, которые были изначально.

Версии ПО:

Дополнительная полезная информация:

https://github.com/user-attachments/assets/fcc595e1-1a45-4d76-8881-34cc9aebbd3d

igelbox commented 3 weeks ago

На 1a6317f6 и Blender 3.1.2 - не восроизводится:

https://github.com/user-attachments/assets/c9a5e50e-d6f8-4111-9aca-9dbf30be2a17

PavelBlend commented 3 weeks ago

@igelbox у меня в 3.1 шейпы всё таки смещаются, но не так сильно:

https://github.com/user-attachments/assets/7b873445-aebb-48ed-855f-54ab4fc8d84c

igelbox commented 2 weeks ago

Эт короч какая-то хрень в Блендере. Он же не полностью поддерживает матричные преобразования пространства, а только Translation/Rotation/Scale. Вот он, похоже, и пытается как-то их вытащить из полной матрицы, что мы ему отдаём:

Отдаём такую => будет криво:
Matrix(((2.165436541190502e-08, -0.06199997290968895, -2.514601078473788e-07, 0.1739184558391571),
        (-3.578126097636414e-07, -9.336877582200032e-08, 0.1592000424861908, -0.04987097159028053),
        (-0.0692005306482315, 1.8275335023076877e-08, -5.005479692954395e-07, 0.06411412358283997),
        (0.0, 0.0, 0.0, 1.0)))
А если её "почистить" => будет норм:
Matrix(((0.0, -0.06199997290968895, 0.0, 0.1739184558391571),
        (0.0, 0.0, 0.1592000424861908, -0.04987097159028053),
        (-0.0692005306482315, 0.0, 0.0, 0.06411412358283997),
        (0.0, 0.0, 0.0, 1.0)))

НО, мне бы не хотелось тут говнокод) с eps=1e-6 писать.. попробую сделать разложение в Translation/Rotation/Scale и пересборку матрицы сам, вдруг поможет.

igelbox commented 2 weeks ago

Ух, не, пересборка - не помогает, хз почему. Зато нашёл вариант без очистки матриц, но сложный, но, похоже, самый правильный: Раз уж ошибка накапливается при вычислении общей матрицы (т.е. при перемножении всех матриц parent-объектов, то можно исхитриться и создавать helper-не внутри системы координат арматуры, а внутри системы координат кости, для которой он создаётся. Для этого можно:

Код не писал, попробовал только в консольке побаловаться - выглядит норм:

image