Выравниваем ориджин по низу для всех выделенных объектов при помощи Blender Python API

Геометрия объектов в Blender всегда строится вокруг ориджина (origin) – точки, которая в локальной системе объекта берется за начальную. И если ориджин не лежит в плоскости основания объекта, бывает сложно разместить этот объект на поверхности другого объекта. Быстро поставить ориджин в нижнюю точку для всех выделенных объектов сцены мы можем при помощи скрипта на Blender Python API.

Чтобы “сбросить” ориджин в нижнюю точку для каждого из выделенных объектов, мы можем сдвинуть сам объект вниз на высоту его ориджина, а все его вертексы поднять на ту же высоту вверх. Таким образом местоположение геометрии объекта не изменится, а его ориджин будет сдвинут к его основанию.

Пройдем в цикле по всем выделенным объектам:

Сначала изменим координаты всех вертексов объекта, подняв их вверх.

Чтобы понять, насколько именно нам нужно сдвинуть вертексы, мы должны найти самый нижний вертекс, лежащий в основании объекта, и из текущей координаты ориджина по оси Z вычесть координату этого вертекса по той же оси.

Текущая координата ориджина по оси Z:

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

Для этого умножим координату вертекса на мировую матрицу объекта.

Теперь мы можем найти вертекс с наименьшей по оси Z координатой.

И получить вектор для смещения вертексов.

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

Поэтому сначала сформируем матрицу для перемещения вертексов из полученного вектора.

Сохраним копию мировой матрицы трансформации объекта, чтобы исключить промежуточное влияние. А так же, ее инвертированную версию.

Теперь наконец мы можем начать перемещать вертексы.

Для каждого вертекса нашего объекта: сначала сбросим влияние матрицы трансформации, потом применим наше смещение по оси Z, после чего вернем влияние мировых трансформаций обратно.

Сейчас мы можем видеть, как все вертексы объекта сместились вверх по оси Z так, что встали на уровне (или выше) ориджина.

Осталось сместить сам ориджин, т.е. целиком объект, вниз, чтобы вернуть геометрию на исходное место.

Таким образом все ориджины для всех выделенных объектов сместились у нас в плоскость их оснований.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии