如何从 .stl 文件中提取顶点、面

问题描述

我目前正在开发一个使用 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中找出所有唯一向量,并找出哪些人脸包含哪些唯一向量。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...