Я объединил несколько файлов stl в один большой я sh, и теперь я пытаюсь удалить все лица, находящиеся внутри.
Я получил подсказку использовать окружающий прикус и удалить все лица, которые ниже определенного порога яркости.
Поэтому я начал использовать 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 * 20 мм, представляющем собой комбинацию из 8 10 * 10 * 10 мм кубов, я получаю результат
К сожалению, он распознает не только внешние лица как яркие.
Я объединяю исходные файлы 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 * 10 мм рядом друг с другом)
Вы можете найти один комбинированный stl здесь (это куб 20 * 20 * 20 мм)
Итак, знаете ли вы, почему функция внешней окклюзии определяет внутренние лица как яркие (или как я могу настроить его так, чтобы он распознавал только внешние лица как яркие) или что-нибудь, что могло бы помочь мне обнаружить внутренние или внешние лица, чтобы я мог сохранить или удалить их, чтобы в итоге я остался только с внешними лицами?