Попытка удалить внешние лица от меня sh с окклюзией окружающей среды | трассировка лучей - PullRequest
0 голосов
/ 25 апреля 2020

Я объединил несколько файлов 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 мм)

Итак, знаете ли вы, почему функция внешней окклюзии определяет внутренние лица как яркие (или как я могу настроить его так, чтобы он распознавал только внешние лица как яркие) или что-нибудь, что могло бы помочь мне обнаружить внутренние или внешние лица, чтобы я мог сохранить или удалить их, чтобы в итоге я остался только с внешними лицами?

1 Ответ

0 голосов
/ 06 мая 2020

Другой подход может заключаться в следующем:

  1. Начните с вашего исходного меня sh
  2. Рассчитайте выпуклую оболочку из [1] -> это даст вторую me sh
  3. Для всех граней в [1] удалите грань из me sh, если какой-либо из его вершин нет в [2]
  4. Ваш исходный я sh теперь имеет только грани, находящиеся «снаружи».

Существует ряд алгоритмов для вычисления выпуклой оболочки, в частности алгоритм Чана и Quickhull, Существуют также python библиотеки с реализациями этих алгоритмов, например SciPy .

...