Документация Engee

Камеры

Страница в процессе перевода.

Camera — это просто область просмотра, через которую визуализируется сцена. Makie предлагает двух- и трехмерные проекции, а двухмерные графики можно проецировать в трех измерениях.

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

Они изменяют камеру сцены на указанный тип.

Пиксельная камера

Пиксельная камера (campixel!) проецирует сцену в пиксельном пространстве, то есть каждый целочисленный шаг в отображаемых данных будет соответствовать одному пикселю. Для этой камеры нет элементов управления. Пределы отсечения установлены равными (-10_000, 10_000).

Относительная камера

Относительная камера (cam_relative!) проецирует сцену в пространство 0..1 на 0..1. Для этой камеры нет элементов управления. Пределы отсечения установлены равными (-10_000, 10_000).

Двухмерная камера

Двухмерная камера (cam2d!) использует ортогональную проекцию с фиксированным поворотом и соотношением сторон. С помощью именованных аргументов в cam2d! или путем обращения к структуре камеры cam = cameracontrols(scene) можно задать следующие атрибуты.

  • zoomspeed = 0.10f0 задает скорость масштабирования с помощью мыши.

  • zoombutton = nothing задает дополнительную клавишу, которую необходимо нажать для масштабирования. По умолчанию клавиша не задана.

  • panbutton = Mouse.right задает кнопку мыши, которую необходимо нажать для перемещения представления.

  • selectionbutton = (Keyboard.space, Mouse.left) задает набор кнопок, которые необходимо нажать для масштабирования прямоугольника.

Обратите внимание, что эта камера не используется объектом Axis. Она используется по умолчанию для двухмерных объектов LScene и Scene.

Трехмерная камера

Camera3D(scene[; kwargs...])

Создает трехмерную камеру с управлением с помощью мыши и клавиатуры.

Поведение камеры можно настроить с помощью именованных аргументов или полей settings и controls.

Параметры

Параметры включают в себя все, кроме кнопок мыши или клавиатуры.

  • projectiontype = Perspective задает тип проекции. Возможные значения: Orthographic или Perspective.

  • rotation_center = :lookat устанавливает центр по умолчанию для поворота камеры. В настоящее время может иметь значение :lookat или :eyeposition.

  • fixed_axis = true: при значении true панорамирование производится по оси z (мировые координаты/график) вместо направления камеры вверх.

  • zoom_shift_lookat = true: при значении true данные под курсором сохраняются при масштабировании.

  • cad = false: при значении true изображение поворачивается вокруг lookat при масштабировании вне центра.

  • clipping_mode = :adaptive: управляет обработкой near и far. Возможные значения:

    • :static — near и far передаются как есть.

    • :adaptive — near масштабируется на norm(eyeposition - lookat), а far передается как есть.

    • :view_relative — near и far масштабируются на norm(eyeposition - lookat).

    • :bbox_relative — near и far масштабируются до ограничивающего прямоугольника сцены, переданного камере посредством update_cam!(..., bbox). (В частности, far = 1 масштабируется до самой дальней точки ограничивающей сферы, а near обычно перезаписывается в качестве ближайшей точки.)

  • center = true: определяет то, будет ли сбрасываться расположение камеры при вызове center!(scene), который выполняется при добавлении нового графика.

  • keyboard_rotationspeed = 1.0 задает скорость поворота с помощью клавиатуры.

  • keyboard_translationspeed = 0.5 задает скорость перемещения с помощью клавиатуры.

  • keyboard_zoomspeed = 1.0 задает скорость масштабирования с помощью клавиатуры.

  • mouse_rotationspeed = 1.0 задает скорость поворота с помощью мыши.

  • mouse_translationspeed = 0.5 задает скорость перемещения с помощью мыши.

  • mouse_zoomspeed = 1.0 задает скорость масштабирования с помощью колеса мыши.

  • circular_rotation = (false, false, false) обеспечивает циклический поворот по оси вращения (фиксированное значение x, фиксированное значение y, фиксированное значение z). (Это означает, что рисование круга мышью вокруг центра сцены приведет к непрерывному вращению.)

Элементы управления

Элементы управления включают в себя все настроенные клавиши быстрого вызова.

  • up_key = Keyboard.r задает клавишу для перемещения к верхнему краю экрана.

  • down_key = Keyboard.f задает клавишу для перемещения к нижнему краю экрана.

  • left_key = Keyboard.a задает клавишу для перемещения к левому краю экрана.

  • right_key = Keyboard.d задает клавишу для перемещения к правому краю экрана.

  • forward_key = Keyboard.w задает клавишу для перемещения вдаль.

  • backward_key = Keyboard.s задает клавишу для перемещения в направлении приближения.

  • zoom_in_key = Keyboard.u задает клавишу для увеличения масштаба сцены (позиция наблюдателя перемещается к lookat).

  • zoom_out_key = Keyboard.o задает клавишу для уменьшения масштаба сцены (позиция наблюдателя перемещается в направлении от lookat).

  • increase_fov_key = Keyboard.b задает клавишу для увеличения поля обзора.

  • decrease_fov_key = Keyboard.n задает клавишу для уменьшения поля обзора.

  • pan_left_key = Keyboard.j задает клавишу для поворота вокруг вертикальной оси экрана.

  • pan_right_key = Keyboard.l задает клавишу для поворота вокруг вертикальной оси экрана.

  • tilt_up_key = Keyboard.i задает клавишу для поворота вокруг горизонтальной оси экрана.

  • tilt_down_key = Keyboard.k задает клавишу для поворота вокруг горизонтальной оси экрана.

  • roll_clockwise_key = Keyboard.e задает клавишу для поворота экрана.

  • roll_counterclockwise_key = Keyboard.q задает клавишу для поворота экрана.

  • fix_x_key = Keyboard.x задает клавишу для фиксации перемещений и вращений относительно оси x (мировые координаты / график).

  • fix_y_key = Keyboard.y задает клавишу для фиксации перемещений и вращений относительно оси y (мировые координаты / график).

  • fix_z_key = Keyboard.z задает клавишу для фиксации перемещений и вращений относительно оси z (мировые координаты / график).

  • reset = Keyboard.left_control & Mouse.left задает клавишу для сброса камеры. Эквивалентно вызову center!(scene).

  • reposition_button = Keyboard.left_alt & Mouse.left задает клавишу для фокусировки камеры на объекте графика.

  • translation_button = Mouse.right задает кнопку мыши для перемещения перетаскиванием (вверх, вниз, влево, вправо).

  • scroll_mod = true задает дополнительную кнопку-модификатор для масштабирования прокруткой (true — нейтральное значение).

  • rotation_button = Mouse.left задает кнопку мыши для поворота перетаскиванием (панорамирование, наклон).

