Настраивать положение камеры в Blender обычным способом не всегда удобно, особенно в больших открытых сценах. На этот случай в Blender предусмотрена возможность переключения камеры в режим “ходьбы” или “полета”. В этих режимах мы можем управлять камерой так, как будто играем в видеоигру от первого лица. Камера перемещается стрелками или привычным нам по компьютерным играм набором клавиш WASD.
Переключить текущую камеру в режим “ходьбы” можно включив вид из камеры (клавиша 0 Ins на цифровой части клавиатуры) и выбрав в меню 3D вьюпорта “View – Navigation – Walk Navigation”. Для выхода из режима ходьбы нужно нажать клавишу Esc или кликнуть правой кнопкой мышки.
Для включения режима “полета” все работает точно так же, только в меню 3D вьюпорта выбираем “View – Navigation – Fly Navigation”.
На самом деле эти два режима ничем принципиально не отличаются, просто в режиме полета камера двигается с ускорением, что делает этот режим более удобным для огромных ландшафтных сцен, где нужно быстро перемещаться по сцене на большие расстояния.
Переключать камеру в режимы ходьбы и полета мы можем так же и с помощью Blender Python API.
Оба эти режима реализованы в виде модальных операторов, которые мы можем легко вызывать в своем коде.
Оператор переключения в режим ходьбы:
|
1 |
bpy.ops.view3d.walk() |
И в режим полета:
|
1 |
bpy.ops.view3d.fly() |
Оба эти оператора контекстно-зависимые. Это значит что они могут вызываться напрямую из контекста окна 3D вьюпорта, но если нам нужно вызвать их из другого окна, например, кодом в текстовом редакторе Text Edit, требуется переопределение контекста.
Для обоих этих операторов переопределять в контексте нужно не только рабочую область “area” но и регион этой рабочей области “region”.
Давайте переключимся в режим ходьбы кодом, выполняемым в текстовом редакторе Blender.
Определим рабочую область 3D вьюпорта:
|
1 2 3 |
area = next((area for area in bpy.context.screen.areas if area.type == 'VIEW_3D')) # <bpy_struct, Area at 0x000001E2533E8F20> |
И нужный регион внутри нее:
|
1 2 3 |
region = next((region for region in area.regions if region.type == 'WINDOW')) # <bpy_struct, Region at 0x000001E23A659AA0> |
Теперь стандартным образом через временное переопределение контекста вызовем оператор включающий режим ходьбы для текущей камеры.
|
1 2 |
with bpy.context.temp_override(area=area, region=region): bpy.ops.view3d.walk('INVOKE_DEFAULT') |
Камера в окне 3D вьюпорта переключится в нужный нам режим.
Обратите внимание, если переключиться в режимы ходьбы или полета не в просмотре сцены “вид из камеры”, в нужный нам режим управления переключится все окно 3D вьюпорта целиком, и весь 3D вьюпорт будет управляться стрелками/клавишами WASD.

.blend file on Patreon