Низкоуровневые свойства камеры

Свойства камеры, которые можно задать

Графика камеры основана на группе свойств осей, которые управляют положением и ориентацией камеры. В целом, камера командует, например campos, camtarget, и camup, сделать ненужным прямой доступ к этим свойствам.

Свойство

Описание

CameraPosition

Расположение точки обзора в единицах измерения осей.

CameraPositionMode

В automatic режим, сцена определяет положение. В manual задается положение точки обзора.

CameraTarget

Задает положение в осях, на которые указывает камера. Вместе с CameraPosition, он определяет ось обзора.

CameraTargetMode

В automatic mode, MATLAB® задает CameraTarget как центр графика осей. В manual mode, вы задаете местоположение.

CameraUpVector

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

CameraUpVectorMode

В automatic mode, MATLAB ориентирует вектор вверх вдоль положительной оси Y для 2-D видов и вдоль положительной оси Z для 3-D видов. В manual mode, вы задаете направление.

CameraViewAngle

Задает поле зрения «объектива». Если задано значение для CameraViewAngle, MATLAB не растягивает - оси, соответствующие рисунку.

CameraViewAngleMode

В automatic MATLAB настраивает угол обзора на наименьший угол, который захватывает всю сцену. В manual mode, вы задаете угол.

Настройка CameraViewAngleMode на manual переопределяет поведение «растягивание к заливке».

Projection

Выбор ортогональной или перспективной проекции.

Выбор точки обзора по умолчанию

Когда для всех свойств режима камеры задано значение auto (по умолчанию), MATLAB автоматически управляет видом, выбирая соответствующие значения на основе предположения, что сцена должна заполнить прямоугольник положения (который определяется компонентами ширины и высоты осей Position свойство).

По умолчанию MATLAB

  • Устанавливает CameraPosition поэтому ориентация сцены является стандартным 2-D MATLAB или 3-D видом (см. view команда)

  • Устанавливает CameraTarget в центр графика графика

  • Устанавливает CameraUpVector поэтому направление y для 2-D видов и направление z для 3-D видов

  • Устанавливает CameraViewAngle к минимальному углу, который заставляет сцену заполнять прямоугольник положения (прямоугольник, заданный осями Position свойство)

  • Использует ортогональную проекцию

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

Движение внутрь и наружу по сцене

Можно переместить камеру в любое место в трехмерном пространстве, заданном осями. Камера продолжает указывать на цель независимо от ее положения. Когда камера перемещается, MATLAB изменяет угол поля зрения камеры, чтобы убедиться, что сцена заполняет прямоугольник положения.

Перемещение по сцене

Вы можете создать эффект fly-by, перемещая камеру через сцену. Для этого постоянно меняйте CameraPosition свойство, перемещая его к цели. Поскольку камера движется через пространство, она поворачивается, когда перемещается мимо целевой объект камеры. Переопределите автоматическое изменение размера сцены MATLAB каждый раз, когда вы перемещаете камеру, установив CameraViewAngleMode на manual.

Если вы обновляете CameraPosition и CameraTarget, эффект должен проходить через сцену, постоянно обращаясь к направлению движения.

Если на Projection установлено в perspectiveколичество перспективных искажений увеличивается, когда камера приближается к цели и уменьшается, когда она удаляется дальше.

Пример - Движение к цели или от нее

Чтобы переместить камеру вдоль оси просмотра, необходимо вычислить новые координаты для CameraPosition свойство. Это достигается путем вычитания (чтобы приблизиться к цели) или добавления (чтобы отойти от цели) некоторой части общего расстояния между положением камеры и целевым объектом камеры.

Функция movecamera вычисляет новую CameraPosition который перемещается по сцене, если аргумент dist положительно и выходит, если dist отрицательно.

function movecamera(dist) %dist in the range [-1 1]
set(gca,'CameraViewAngleMode','manual')
newcp = cpos - dist * (cpos - ctarg);
set(gca,'CameraPosition',newcp)
function out = cpos
out = get(gca,'CameraPosition');
function out = ctarg
out = get(gca,'CameraTarget');

Установка CameraViewAngleMode на manual может вызвать резкое изменение соотношения сторон.

Делая сцену больше или меньше

Настройка CameraViewAngle свойство делает вид сцены больше или меньше. Большие углы заставляют вид охватывать большую площадь, что делает объекты в сцене меньше. Точно так же меньшие углы делают объекты больше.

Изменение CameraViewAngle делает сцену больше или меньше, не влияя на положение камеры. Это желательно, если вы хотите масштабировать, не перемещая точку обзора мимо объектов, которые затем больше не будут находиться в сцене (как это может произойти, если вы измените положение камеры). Кроме того, изменение CameraViewAngle не влияет на количество перспективы, применяемой к сцене, так как изменяется CameraPosition делает, когда рисунок Projection для свойства задано значение perspective.

Вращение вокруг сцены

Можно использовать view команда для поворота точки зрения вокруг оси Z путем изменения азимута и вокруг азимута путем изменения повышения. Это имеет эффект перемещения камеры вокруг сцены вдоль поверхности сферы, радиус которой является длиной оси просмотра. Можно создать тот же эффект, изменив CameraPositionно это требует от вас выполнения вычислений, которые MATLAB выполняет для вас при вызове view.

Для примера - функция orbit перемещает камеру по сцене.

function orbit(deg)
[az, el] = view;
rotvec = 0:deg/10:deg;
for i = 1:length(rotvec)
    view([az+rotvec(i) el])
    drawnow
end

Вращение без изменения размера

Когда CameraViewAngleMode является autoMATLAB вычисляет CameraViewAngle так что сцена будет такой большой, как может поместиться в прямоугольнике положения осей. Это вызывает очевидное изменение размера во время вращения сцены. Чтобы предотвратить изменение размера во время вращения, необходимо задать CameraViewAngleMode на manual (что происходит автоматически, когда вы задаете значение для CameraViewAngle свойство). Для этого в orbit function, добавить оператор

set(gca,'CameraViewAngleMode','manual')

Вращение вокруг оси просмотра

Можно изменить ориентацию сцены, задав направление вверх. По умолчанию MATLAB определяет вверх как ось Y на 2-D видах (CameraUpVector является [0 1 0]) и ось Z для 3-D видов (CameraUpVector является [0 0 1]). Однако можно задать вверх как любое произвольное направление.

Вектор, заданный как CameraUpVector свойство образует одну ось системы координат камеры. Внутренне MATLAB определяет фактическую ориентацию вектора вверх камерой, проецируя указанный вектор на плоскость, которая является нормальной к направлению камеры (т.е. оси наблюдения). Это упрощает спецификацию CameraUpVector свойство, потому что оно не должно лежать в этой плоскости.

Во многих случаях вы можете найти удобным визуализировать требуемый вектор вверх с точки зрения углов относительно осей x -, y - и z -. Затем можно использовать косинусы направления для преобразования из углов в векторные компоненты. Для вектора модуля, выражение упрощается

где углы α, β и β заданы в степенях.

XComponent = cos(α*(pi/180));

YComponent = cos(β*(pi/180));

ZComponent = cos(γ*(pi/180));

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

Вычисление вектора вверх камеры

Чтобы задать вектор вверх, который составляет угол 30 ° с осью Z и лежит в плоскости y-z, используйте выражение

upvec = [cos(90*(pi/180)),cos(60*(pi/180)),cos(30*(pi/180))];

и затем установите CameraUpVector свойство.

set(gca,'CameraUpVector',upvec)

Рисование сферы с этой ориентацией создает