Когда мы настраиваем освещение в сцене в Blender, обычно мы устанавливаем направление источника света в нужную точку вручную для каждого источника. Однако этот процесс можно упростить и указать точку, в которую будут направлены все выделенные источники освещения в сцене сразу.
Сделать это очень просто.
Выделим несколько источников света. Обратите внимание – один из них обязательно должен быть активным объектом сцены. Теперь нажмем Shift+ t на клавиатуре и подвигаем мышкой.
При движении курсора мышки все выделенные источники освещения теперь “следят” за курсором. После клика левой кнопкой мышки все они останутся направленными в точку клика.
Этот функционал обеспечивается выполнением оператора transform_axis_target(). Мы можем выполнить его также и при помощи Blender Python API.
Так как этот оператор привязан к контексту 3D вьюпорта, вызов оператора нужно переопределить через temp_override().
Для начала получим указатели на рабочую область 3D вьюпорта и ее регион.
1 2 |
area = [area for area in bpy.context.screen.areas if area.type == "VIEW_3D"][0] region = area.regions[-1] |
Теперь мы можем вызвать временное переопределение контекста, передав в параметрах полученные значения,
1 |
with bpy.context.temp_override(area=area, region=region): |
и вызвать нужный нам оператор.
1 |
bpy.ops.object.transform_axis_target("INVOKE_REGION_WIN") |
Обратите внимание, что в параметрах оператора необходимо передать значение “INVOKE_REGION_WIN”, иначе оператор завершится с ошибкой.
Заодно мы можем избавиться от необходимости обязательно назначать один из выделенных источников освещения активным объектом. Так как мы уже используем temp_override, мы можем переопределить внутри него и активный объект, передав указатель на него в параметрах.
Итоговый код будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 |
area = [area for area in bpy.context.screen.areas if area.type == "VIEW_3D"][0] region = area.regions[-1] with bpy.context.temp_override( area=area, region=region, active_object=bpy.context.selected_objects[0] ): bpy.ops.object.transform_axis_target("INVOKE_REGION_WIN") |
Вызвав его, мы можем указывать точку направления для источников освещения мышкой в рабочей области 3D вьюпорта.