问题描述
我目前正在开发一个使用 PyQt5 能够使用 opengl.GLViewWiget
显示 3D 对象的项目
我已经下载了一个 .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,1))
self.viewer.addItem(mesh)
self.loadSTL
部分我不清楚如何真正使用此代码中的 numpy-stl
解决方法
这里有一些代码可以让您从 stl 文件创建 GLMeshItem
。这不是完全您要问的,因为我没有从 stl 中提取顶点和面。但您实际上并不需要这样做; GLMeshItem
构造函数可以采用 Nx3x3 顶点数组(其中 N 个三角形面中的每一个都由三个 len-3 数组指定),这正是当您从文件加载 stl 时 numpy-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.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
中找出所有唯一向量,并找出哪些人脸包含哪些唯一向量。