绘制存储为顶点和面的网格

时间:2019-06-12 09:57:17

标签: python python-3.x matplotlib

我将网格存储为3D面和顶点的集合,例如

v = np.array([[0,0,0],
              [1,0,0],
              [1,1,0],
              [0,1,0],
              [0,0,1],
              [1,0,1],
              [1,1,1],
              [0,1,1]])
f = np.array([[0,2,1],
              [0,3,2],
              [1,2,6],
              [1,6,5],
              [0,5,4],
              [0,1,5],
              [4,5,6],
              [6,7,4],
              [3,7,6],
              [6,2,3],
              [0,4,7],
              [7,3,0]])

v描述节点的坐标,f描述每个面的顶点的索引。

我有一个向量C,例如在每个节点上都包含一个标量。

C = np.array([1,2,3,4,5,6,7,8])

我想使用C中的标量作为每个节点的颜色图将其绘制为网格。这类似于使用patch('Faces',F,'Vertices',V)命令(doc)在Matlab中实现的功能

是否可以使用matplotlib或更广泛地使用python实现此目标?

奖励问题:

更一般而言,我的脸部可以具有可变数量的顶点。在我的矩阵中,我既有tri面又有quad面,其中tri面用np.nan填充为第四个节点。

是否可以在不将四边形拆分为三边的情况下绘制同时具有3个和4个侧面的网格?

1 个答案:

答案 0 :(得分:1)

您可以使用面Poly3DCollection的边缘坐标绘制v[f]

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

v = np.array([[0,0,0], [1,0,0], [1,1,0], [0,1,0], 
              [0,0,1], [1,0,1], [1,1,1], [0,1,1]])

f = np.array([[0,2,1], [0,3,2], [1,2,6], [1,6,5],
              [0,5,4], [0,1,5], [4,5,6], [6,7,4],
              [3,7,6], [6,2,3], [0,4,7], [7,3,0]])

C = np.array([1,2,3,4,5,6,7,8,2,3,4,5])


fig = plt.figure()
ax = fig.add_subplot(projection="3d")

norm = plt.Normalize(C.min(), C.max())
colors = plt.cm.viridis(norm(C))

pc = art3d.Poly3DCollection(v[f], facecolors=colors, edgecolor="black")
ax.add_collection(pc)

plt.show()

enter image description here

请注意,您将需要给脸部着色,而不是给节点着色(因为节点不能具有颜色)-因此我在C中发明了一些其他值。