Другие именованные аргументы

Некоторые именованные аргументы используются для инициализации полей. К ним относятся следующие:

  • eyeposition = Vec3d(3): положение камеры.

  • lookat = Vec3d(0): точка, на которой сфокусирована камера.

  • upvector = Vec3d(0, 0, 1): направление мировой системы координат, соответствующее направлению вверх на экране.

  • fov = 45.0 — поле обзора. Не имеет значения, если камера использует ортогональную проекцию.

  • near = automatic задает положение ближней плоскости отсечения. Все, что находится между камерой и ближней плоскостью отсечения, скрыто. Значение должно быть больше 0. Использование зависит от clipping_mode.

  • far = automatic задает положение дальней плоскости отсечения. Все, что находится дальше дальней плоскости отсечения, скрыто. Использование зависит от clipping_mode. По умолчанию 1 для clipping_mode = :bbox_relative, 2 для :view_relative или значение, выведенное из пределов для :static.

Обратите внимание, что для обновления этих наблюдаемых объектов в активной камере требуется вызвать update_cam(scene). Для обновления eyeposition, lookat и (или) upvector лучше вызвать update_cam!(scene, eyeposition, lookat, upvector = Vec3d(0,0,1)).

Положение и ориентацию камеры также можно настраивать с помощью функций.

  • translate_cam!(scene, v) перемещает камеру на заданный вектор v в пространстве мировых координат / графика.

  • rotate_cam!(scene, angles) поворачивает камеру вокруг ее осей на соответствующие углы. Первый угол — это угол поворота вокруг «правой» оси камеры, то есть горизонтальной оси экрана, второй — вокруг вектора вверх/вертикальной оси или Vec3d(0, 0, +-1), если fixed_axis = true, а третий — вокруг направления взгляда, то есть оси наружу от экрана. При повороте учитывается текущее значение rotation_center камеры.

  • zoom!(scene, zoom_step) изменяет уровень масштабирования сцены без ее перемещения или поворота. zoom_step применяется мультипликативно к значению cam.zoom_mult, которое используется как множитель поля обзора (перспективная проекция) или ширины и высоты (ортогональная проекция).

cam3d! и cam3d_cad! создают Camera3D с определенными параметрами.

Пример: визуализация области просмотра камер

using GeometryBasics, LinearAlgebra

function frustum_snapshot(cam)
    r = Rect3f(Point3f(-1, -1, -1), Vec3f(2, 2, 2))
    rect_ps = coordinates(r) .|> Point3f
    insert!(rect_ps, 13, Point3f(1, -1, 1)) # исправляем неправильную линию

    inv_pv = inv(cam.projectionview[])
    return map(rect_ps) do p
        p = inv_pv * to_ndim(Point4f, p, 1)
        return p[Vec(1,2,3)] / p[4]
    end
end


ex = Point3f(1,0,0)
ey = Point3f(0,1,0)
ez = Point3f(0,0,1)

fig = Figure()
scene = LScene(fig[1, 1])
cc = Makie.Camera3D(scene.scene, projectiontype = Makie.Perspective)

linesegments!(scene, Rect3f(Point3f(-1), Vec3f(2)), color = :black)
linesegments!(scene,
    [-ex, ex, -ey, ey, -ez, ez],
    color = [:red, :red, :green, :green, :blue, :blue]
)
center!(scene.scene)

cam = scene.scene.camera
eyeposition = cc.eyeposition
lookat = cc.lookat
frustum = map(pv -> frustum_snapshot(cam), cam.projectionview)

scene = LScene(fig[1, 2])
_cc = Makie.Camera3D(scene.scene, projectiontype = Makie.Orthographic)
lines!(scene, frustum, color = :blue, linestyle = :dot)
scatter!(scene, eyeposition, color = :black)
scatter!(scene, lookat, color = :black)

linesegments!(scene,
    [-ex, ex, -ey, ey, -ez, ez],
    color = [:red, :red, :green, :green, :blue, :blue]
)
linesegments!(scene, Rect3f(Point3f(-1), Vec3f(2)), color = :black)

fig

Общие замечания

Чтобы принудительно визуализировать график как трехмерный, можно задать пределы с ненулевым интервалом по оси z или использовать трехмерный тип камеры. Например, можно передать именованный аргумент limits = Rect([0,0,0],[1,1,1]) или camera = cam3d!.

Часто при изменении сцены камера может рассинхронизироваться с ней. Чтобы исправить это, можно вызвать функцию update_cam! для сцены.

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