Камера

Режимы управления и общие настройки

Настройки камеры выставляются в панели Properties на вкладке Camera (Object Data).

_images/camera_setup.png

Camera Move Style > Move Style

Режим управления камерой:

  • Target

    По умолчанию камера находится в режиме вращения вокруг некоторой точки (target). Положение точки вращения может быть изменено (см. панорамирование).

  • Eye

    Режим взгляда позволяет осуществлять вращение и перемещение от первого лица.

  • Hover

    В режиме нависания камера движется параллельно горизонтальной опорной плоскости. Дополнительными лимитами можно задать плавную траекторию движения камеры по направлению к опорной точке.

  • Static

    В статическом режиме изменение положения камеры осуществляется посредством анимации или через API.

Look At Cursor > Target Location

Доступно в режиме Target. Позиция точки, относительно которой будет вращаться камера. Кнопка Look At Cursor позволяет скопировать текущее положение курсора, а при нажатии на неё активная камера поворачивается в направлении указанной точки.

Depth of Field

Описано в разделе Глубина резкости камеры.

Для камеры доступны настройки скорости движения:

Camera Move Style > Camera Velocities > Translation Velocity

Актуально для режимов Target, Eye, Hover. Задаёт скорость перемещения камеры. Интервал значений: \(\left[0,\ \infty \right)\). Значение по умолчанию: 1.

Camera Move Style > Camera Velocities > Rotation Velocity

Актуально для режимов Target, Eye, Hover. Задаёт скорость вращения камеры. Интервал значений: \(\left[0,\ \infty \right)\). Значение по умолчанию: 1.

Camera Move Style > Camera Velocities > Zoom Velocity

Актуально для режимов Target, Hover. Задаёт скорость приближения камеры к опорной точке. Интервал значений: \(\left[0,\ 0.99\right]\). Значение по умолчанию: 0.1.

Ограничения движения камеры

Для камеры доступно несколько настроек, ограничивающих/изменяющих её движение тем или иным образом. Они объединены в группу Camera Limits.

_images/camera_limits.png

Ограничители перемещения камеры могут отображаться непосредственно во вьюпорте Blender. Для этого нужно включить опцию Display Limits in Viewport.


Камера типа Target

_images/camera_limits_target.png
Camera Move Style > Camera Limits > Distance Limits

Задание минимального и максимального расстояний от камеры до точки вращения. Допустимые значения: Min \(\le\) Max. Значения по умолчанию: Min = 1, Max = 10. По умолчанию отключено.

Camera Move Style > Camera Limits > Horizontal Rotation Limits

Ограничение горизонтального (вокруг мировой оси Z в Blender’е) вращения камеры относительно соответствующей точки. Вращение происходит по дуге окружности определяемой значениями Left Angle и Right Angle. Дуга вращения соответствует движению из Left Angle в Right Angle против часовой стрелки. Значения по умолчанию: Left Angle = -45°, Right Angle = 45°. По умолчанию отключено.

Camera Move Style > Camera Limits > Vertical Rotation Limits

Ограничение горизонтального (вокруг мировой оси Z в Blender’е) вращения камеры относительно соответствующей точки. Вращение происходит по дуге окружности определяемой значениями Left Angle и Right Angle. Дуга вращения соответствует движению из Left Angle в Right Angle против часовой стрелки. Значения по умолчанию: Left Angle = -45°, Right Angle = 45°. По умолчанию отключено.

Camera Move Style > Camera Limits > Pivot Translation Limits

Ограничение перемещения точки привязки камеры. Значения по умолчанию: MinZ = 0, MaxZ = 10. Не отображается во вьюпорте.

Camera Move Style > Camera Limits > Use Panning Mode

Разрешить панорамное перемещение камеры.


Камера типа Eye

_images/camera_limits_eye.png
Blend4Web > Horizontal Rotation Limits

Ограничение горизонтального (вокруг мировой оси Z в Blender’е) вращения камеры относительно соответствующей точки. Вращение происходит по дуге окружности определяемой значениями Left Angle и Right Angle. Дуга вращения соответствует движению из Left Angle в Right Angle против часовой стрелки. Значения по умолчанию: Left Angle = -45°, Right Angle = 45°. По умолчанию отключено.

Camera Move Style > Camera Limits > Vertical Rotation Limits

