如何用Python获得3D彩色表面?

如何用Python获得3D彩色表面?

在科学计算、工程学和计算机图形学中,表面绘制是一种广泛应用的技术。表面绘制包括了生成矢量图、点云、3D模型和3D彩色表面等等。在这篇文章中,我们将会探讨如何用Python生成3D彩色表面,并且可以使用各类软件去后处理处理生成的表面。

准备工作

在生成3D表面之前,我们需要安装一些依赖和库。首先,安装Python的科学计算基础库——numpy。通过这些库,我们可以更加轻松地处理数据和计算。其次,我们还需要安装可视化和3D绘图库——matplotlib和mpl_toolkits.mplot3d。mpl_toolkits.mplot3d 包提供了一系列的3D绘图功能,matplotlib我们以前非常熟悉了,可以在官网找到安装的步骤,以下是其中一些代码片段给大家参考:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

构建数据

在开始生成表面之前,我们必须先构建数据集。我们可以通过各种方法来生成表面,例如从图像、点云、立体扫描图像、连续函数等简单或复杂的对象中提取三维几何信息。在这个例子中,我们将通过函数的方式来生成数据集:

# 定义一个函数生成数据集
def fun(x, y):
    return np.sin(np.sqrt(x**2 + y**2))

# 生成x, y轴网格
X, Y = np.meshgrid(np.linspace(-6, 6, 30), np.linspace(-6, 6, 30))
# 计算每一点数据集的高度值
Z = fun(X, Y)

这里我们用一个叫做fun的函数去计算每一个网格坐标的z坐标值(也就是高度值)。我们用np.meshgrid函数去生成x, y轴网格,这是为了将数据变成可以绘制的形式。现在数据已经生成好了,我们开始准备绘图。

生成表面

生成3D表面最简单的方法就是使用Matplotlib的mpl_toolkits库中的Axes3D模块。这个模块可以让我们轻松地绘制3D表面。以下是代码片段:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D表面
surface = ax.plot_surface(X, Y, Z, cmap='coolwarm')

# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 显示图像
plt.show()

我们首先创建一个figure对象,然后用该对象创建了Axes3D对象。由于要绘制的数据是3D的,所以我们需要一个三维视图。然后,我们可以使用plot_surface函数绘制表面。在这里我们指定了所需的x,y和z数据集,同时使用“coolwarm”颜色图进行绘制。最后,我们设置x,y和z标签,并且显示图像。

调整3D表面

然而,当我们绘制表面时,许多时候我们需要进行一些调整,例如调整视角、表面色彩和透明度等等。Matplotlib提供了几种方法来进行这些调整:

调整视角

通过视角调整,我们可以改变观察者看待表面的角度。我们可以使用view_init()函数,从不同的角度来观察表面,以下是代码片段:

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

# 绘制3D表面
surface = ax.plot_surface(X, Y, Z, cmap='coolwarm')

# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 调整视角
ax.view_init(elev=20, azim=60)

# 显示图像
plt.show()

这里我们使用view_init()函数来调整视角。该函数接受两个参数,第一个是仰角(elev),表示将覆盖物上下旋转的角度,范围是[-90, 90]。句法意思是从z轴正上方往下看。第二个是方位角(azim),表示将覆盖物左右旋转的角度,范围是[-180, 180]。需要注意的是,我们需要首先创建figure和Axes3D对象,然后再调用view_init()函数才生效。

调整表面色彩

我们可以使用cmap参数来指定绘制表面所用的颜色映射。颜色映射是一个包含颜色信息的颜色表,帮助我们更好地区分不同的数值。Matplotlib提供了许多不同的预定制颜色映射,例如:’autumn’、’cool’、’spring’和’winter’等,以下是代码片段:

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

# 绘制3D表面
surface = ax.plot_surface(X, Y, Z, cmap='cool')

# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 调整表面颜色
surface.set_cmap('RdYlBu')

# 显示图像
plt.show()

这里我们首先使用’cool’颜色映射绘制表面,然后使用set_cmap()方法将颜色映射设置为’Red-Yellow-Blue’。

调整表面透明度

我们可以使用alpha参数来调整表面的透明度。该参数控制绘制表面时透明度的程度,其范围为[0, 1]之间。以下是代码片段:

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

# 绘制3D表面
surface = ax.plot_surface(X, Y, Z, cmap='coolwarm')

# 设置标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 调整表面透明度
surface.set_alpha(0.7)

# 显示图像
plt.show()

后处理表面

Matplotlib绘制出来的3D表面可以导出成obj文件,可以导入到一些后处理软件比如Blender中进行美化处理,甚至可以在Blender中导出STL文件进行3D打印。可以用以下代码将绘制出来的3D表面导出成obj文件:

from mpl_toolkits import mplot3d
fig = plt.figure()
ax = plt.axes(projection='3d')

# 生成数据
x = np.outer(np.linspace(-2, 2, 100), np.ones(100))
y = x.copy().T
z = np.sin(x ** 2 + y ** 2)

# 绘制3D表面
ax.plot_surface(x, y, z, cmap='viridis')

# 导出obj文件
from matplotlib import cm
from matplotlib import mlab
import numpy as np
from scipy.io import savemat
verts, faces, normals, values = mplot3d.proj3d.art3d._convert_to_ordered_edges((x, y, z))
faces = np.array(faces)
verts = np.array(verts)
faces = faces + 1
df = np.concatenate([shell_verts, shell_norms],axis=1)
scipy.io.savemat("surface.mat", df)

# 显示图像
plt.show()

结论

在这篇文章中,我们探讨了用Python生成3D彩色表面的方法。我们首先准备了依赖和库,然后生成了数据集,最后使用mpl_toolkits库的Axes3D模块绘制了表面并进行了调整。同时,我们还介绍了如何在Matplotlib中后处理表面,使得我们可以将表面导出成obj文件,使用其他软件进行优化和打印。

通过这篇文章的学习,我们可以了解到如何用Python简单地生成3D彩色表面,以及如何后处理表面。希望这篇文章可以对想要学习3D表面绘制的人有所启发和帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程