При экспорте сетки не удается создать читаемый файл слоя

Я написал небольшой скрипт, в котором есть задача загрузить сетку (слой), затем применить некоторые фильтры и, наконец, экспортировать все это обратно в виде слоя.

Все идет нормально. Но полученный ply-файл получается нечитаемым. Если я попытаюсь открыть его в MeshLab, появится сообщение: Face with more than 3 vertices

вот часть кода, которая касается pymeshlab (очищена):

import pymeshlab as ml
ms = ml.MeshSet()
ms.load_new_mesh(path + mesh_name)
ms.apply_filter('convert_pervertex_uv_into_perwedge_uv')
ms.apply_filter('transfer_color_texture_to_vertex')
ms.save_current_mesh(path + 'AutomatedGeneration3.ply')

Я что-то пропустил? На самом деле при выполнении этого сценария нет сообщения об ошибке. Я также пробовал использовать некоторые параметры для фильтра сохранения, но он ничего не изменил.

Как мне это исправить?


person Coder1234    schedule 22.01.2021    source источник
comment
Можете ли вы добавить строку ms.set_versbosity (True) в начало скрипта, чтобы увидеть, не пишет ли meshlab какую-нибудь ошибку?   -  person Rockcat    schedule 22.01.2021
comment
Он говорит, что ему не хватает текстуры слоеного файла. Текстура существует в том же каталоге, что и слой, и мой скрипт также копирует ее в каталог meshlab (именно там ML ищет ее, когда я делаю это вручную)   -  person Coder1234    schedule 25.01.2021
comment
хорошо, я изменил параметры save_current_mesh () с 'binary = True' на 'binary = False', и теперь он создает правильную сетку.   -  person Coder1234    schedule 25.01.2021


Ответы (1)


Похоже, это ошибка в экспортере .ply, используемом внутри метода ms.save_current_mesh().

Метод пытается сохранить всю информацию, хранящуюся в сетке, которая на данный момент является texture_per_vertex, texture_per_wedge и color_per_vertex, и что-то там не так.

Я нашел обходной путь, отключив сохранение texture_per_wedge (что необходимо только для transfer_color_texture_to_vertex filter.

import pymeshlab as ml
ms = ml.MeshSet()
#Load a mesh with texture per wedge
ms.load_new_mesh('input_pervertex_uv.ply')
m = ms.current_mesh()

print("Input mesh has", m.vertex_number(), 'vertex and', m.face_number(), 'faces' )

ms.apply_filter('convert_pervertex_uv_into_perwedge_uv')
ms.apply_filter('transfer_color_texture_to_vertex')

#Export mesh with color_per_vertex but without texture
ms.save_current_mesh('output.ply',save_wedge_texcoord=False,save_vertex_coord=False )

Список допустимых аргументов для save_current_mesh можно прочитать здесь https://pymeshlab.readthedocs.io/en/latest/filter_list.html#save-parameters.

Обратите внимание, что save_vertex_coord относится к координатам текстуры на вершину !!!

person Rockcat    schedule 25.01.2021