Ограничение горизонтального (вокруг мировой оси Z в Blender’е) вращения камеры относительно соответствующей точки. Вращение происходит по дуге окружности определяемой значениями Left Angle и Right Angle. Дуга вращения соответствует движению из Left Angle в Right Angle против часовой стрелки. Значения по умолчанию: Left Angle = -45°, Right Angle = 45°. По умолчанию отключено.


Камера типа Hover

_images/camera_limits_hover.png
Camera Move Style > Camera Limits > Horizontal Translation Limits

Ограничение перемещения опорной точки вдоль оси X в мировых координатах в Blender’е. Допустимые значения: Min \(\le\) Max. Значения по умолчанию: MinX = -10, MaxX = 10. По умолчанию отключено.

Camera Move Style > Camera Limits > Vertical Translation Limits

Ограничение перемещения опорной точки вдоль оси Y в мировых координатах в Blender’е. Допустимые значения: Min \(\le\) Max. Значения по умолчанию: MinY = -10, MaxY = 10. По умолчанию отключено.

Camera Move Style > Camera Limits > Use Zooming

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

Camera Move Style > Camera Limits > Distance Limits

Задание минимального и максимального расстояний от камеры до точки пересечения (опорная точка) направления взгляда камеры с горизонтальной опорной плоскостью (по умолчанию с плоскостью XOY мировых координат в Blender’е). Допустимые значения: Min \(\le\) Max. Значения по умолчанию: Min = 1, Max = 10. По умолчанию отключено.

Camera Move Style > Camera Limits > Vertical Rotation Limits

Ограничения угла подъема камеры (угла между направлением взгляда камеры и горизонтальной плоскостью). Допустимые значения: \(\le\) Down \(\le\) Up \(\le\) 90°. Значения по умолчанию: Down = 0°, Up = 90°.

Camera Move Style > Camera Limits > Zero Level

Расстояние от опорной плоскости камеры до центра координат. По умолчанию равно нулю.

При включении настройки Blend4Web > Use Zooming лимиты по расстоянию и углу подъема будут действовать одновременно, задавая траекторию движения камеры в вертикальной плоскости.

Некорректное задание лимитов по расстоянию либо углу подъема приведет к отключению этой настройки.

Camera Move Style > Camera Limits > Use Horizontal Rotation

Разрешить вращение камеры в плоскости XOY Blender’а относительно опорной точки. По умолчанию включено.


Камера типа Static

_images/camera_limits_static.png

Камера этого типа не имеет ограничителей, так как не контролируется пользователем.


Особенности задания ограничений

  • Для EYE/TARGET камеры перемена мест значений Left/Right или Down/Up приводит к движению по противоположной дуге окружности вращения.

  • При ограничении горизонтального и вертикального вращения камеры можно выбрать пространство координат:

Camera Space

Все углы отсчитываются относительно начального положения и ориентации камеры.

World Space

Горизонтальные углы отсчитываются относительно направления оси Y в пространстве мировых координат, вертикальные - относительно плоскости XOY в мировом пространстве в Blender’е.

Значение по умолчанию: Camera Space.

Ограничения по горизонтали на примере TARGET камеры:

Ограничения по вертикали на примере TARGET камеры:

Привязка к камере

Если родителем объекта является камера, для него доступен набор параметров, известный как Viewport Alignment. Эти параметры находятся во вкладке Relations на панели Object.

_images/objects_viewport_alignment.png

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

_images/camera_viewport_alignment_example.png

Пример использования возможностей Viewport Alignment.

Viewport Alignment

Этот параметр включает и выключает использование всех нижеперечисленных параметров. По умолчанию деактивирован.

Alignment

Этот параметр определяет, к какой точке экрана будет привязан объект. Может иметь одно из следующих значений:

  • Top-Left - привязывает объект к левому верхнему углу экрана

  • Top - привязывает объект к верхней границе экрана

  • Top-Right - привязывает объект к правому верхнему углу экрана

  • Left - привязывает объект к левой стороне экрана

  • Center - привязывает объект к центру экрана

  • Right - привязывает объект к правой стороне экрана

  • Bottom-Left - привязывает объект к левому нижнему углу экрана

  • Bottom - привязывает объект к нижней границе экрана

  • Bottom-Right - привязывает объект к правому нижнему углу экрана

Значение по умолчанию: Center.

Distance

Расстояние между камерой и объектом, привязанным к ней. По умолчанию равно 10.

