我已经将多个 stl 文件合并到一个大网格中,现在我正在尝试删除内部的所有面。
我得到了使用环境光遮蔽并移除低于某个亮度阈值的所有面部的提示。
所以我开始使用具有环境光遮蔽功能的libigl。我想出了这段代码:
import igl
import numpy as np
from meshplot import plot, subplot, interact
import os
import math
v, f = igl.read_triangle_mesh("cube.stl")
print("Vertices: ", len(v))
print("Faces: ", len(f))
n = igl.per_vertex_normals(v, f)
ao = igl.ambient_occlusion(v, f, v, n, 5)
newV = []
newF = []
z = 0.8 #brightness threshold
for x in range(3,len(v),3):
if ao[x]<=z or ao[x]<=z or ao[x]<=z: #adds the faces with its verteces with brightness above z to 'newV' and 'newF'
#each face has 3 verteces
newV.append(v[x-3]) #verex1
newV.append(v[x-2]) #verex2
newV.append(v[x-1]) #verex3
newF.append(f[int(x/3)-1]) #face
plot(np.array(newV),np.array(newF))
当在 20*20*20mm 立方体上使用此代码时,它是 8 个 10*10*10mm 立方体的组合,我得到了这个结果
不幸的是,它不仅检测到明亮的外表面。
我将原始 stl 文件与以下代码结合起来:
import numpy
from stl import mesh
data = []
for x in range(2):
for y in range(2):
for z in range(2):
#standart.stl is a 10 by 10 by 10 mm cube
mesh_instance = mesh.Mesh.from_file('standart.stl')
mesh_instance.translate((x*10,y*10,z*10))
data.append(mesh_instance.data)
combined = mesh.Mesh(numpy.concatenate(data))
combined.save('out.stl')
(它只是将 8 个 10*10*10mm 的立方体并排放置)
你可以在这里找到一个组合的 stl (它是 20*20*20mm 立方体)
所以你知道为什么环境光遮蔽功能检测到内面是明亮的(或者我如何调整它以便它只检测到外面是明亮的)或者任何可以帮助我检测到内面或外面的东西,这样我就可以保持或删除它们,最后我会只剩下外表面吗?