UpVector, UpVectorX, UpVectorY, UpVectorZ, KeepUpVector

Направление камеры

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Сводные данные значения

UpVectorОбертка библиотеки для “[UpVectorX, UpVectorY, UpVectorZ]” (3D)Список 2 или 3 выражений, в зависимости от размерности
UpVectorX, UpVectorY, UpVectorZДополнительныйВыражение MuPAD®
KeepUpVectorНаследованныйFALSE или TRUE

Графические примитивы

ОбъектыЗначения по умолчанию
plot::Camera

UpVector: [0.0, 0.0, 1.0]

UpVectorX, UpVectorY: 0.0

UpVectorZ: 1.0

KeepUpVector: TRUE

Описание

UpVector = [x, y, z] устанавливает 3D вектор, который соответствует вертикальному направлению 2D снимка, сделанного камерой.

UpVectorX и т.д. обозначает координаты UpVector.

KeepUpVector = TRUE сохраняет UpVector постоянным, когда камера перемещена. С KeepUpVector = FALSE UpVector сохранен ортогональным к оптической оси, когда камера перемещена.

Снимок, сделанный камерой, задан атрибутами Position (3D положение камеры) и FocalPoint (3D точка, на камеру указывают). Вектор от положения до центра является оптической осью камеры.

Как дополнительная степень свободы, камера может вращаться вокруг оптической оси. Это вращение задано путем определения 3D векторного UpVector. В итоговом 2D снимке, сделанном камерой, этот вектор параллелен вертикальной оси, указывая вверх.

Со значением по умолчанию UpVector = [0, 0, 1] z - ось в 3D точках вверх в 2D изображении.

UpVector камеры не должен быть нулем и не должен быть параллелен оптической оси.

Значениями по умолчанию является UpVector = [0, 0, 1] и KeepUpVector = TRUE.

Ограничение, что UpVector не должен быть параллелен оптической оси, приводит к разрывам, когда камера перемещается таким способом, которым нарушено это ограничение. В таком случае должен использоваться KeepUpVector = FALSE. Cf. Пример 2.

Примеры

Пример 1

Мы просматриваем крест трех стрелок камерой с обычным UpVector, указывающим в z - направление:

camera := plot::Camera([0.3, -4.0, 0.2], [0, 0, 0], PI/4,
                       UpVector = [0, 0, 1]):
plot(plot::Arrow3d([-1, 0, 0], [1, 0, 0], Color = RGB::Red),
     plot::Arrow3d([0, -1, 0], [0, 1, 0], Color = RGB::Green),
     plot::Arrow3d([0, 0, -1], [0, 0, 1], Color = RGB::Blue),
     camera)

Мы переопределяем UpVector камеры, чтобы указать в направление [1, 0, 1]. Теперь, это 3D направление становится вертикальным направлением 2D изображения:

camera::UpVector := [1, 0, 1]:
plot(plot::Arrow3d([-1, 0, 0], [1, 0, 0], Color = RGB::Red),
     plot::Arrow3d([0, -1, 0], [0, 1, 0], Color = RGB::Green),
     plot::Arrow3d([0, 0, -1], [0, 0, 1], Color = RGB::Blue),
     camera)

delete camera:

Пример 2

Мы используем анимированную камеру, чтобы пролететь над Северным полюсом планеты с помощью UpVector = [0, 0, 1] по умолчанию. С KeepUpVector = TRUE мы сталкиваемся с разрывом, когда камера расположена точно по северу poly обращение прямо вниз. UpVector параллелен оптической оси в этой точке:

camera := plot::Camera([4*cos(a), 0, 4*sin(a)], [0, 0, 0], PI/4,
                       a = 0..PI, Frames = 300,
                       UpVector = [0, 0, 1], 
                       KeepUpVector = TRUE):
planet := plot::Surface([cos(u)*sin(v), sin(u)*sin(v), cos(v)],
    u = 0..2*PI, v = 0..PI, 
    FillColorFunction = proc(u, v) 
             begin 
               [cos(u)*cos(v)^2, cos(u)*cos(v)^2, cos(u)]
             end_proc):
font := ["sans-serif", 10, RGB::Grey80]:
text1 := plot::Text3d("North", [0, 0, 1.2], TextFont = font):
text2 := plot::Text3d("South", [0, 0, -1.2], TextFont = font):
plot(camera, planet, text1, text2, Scaling = Constrained);

С KeepUpVector = FALSE не сталкиваются ни с каким таким разрывом. Однако при достижении экватора на темной стороне планеты, UpVector обернулся: верхняя сторона изображения теперь является югом, более низкая сторона является севером:

camera::KeepUpVector := FALSE:
plot(camera, planet, text1, text2, Scaling = Constrained);

delete camera, planet, font, text1, text2:

Смотрите также

Функции MuPAD