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 npmesh_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 021Vertices adjacent to vertex 102Vertices adjacent to vertex 210Vertices adjacent to vertex 3Vertices 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 0Vertices adjacent to vertex 132Vertices adjacent to vertex 213Vertices adjacent to vertex 321Vertices 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 моделями и до новых встреч.