我正在从事一个涉及3d对象迭代旋转的项目,该对象由大约17,000个三角形构成。对于每次迭代,我都需要绘制对象的af图,然后将其转换为二维矩阵表示。
我的第一种方法是旋转三角形的坐标,为每次旋转创建一个新的2d图形,然后将其转换为矩阵。但是对于17,000个三角形,绘图太耗时(〜2.3s)。代码示例:
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,8))
# patches are made from vertices with Polygon
p = PatchCollection(patches, alpha=0.5)
p.set_array(np.array(colors))
ax.add_collection(p)
fig.canvas.draw()
matrix = np.array(fig.canvas.renderer._renderer)
要解决此时间消耗问题,我想我可以一次创建一个3d图,然后不旋转三角形的坐标再创建一个新图,而是旋转现有3d图的查看透视图,然后将新透视图转换为2D矩阵。但是,似乎我必须在转换之前为新的透视图绘制和渲染图形,这又导致了太高的时间消耗(〜2.5s)。代码示例:
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
fig = plt.figure()
ax = Axes3D(fig)
for vertex in vertices:
ax.add_collection3d(Poly3DCollection([vertex]), zs='z')
ax.view_init(10, 90)
fig.canvas.draw()
# grab the pixel buffer and dump it into a numpy array
matrix = np.array(fig.canvas.renderer._renderer)
但是为什么我必须绘制或渲染?如果创建交互式图形,则可以通过拖动对象进行即时旋转。有没有更聪明的方法来进行转换?