Spec-Zone.ru › Matplotlib

Углы обзора mplot3d

Как задать угол обзора

Положение «камеры» области просмотра на 3D-графике задаётся тремя углами: углом места, азимутом и креном. Из полученного положения камера всегда направлена на центр объёма области построения. Направление отсчёта углов является общепринятым и используется также в PyVista и MATLAB. Обратите внимание: положительный угол крена поворачивает плоскость обзора по часовой стрелке, поэтому оси 3D-графика будут казаться повёрнутыми против часовой стрелки.

../../../_images/mplot3d_view_angles.png

Вращение графика с помощью мыши управляет азимутом, углом места и креном; все три угла можно задать программно:

import matplotlib.pyplot as plt
ax = plt.figure().add_subplot(projection='3d')
ax.view_init(elev=30, azim=45, roll=15)

Основные плоскости обзора

На схеме ниже показан «развёрнутый» график и необходимые значения угла места, азимута и крена для прямого обзора основных плоскостей. Дополнительные сведения приведены в документации API mplot3d.axes3d.Axes3D.view_init.

(Source code, 2x.png, png)

Вращение мышью

Ориентацию 3D-графиков можно менять, перетаскивая мышь. Это можно делать разными способами; стиль вращения мышью задаётся параметром rcParams["axes3d.mouserotationstyle"] (по умолчанию: 'arcball'); см. раздел Настройка Matplotlib с помощью таблиц стилей и rcParams.

До версии v3.10 положение указателя мыши в 2D напрямую соответствовало азимуту и углу места; такой же подход используется в MATLAB. Чтобы сохранить это поведение, задайте mouserotationstyle: azel. Такой подход хорошо подходит для графиков в сферических координатах, где ось z является особой; однако при взгляде вдоль оси z возникает своего рода «блокировка карданова подвеса»: график по-разному реагирует на движения мыши в зависимости от текущей ориентации. Кроме того, управлять «креном» таким способом нельзя.

В качестве альтернативы можно использовать различные стили вращения мышью, при которых мышь управляет виртуальным «трекболом». В простейшем варианте (mouserotationstyle: trackball) трекбол вращается вокруг оси, лежащей в плоскости и перпендикулярной движению мыши (как если бы на трекбол была положена пластина: ориентация самой пластины не меняется, но её можно перетаскивать мышью, вращая шар). С этим стилем работать естественнее, чем со стилем azel; однако график нельзя легко повернуть вокруг направления обзора — для этого нужно двигать мышь по кругу в направлении, противоположном желаемому вращению, что не слишком интуитивно.

Другой вариант трекбола вращается по кратчайшей дуге виртуальной сферы (mouserotationstyle: sphere). Повернуть график вокруг направления обзора с его помощью просто: захватите шар ближе к краю, а не к центру.

Также доступен ARCBALL Кена Шумейка [Shoemake1992] (mouserotationstyle: Shoemake); он похож на стиль sphere, но не подвержен гистерезису: при возвращении мыши в исходное положение фигура возвращается к исходной ориентации. Вращение не зависит от особенностей траектории движения мыши, что может быть полезно. Однако arcball Шумейка вращается с угловой скоростью, вдвое превышающей скорость движения мыши (это особенно заметно при настройке крена), и у него нет очевидного механического аналога; можно утверждать, что вращение, не зависящее от траектории, не слишком естественно (хотя и удобно) и к нему может потребоваться привыкнуть. Таким образом, это компромисс.

Обзор можно найти в работе Хенриксена и соавторов [Henriksen2002]. Краткое описание:

Стиль

традиционный [1]

включая крен [2]

равномерный [3]

независимый от траектории [4]

механический аналог [5]

azel

✔️

❌

❌

✔️

✔️

trackball

❌

✓ [6]

✔️

❌

✔️

sphere

❌

✔️

✔️

❌

✔️

arcball

❌

✔️

✔️

✔️

❌

[1]

Так было до версии v3.10; этот стиль также используется в MATLAB

[2]

С помощью мыши можно управлять также креном (а не только азимутом и углом места)

[3]

Фигура одинаково реагирует на движения мыши при любой ориентации (разницы между «полюсами» и «экватором» нет)

[4]

При возвращении мыши в исходное положение фигура возвращается к исходной ориентации (вращение не зависит от особенностей траектории движения мыши)

[5]

Для этого стиля существует соответствующая естественная реализация в виде механического устройства

[6]

Хотя стиль trackball позволяет управлять креном, это не сразу очевидно (для этого нужно двигать мышь по большим кругам) и несколько противоречит интуиции (крен получается в противоположном направлении)

Попробовать различные стили вращения мышью можно с помощью:

import matplotlib as mpl
mpl.rcParams['axes3d.mouserotationstyle'] = 'trackball'  # 'azel', 'trackball', 'sphere', or 'arcball'

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

ax = plt.figure().add_subplot(projection='3d')

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)

plt.show()

Также можно создать файл matplotlibrc со следующим содержимым:

axes3d.mouserotationstyle: trackball

(или указать любой другой стиль вместо trackball), а затем запустить любой из примеров построения 3D-графиков.

Размер виртуального трекбола, сферы или arcball можно настроить с помощью параметра rcParams["axes3d.trackballsize"] (по умолчанию: 0.667). Он определяет, насколько нужно переместить мышь, чтобы получить заданный угол поворота (при движении около центра), а также задаёт положение края сферы или arcball (расстояние от центра, то есть близость к краю графика). Размер указывается в единицах ограничивающего прямоугольника Axes; чтобы arcball занимал весь ограничивающий прямоугольник, задайте значение 1. Размер около 2/3, по-видимому, вполне подходит; это значение используется по умолчанию.

У обоих вариантов arcball (mouserotationstyle: sphere и mouserotationstyle: arcball) хорошо заметен край; сделать его менее резким можно, задав ширину границы rcParams["axes3d.trackballborder"] (по умолчанию: 0.2). Это отчасти напоминает arcball Гэвина Белла, изначально созданный для OpenGL [Bell1988] и используемый в Blender и Meshlab. Arcball Белла дополняет сферическую поверхность управления гиперболой; они плавно соединяются. Однако гипербола продолжается за пределы края графика. В стилях sphere и arcball библиотеки mplot3d граница продолжается до радиуса trackballsize/2 + trackballborder. За границей стиль работает как исходный: он управляет только креном. Ширина границы около 0.2, по-видимому, подходит; это значение используется по умолчанию. Чтобы получить исходный arcball Шумейка с резкой границей, задайте ширину границы 0. Для расширенной границы, похожей на arcball Белла, где переход от arcball к границе происходит под углом 45°, задайте ширину границы \(\sqrt 2 \approx 1.414\). Граница представляет собой круговую дугу, цилиндрически обёрнутую вокруг сферы arcball (как пончик) и плавно соединённую со сферой, подобно гиперболе Белла.

[Shoemake1992]

Кен Шумейк, «ARCBALL: пользовательский интерфейс для задания трёхмерного вращения с помощью мыши», в сборнике трудов Graphics Interface '92, 1992, с. 151–156, https://doi.org/10.20380/GI1992.18

[Bell1988]

Гэвин Белл, примеры, включённые в библиотеку GLUT (OpenGL Utility Toolkit), markkilgard/glut

[Henriksen2002]

Кнуд Хенриксен, Йон Спорринг, Каспер Хорнбек, «Виртуальные трекболы: новый взгляд», в журнале IEEE Transactions on Visualization and Computer Graphics, том 10, выпуск 2, март–апрель 2004, с. 206–216, https://doi.org/10.1109/TVCG.2004.1260772 [полный текст];

© 2012–2026 Matplotlib Development Team. All rights reserved.
Licensed under the Matplotlib License Agreement.
https://matplotlib.org/stable/api/toolkits/mplot3d/view_angles.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API