UpVector
, UpVectorX
, UpVectorY
, UpVectorZ
, KeepUpVector
Направление камеры
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Объекты | Значения по умолчанию |
---|---|
plot::Camera |
|
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.
Мы просматриваем крест трех стрелок камерой с обычным 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:
Мы используем анимированную камеру, чтобы пролететь над Северным полюсом планеты с помощью 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: