0

我目前正在开发一个使用 PyQt5 能够显示 3D 对象的项目opengl.GLViewWiget

我已经下载了一个 .stl 文件和 PyQt5 模块的基础

self.Widget3D = opengl.GLViewWidget(self.centralwidget)
self.Widget3D.setGeometry(QtCore.QRect(1000, 100, 351, 271))
self.Widget3D.setObjectName("Widget3D")

我的 .STL 文件有问题,我已经安装numpy-stl并通读了它的文档,但还没有真正找到提取和使用它的方法,GLMeshItem 据我所知是这个示例代码

#Extract vertex points and face faces from the STL file.
points, faces = self.loadSTL(filename)

meshdata = gl.MeshData(vertexes=points, faces=faces)
mesh = gl.GLMeshItem(meshdata=meshdata, smooth=True, drawFaces=False, drawEdges=True, edgeColor=(0, 1, 0, 1))
self.viewer.addItem(mesh)

self.loadSTL不清楚如何numpy-stl在这段代码中真正使用

4

1 回答 1

0

这里有一些代码应该允许您GLMeshItem从 stl 文件创建。这不完全是您要问的,因为我没有从 stl 中提取顶点和面。但是您实际上并不需要这样做;构造函数可以采用 Nx3x3 顶点数组(其中 N 个三角形面中的GLMeshItem每一个都由三个 len-3 数组指定),这正是 numpy-stl 从文件加载 stl 时为您提供的。

import numpy as np
import stl

my_mesh =  stl.mesh.Mesh.from_file('my_stl_file.stl')
face_clr = np.array([[[1.0, 0.0, 0.0, 0.5]] * 3] * np.shape(my_mesh.vectors)[0])
mesh_item = gl.GLMeshItem(vertexes=my_mesh.vectors,  # Nx3x3
                          faceColors=face_clr,  # Nx3x4
                          drawEdges=True,
                          smooth=False)

如果您确实想分别提取顶点和面,我相信您只需要对my_mesh.vectors. 即,找到 中的所有唯一向量my_mesh.vectors,并找出哪些面包含哪​​些唯一向量。

于 2021-08-08T16:23:21.640 回答