Создание управляющих элементов для визуального управления длиной таймлайна в Blender

В общем представлении гизмо – это такие стрелочки и кружочки на 3D объекте, при помощи которых можно перемещать, вращать и масштабировать меш. Однако в Blender объект “гизмо” более универсален, и его можно использовать для своих нужд в разных рабочих областях. Например, можно создать гизмо для регулировки длины таймлайна.

Автор исходного кода Yann Lanthony (yann-lty).

Для начала нужно создать собственно объект гизмо. Определим для этого класс и наследуем его от bpy.types.Gizmo.

В классе определим функцию setup. Здесь мы задаем внешнюю форму нашего гизмо – прямоугольник, состоящий из двух треугольников. Указываем координаты для каждой точки гизмо так, как будто создаем меш в окне 3D вьюпорта.

Для того чтобы гизмо отрисовывалось по заданным координатам, определим функцию draw.

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

Здесь мы сначала определяем верхний левый и нижний правый углы нашего элемента, а затем проверяем, попадают ли текущие координаты мышки, переданные в параметре функции c0, внутрь этой области. Если попадают – возвращаем 0, если нет – -1.

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

Определим класс TIMELINE_GGT_Handlers, наследовав его от GizmoGroup.

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

Здесь мы создали два элемента контроля: левый – для начала таймлайна, и правый – для его конца. Для каждого из них мы задаем цвет,  прозрачность, подсветку при наведении курсора, возможность отрисовываться модально и трансформироваться вместе с UI Blender.

Также мы назначили на каждый элемент управляющий оператор с idname ‘scene.range_adjust’. Этот оператор будет отвечать собственно за функционирование контроллера.

Для того чтобы различать левый и правый элементы контроля при управлении оператором, мы добавили левому свойство ‘START’, а правому свойство ‘END’.

Теперь определим функцию draw_prepare, которая будет отвечать за отрисовку наших элементов контроля на рабочей области таймлайна.

Здесь мы определяем фактическое положение границ начала таймлайна и конца таймлайна в экранных координатах. Корректируем размеры наших управляющих элементов так, чтобы они соответствовали общему масштабу интерфейса Blender, а также задаем им общие размеры 10 x 35. И применяем полученные координаты к левому и правому элементам.

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

Зададим для оператора два входных параметра: mode и offset. Mode необходим для понимания, какой из контроллеров сейчас обрабатывается, левый или правый, а offset указывает величину текущего смещения контрольного элемента пользователем.

Определим стандартные для оператора функции: invoke, execute, modal, cancel.

В функции invoke мы определяем начало работы оператора.

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

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

Здесь мы обрабатываем три события: “отмена” – если пользователь отменяет свое действие, нажатием правой кнопки мышки или клавиши ESC, “завершение” – пользователь кликнул левой кнопкой мышки, и “обновление” – вызывается каждый раз, когда пользователь двигает гизмо-контроллер.

При “отмене” мы возвращаем значения таймлайна в исходное состояние.

При “обновлении” мы обновляем текущее положение курсора и пересчитываем смещение контрольного элемента.

При “завершении” мы запоминаем текущее смещение контрольного элемента от его исходного положения.

Функция execute отрабатывает после возникновения события “завершение”.

Здесь мы фиксируем новые значения для таймлайна. Если двигался левый контрольный элемент (‘START’) – для его начала, и если правый (‘END’) – для его конца.

Нам осталось зарегистрировать все определенные нами классы в функции register и выполнить код.

После запуска кода в рабочей области TimeLine появляются два дополнительных прямоугольника. Это и есть наши контрольные гизмо-элементы. Если зажать любой из них и подвигать мышкой, начальная или конечная точка таймлайна будет наглядно изменяться.

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

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии