0

我已经将多个 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 立方体)

所以你知道为什么环境光遮蔽功能检测到内面是明亮的(或者我如何调整它以便它只检测到外面是明亮的)或者任何可以帮助我检测到内面或外面的东西,这样我就可以保持或删除它们,最后我会只剩下外表面吗?

4

1 回答 1

0

一种不同的方法可能是执行以下操作:

  1. 从您的原始网格开始
  2. 计算 [1] 的凸包 -> 这会产生第二个网格
  3. 对于 [1] 中的所有面,如果其任何顶点不在 [2] 中,则从网格中删除该面
  4. 您的原始网格现在只有“外部”的面。

有许多计算凸包的算法,特别是 Chan 算法Quickhull。还有一些 python 库实现了这些算法,比如SciPy

于 2020-05-06T16:13:53.107 回答