Камеры
|
Страница в процессе перевода. |
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.
Трехмерная камера
#
Makie.Camera3D — Type
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, чтобы игнорировать модификатор, любую кнопку, набор кнопок или даже логические выражения из кнопок. Дополнительные сведения см. в документации по событиям.