Графика камеры основана на группе свойств осей, которые управляют положением и ориентацией камеры. В целом, камера командует, например campos
, camtarget
, и camup
, сделать ненужным прямой доступ к этим свойствам.
Свойство | Описание |
---|---|
CameraPosition | Расположение точки обзора в единицах измерения осей. |
CameraPositionMode | В |
CameraTarget | Задает положение в осях, на которые указывает камера. Вместе с |
CameraTargetMode | В |
CameraUpVector | Вращение камеры вокруг оси наблюдения определяется вектором, указывающим направление, взятое вверх. |
CameraUpVectorMode | В |
CameraViewAngle | Задает поле зрения «объектива». Если задано значение для CameraViewAngle, MATLAB не растягивает - оси, соответствующие рисунку. |
CameraViewAngleMode | В Настройка |
Projection | Выбор ортогональной или перспективной проекции. |
Когда для всех свойств режима камеры задано значение auto
(по умолчанию), MATLAB автоматически управляет видом, выбирая соответствующие значения на основе предположения, что сцена должна заполнить прямоугольник положения (который определяется компонентами ширины и высоты осей Position
свойство).
По умолчанию MATLAB
Устанавливает CameraPosition
поэтому ориентация сцены является стандартным 2-D MATLAB или 3-D видом (см. view
команда)
Устанавливает 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
является auto
MATLAB вычисляет 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)
Рисование сферы с этой ориентацией создает