Сохранить и заменить сетку

Oct 09 2020

Мне нужно создать выпуклую оболочку над моими объектами, отрендерить изображение, а затем снова удалить эту оболочку. Моя идея заключалась в том, чтобы сохранить объект, данные объекта или саму сетку, затем создать корпус и визуализировать изображение, а затем просто заменить объект / данные / сетку сохраненными данными.

Например, сначала я бы сделал

self.backup[obj.name] = obj.data

а затем после полного и рендеринга я хотел бы сделать что-нибудь вроде

orig_data= self.backup[obj.name]
obj.data = orig_data
obj.data.update()

Но это не восстановление прежних данных, корпус остается. Я предполагаю, что сейчас я просто храню ссылки вместо реальных данных, но я не знаю, как это исправить, потому что я мало что знаю о различных типах данных блендера и т. Д.

После попытки заменить сетку объектов, данные и сам объект, но ничего из этого не сработало, у меня как будто закончились идеи. Буду рад любому вкладу =)

PS: Я использую 2.8. в случае, если это имеет значение.

Ответы

3 batFINGER Oct 09 2020 at 19:14

Сделать копию

простой ответ:

self.backup[obj.name] = obj.data.copy()

без создания копии у вас была ссылка на ту же сетку. Если вы используете bpy.ops.mesh.convex_hullпредложение вместо использования bmesh, см.

Есть ли способ сделать несколько объектов выпуклыми оболочками?

Выпуклая оболочка как сетка

Данные уже хранятся для нас в данных blend-файла,

me = context.object.data

который без переименования мешей между ними все еще

bpy.data.objects[me.name]

Следовательно, можно просто сохранить имя, создать новую сетку с другим именем для выпуклой оболочки и поменять местами сетки, полученные через имена.

Если после создания сетки выпуклой оболочки и вы хотите, чтобы она была доступна постоянно, следует рассмотреть подход, придающий объекту-сетке свойство указателя на сетку его выпуклой оболочки.

bpy.props.Object.convex_hull_mesh = PointerProperty(type=bpy.types.Mesh)

создать выпуклую сетку корпуса и назначить ее этому свойству, чтобы сохранить ее. Другое логическое свойство можно использовать как флаг для переключения между исходной сеткой и сеткой выпуклой оболочки.