简介
本实验展示了三维绘图的不同相机投影,以及使用 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)。