3D 绘图投影类型

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验展示了三维绘图的不同相机投影,以及使用 Python Matplotlib 改变透视投影焦距的效果。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库

首先,导入必要的库,包括 Matplotlib 以及来自 mpl_toolkits.mplot3d 的 Axes3D。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

获取数据

获取用于三维绘图的测试数据。

X, Y, Z = axes3d.get_test_data(0.05)

创建带有子图的图形

使用plt.subplots创建一个包含三个子图的图形。

fig, axs = plt.subplots(1, 3, subplot_kw={'projection': '3d'})

绘制数据

使用plot_wireframe在三个子图中的每个子图上绘制数据。

for ax in axs:
    ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)

设置正交投影

将第一个子图设置为使用视场(FOV)为 0 度且焦距为无穷大的正交投影。

axs[0].set_proj_type('ortho')  ## FOV = 0 deg
axs[0].set_title("'ortho'\nfocal_length = ∞", fontsize=10)

设置透视投影

将第二个子图设置为使用默认视场(FOV)为 90 度且焦距为 1 的透视投影。

axs[1].set_proj_type('persp')  ## FOV = 90 deg
axs[1].set_title("'persp'\nfocal_length = 1 (default)", fontsize=10)

将第三个子图设置为使用视场为 157.4 度且焦距为 0.2 的透视投影。

axs[2].set_proj_type('persp', focal_length=0.2)  ## FOV = 157.4 deg
axs[2].set_title("'persp'\nfocal_length = 0.2", fontsize=10)

显示绘图

使用plt.show()显示绘图。

plt.show()

总结

本实验展示了如何使用 Python 的 Matplotlib 创建 3D 绘图,以及如何更改绘图的投影类型和焦距。正交投影会使图像变平,而透视投影会夸大透视效果并赋予图像更明显的深度。默认焦距 1 对应于 90 度的视场(FOV)。