Fit to Camera

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

Управление через API

Подробная документация API модуля: ссылка.

A camera’s position and its spatial orientation are defined by the control mode. In the EYE, TARGET and HOVER modes, control mode has several limitations: for example, the camera’s vertical axis is always aligned along the world’s Z-axis and the camera is constantly focused on the pivot point. The STATIC mode camera has no such limitations, which makes it more suitable for cases when you need more complete control, such as procedural animation.

Основные функции управления камерой находятся в модуле camera. Часть из них, относящаяся к конкретному режиму управления, начинается с соответствующих префиксов: static_, eye_, target_ и hover_. Остальные методы применимы для всех режимов.

Задание режима управления

Для изменения режима и полного определения модели поведения камеры можно воспользоваться следующими методами: static_setup(), eye_setup(), target_setup() и hover_setup(). Они принимают объект, содержащий набор опциональных параметров, позволяющих задать положение камеры, поворот, наличие лимитов и т.д:

var camera = m_scenes.get_active_camera();
var POS = new Float32Array([1,1,1]);
var LOOK_AT = new Float32Array([0,0,0]);
var EYE_HORIZ_LIMITS = { left: Math.PI/4, right: -Math.PI/4 };
var EYE_VERT_LIMITS = { down: -Math.PI/4, up: Math.PI/4 };
var TARGET_DIST_LIMITS = { min: 1, max: 10 };
var HOVER_DIST_LIMITS = { min: 1, max: 10 };
var HOVER_ANGLE_LIMITS = { down: 0, up: -Math.PI/4 };
var HOVER_HORIZ_TRANS_LIMITS = { min: -5, max: 3 };
var HOVER_VERT_TRANS_LIMITS = { min: -1, max: 1 };

...

// setup STATIC camera by defining the new position and the new look-at point
m_cam.static_setup(camera, { pos: POS, look_at: LOOK_AT });

// setup STATIC camera by defining the new look-at point and keeping the existing position
m_cam.static_setup(camera, { look_at: LOOK_AT });

// setup STATIC camera by defining the new position and keeping the existing orientation
m_cam.static_setup(camera, { pos: POS });

// setup EYE camera with horizontal rotation limits
m_cam.eye_setup(camera, { pos: POS, look_at: LOOK_AT,
        horiz_rot_lim: EYE_HORIZ_LIMITS });

// setup EYE camera with vertical rotation limits
m_cam.eye_setup(camera, { pos: POS, look_at: LOOK_AT,
        vert_rot_lim: EYE_VERT_LIMITS });

// setup TARGET camera with distance limits and panning mode
m_cam.target_setup(camera, { pos: POS, pivot: LOOK_AT,
        dist_lim: TARGET_DIST_LIMITS, use_panning: true });

// setup HOVER camera on a fixed distance (without zooming) reltively to its pivot
m_cam.hover_setup(camera, { pos: POS, pivot: LOOK_AT });

// setup HOVER camera with zooming (distance + angle limits)
m_cam.hover_setup(camera, { pos: POS, pivot: LOOK_AT,
        dist_lim: HOVER_DIST_LIMITS, hover_angle_lim: HOVER_ANGLE_LIMITS });

// setup HOVER camera with translation limits
m_cam.hover_setup(camera, { pos: POS, pivot: LOOK_AT,
        horiz_trans_lim: HOVER_HORIZ_TRANS_LIMITS,
        vert_trans_lim: HOVER_VERT_TRANS_LIMITS });

// setup HOVER camera with horizontal rotation enabled
m_cam.hover_setup(camera, { pos: POS, pivot: LOOK_AT, enable_horiz_rot: true });

Особенность камеры типа HOVER заключается в том, что лимиты, ограничивающие расстояние и угол подъёма, задают определённую траекторию движения по направлению к опорной точке. Камера всегда будет находиться на данной траектории, поэтому её итоговая позиция может отличаться от той, что была передана в методе hover_setup() (по сути происходит её проекция на траекторию). Если необходимо, чтобы заданное положение камеры сразу находилось на некой траектории, то можно воспользоваться методом hover_setup_rel() для относительного задания лимитов.

var camera = m_scenes.get_active_camera();
var POS = new Float32Array([1,1,1]);
var PIVOT = new Float32Array([0,0,0]);

...

