Перемещаем ориджин к центру выделения в меше с учетом инстансов

Скрипт, который мы написали для быстрого перемещения ориджина объекта к выделению, работает хорошо. До тех пор, пока в сцене не используются инстансы. Стоит нам переместить ориджин к выделению на объекте, у которого есть инстансы, мы увидим, что все инстансы объекта переместились со своих мест в новое положение. Так происходит потому, что перемещая ориджин относительно геометрии объекта мы, по сути, перемещаем саму геометрию относительно ее центральной точки, а потом уже эту центральную точку – ориджин, ставим в новое положение. Для инстансов же ориджин остается на тот же месте, где и был, а смещение геометрии никуда не исчезает, и поэтому получается скачок.

Исправить ситуацию достаточно просто. По сути, нам нужно просто пройтись по всем инстансам объекта и сместить их ориджины так, чтобы смещенная геометрия вернулась на место.

Доработаем наш скрипт так, чтобы учитывать поведение инстансов и возвращать их на место при переносе ориждина к центру выделения.

Начинаем мы, как и раньше с фиксации положения курсора.

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

Сохраним в списке инстансов указатель на собственно инстанс, а так же на его мировую матрицу, она нам понадобится для дальнейших преобразований.

Как и раньше, получим  положение текущего объекта, и указатель на рабочую область 3D вьюпорта для использования переопределения контекста (чтобы скрипт правильно отработал при вызове из Text Edit)

Переопределим контекст и поместим курсор в центр текущего выделения.

А теперь вернемся к дополнительным преобразованиям, нужным для починки инстансов.

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

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

Вот именно на этот вектор нам и нужно будет сдвинуть все инстансы.

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

А перед возвратом в режим редактирования, сделаем корректирующие смещения для всех полученных ранее инстансов.

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

Нам осталось вернуться в режим редактирования и переместить курсор в исходное положение в сцене.

Если мы выполним наш скрипт теперь, с учетом доработок, все инстансы объекта останутся на своих исходных местах.

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

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