MeshLab является довольно популярной программой для манипуляции и визуализации трехмерных моделей, предоставляющий широкий набор инструментов. Он среди прочего предоставляет возможности по восстановлению и устранению проблем и ошибок в 3D моделях. О некоторых таких возможностях я бы хотел рассказать в статье. Кого заинтересовало, прошу под кат.
Довольно популярной проблемой при работе с 3D моделями является возникновение отверстий (holes, gaps). Такие проблемы возникают из-за несовершенной процедуры реконструкции сцены или недостаточной точности и качества 3D камер типа Microsoft Kinect.
Мы можем восстановить поврежденные поверхности моделей и закрыть дыры в программе Meshlab. Meshlab включает специальный фильтр для задачи закрытия отверстий в 3D моделях.
В начале откроем Meshlab и импортируем модель: File > Import Mesh.
Здесь показан пример модели с отверстием:
Применим фильтр. Откроем в верхнем меню Filters > Remeshing, Simplification … > Close Holes
Откроется диалог настройки параметров:
Введем значение для параметра Max size to be closed и нажмем Apply. В моем случае хороший результат дало значение 210.
Результат применения фильтра:
Выглядит неплохо, не правда ли?
Как мы видим не нужно писать специальный скрипт для закрытия отверстий. Все работает "из коробки".
Решение проблемы с дубликат вершины в модели
После применения фильтра Close Holes при экспорте модели в obj файл могут возникнуть вершины-дубликаты, т.е. вершины с одинаковыми координатами. Это может привести к некорректной обработке модели при использовании библиотек типа OpenMesh.
Давайте создадим obj файл со следующим содержимым:
v 0 0 0
v 1 0 0
v 0 1 0
v 1 1 0
f 0 1 2
f 1 2 3
Создадим скрипт test_duplicates.py с использованием библиотеки OpenMesh (туториалы по ней можно посмотреть здесь)
import openmesh as om
import numpy as np
mesh_3 = om.read_trimesh('duplicate_vert_test.obj')
print('Test duplicate vertices')
for i, vh in enumerate(mesh_3.vertices()):
print('Vertices adjacent to vertex ', i)
for vh_n in mesh_3.vv(vh):
print(vh_n.idx())
Запустим его
Vertices adjacent to vertex 0
2
1
Vertices adjacent to vertex 1
0
2
Vertices adjacent to vertex 2
1
0
Vertices adjacent to vertex 3
Vertices adjacent to vertex 4
Добавим дубликат вершины
v 0 0 0
v 1 0 0
v 0 1 0
v 1 1 0
v 1 0 0
f 0 1 2
f 4 2 3
Здесь мы добавили еще одну вершину с координатами 1 0 0.
Запустим скрипт еще раз
Vertices adjacent to vertex 0
Vertices adjacent to vertex 1
3
2
Vertices adjacent to vertex 2
1
3
Vertices adjacent to vertex 3
2
1
Vertices adjacent to vertex 4
Сейчас мы видим, что для вершины 0 нет соседних вершин, зато для вершины 3 появились две соседние вершины 2 и 1. Кажется, что вершина 4 перетянула к себе всех соседей вершины 0, с которой имеет одинаковые координаты.
Попробуем удалить дубликаты вершин на модели из примера выше. Импортируем модель:
Здесь мы видим множество цветных граней.
Применим специальный фильтр для удаления дубликатов вершин
Filters -> Cleaning and Repairing -> Remove duplicate Vertices
Результат применения фильтра:
Если мы применим фильтр на нашей первоначальной простой модели после экспорта модели мы получим obj файл следующего содержания
vn 0.000000 -nan(ind) 0.000000
v 0.000000 0.000000 0.000000
vn 0.000000 0.000000 -0.785398
v 1.000000 0.000000 0.000000
vn 0.000000 0.000000 -0.785398
v 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.570796
v 1.000000 1.000000 0.000000
# 4 vertices, 0 vertices normals
f 4//4 2//2 3//3
# 1 faces, 0 coords texture
На этом все. Удачи в использовании MeshLab для манипуляции с 3D моделями и до новых встреч.