// setup HOVER camera with maintaining the given camera position and
// ability to zoom-in and zoom-out equally
m_cam.hover_setup_rel(camera, { pos: POS, pivot: PIVOT, dist_interval: 2,
        angle_interval: Math.PI/4 });

Проверить текущий режим камеры можно, используя методы is_static_camera(), is_eye_camera(), is_target_camera(), is_hover_camera() или get_move_style():

var camera = m_scenes.get_active_camera();

...

if (m_cam.is_static_camera(camera))
    console.log("STATIC camera!");

if (m_cam.get_move_style(camera) == m_cam.MS_EYE_CONTROLS)
    console.log("EYE camera!");

Примечание

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

Перемещение и поворот

Для поворота STATIC камеры следует использовать методы static_get_rotation() и static_set_rotation() - в них поворот описывается кватернионом:

var camera = m_scenes.get_active_camera();

...

// rotation through a quaternion
var _quat_tmp = new Float32Array(4);
var old_quat = m_cam.static_get_rotation(camera, _quat_tmp);
var new_quat = m_quat.rotateX(old_quat, Math.PI/2, old_quat)
m_cam.static_set_rotation(camera, new_quat);

Для EYE, TARGET и HOVER поворот осуществляется в сферических координатах с использованием методов eye_rotate(), target_rotate(), hover_rotate() и rotate_camera():

var camera = m_scenes.get_active_camera();

...

// rotate by given delta angles
m_cam.eye_rotate(camera, Math.PI/6, Math.PI/2);

// set absolute rotation in world space
m_cam.eye_rotate(camera, Math.PI/6, Math.PI/2, true, true);

Текущие сферические координаты камеры можно получить, используя метод get_camera_angles():

var camera = m_scenes.get_active_camera();
var _vec2_tmp = new Float32Array(2);

...

// get camera orientation in spherical coordinates
var angles = m_cam.get_camera_angles(camera, _vec2_tmp);
phi = angles[0];
theta = angles[1];

Доступ к позиции камеры предоставляют методы get_translation() и set_translation(). При этом для режимов TARGET и HOVER перемещение означает параллельный перенос всей модели, включающей позицию камеры и опорную точку.

var camera = m_scenes.get_active_camera();
var _vec3_tmp = new Float32Array(3);

...

// get camera position
var pos = m_cam.get_translation(camera, _vec3_tmp);

// set new position
var new_pos = m_vec3.set(1, 0, 2, pos);
m_cam.set_translation(camera, new_pos);

Дополнительные методы для перемещения камеры:

Примечание

Т.к. камера является объектом сцены, то при необходимости можно использовать и методы модуля transform. Однако, результат может не всегда соответствовать ожиданиям из-за вмешательства модели поведения камеры в каждом конкретном режиме.

Задание лимитов

Лимиты камеры присутствуют в режимах EYE, TARGET и HOVER. Для назначения конкретного лимита следует воспользоваться соответствующим методом:

EYE TARGET HOVER
eye_get_horizontal_limits() eye_set_horizontal_limits() eye_get_vertical_limits() eye_set_vertical_limits() target_get_distance_limits() target_set_distance_limits() target_get_horizontal_limits() target_set_horizontal_limits() target_get_vertical_limits() target_set_vertical_limits() target_get_pivot_limits target_set_pivot_limits hover_get_distance_limits() hover_set_distance_limits() hover_get_vertical_limits() hover_set_vertical_limits() hover_get_horiz_trans_limits() hover_set_horiz_trans_limits() hover_get_vert_trans_limits() hover_set_vert_trans_limits()
var camera = m_scenes.get_active_camera();
var _limits_tmp = {};
var EYE_HORIZ_LIMITS = { left: Math.PI/4, right: -Math.PI/4 };

...

// get limits
m_cam.eye_get_horizontal_limits(camera, _limits_tmp);

// set limits
m_cam.eye_set_horizontal_limits(camera, EYE_HORIZ_LIMITS);

Наличие лимитов можно проверить методами has_distance_limits(), has_horizontal_rot_limits(), has_vertical_rot_limits(), has_horizontal_trans_limits() и has_vertical_trans_limits().

Примечание

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

Примечание

Присутствующие на камере лимиты могут влиять на её позицию и ориентацию, выставляемые через API.

Отсчет угловых координат

При работе с камерой через API (вращение, выставление ограничений) отсчет угловых координат ведется следующим образом:

Для типов TARGET/HOVER:

Для типа EYE: