如何在 Python 中使用 openmesh 保存自定义顶点属性?

How to save custom vertex properties with openmesh in Python?

我正在通过 pip 使用安装在 Python 3.6 中的 openmesh。我需要将自定义属性添加到网格的顶点,以便在每个顶点存储一些数据。我的代码如下:

import openmesh as OM
import numpy as np
mesh = OM.TriMesh()

#Some vertices
vh0 = mesh.add_vertex(np.array([0,0,0]));
vh1 = mesh.add_vertex(np.array([1,0,0]));
vh2 = mesh.add_vertex(np.array([1,1,0]));
vh3 = mesh.add_vertex(np.array([0,1,0]));

#Some data
data = np.arange(mesh.n_vertices)

#Add custom property
for vh in mesh.vertices():
    mesh.set_vertex_property('prop1', vh, data[vh.idx()])

#Check properties have been added correctly
print(mesh.vertex_property('prop1'))

OM.write_mesh('mesh.om',mesh)

打印returns[0, 1, 2, 3]。到目前为止,一切都很好。但是当我再次阅读网格时,自定义 属性 已经消失了:

mesh1 = OM.TriMesh()

mesh1 = OM.read_trimesh('mesh.om')

print(mesh1.vertex_property('prop1'))

returns [None, None, None, None]

我有两个猜测:
1 - 属性 一开始没有保存
2 - reader 在读取文件 mesh.om

时不知道有自定义 属性

有人知道如何在 Python 中使用 openmesh 正确保存和读取具有自定义顶点属性的网格吗?或者甚至有可能(以前有人做过吗?)?
是不是我的代码有问题?

感谢您的帮助,

查尔斯.

OM 编写器目前不支持自定义属性。如果您使用的是数字属性,最简单的方法可能是将数据转换为 NumPy 数组并单独保存。

假设您的网格和属性设置如下:

import openmesh as om
import numpy as np

# create example mesh
mesh1 = om.TriMesh()
v00 = mesh1.add_vertex([0,0,0])
v01 = mesh1.add_vertex([0,1,0])
v10 = mesh1.add_vertex([1,0,0])
v11 = mesh1.add_vertex([1,1,0])
mesh1.add_face(v00, v01, v11)
mesh1.add_face(v00, v11, v01)

# set property data
mesh1.set_vertex_property('color', v00, [1,0,0])
mesh1.set_vertex_property('color', v01, [0,1,0])
mesh1.set_vertex_property('color', v10, [0,0,1])
mesh1.set_vertex_property('color', v11, [1,1,1])

您可以使用 *_property_array 方法之一将 属性 数据提取为 numpy 数组,并使用 NumPy 的 save 函数将其与网格一起保存。

om.write_mesh('mesh.om', mesh1)
color_array1 = mesh1.vertex_property_array('color')
np.save('color.npy', color_array1)

加载相似:

mesh2 = om.read_trimesh('mesh.om')
color_array2 = np.load('color.npy')
mesh2.set_vertex_property_array('color', color_array2)

# verify property data is equal
for vh1, vh2 in zip(mesh1.vertices(), mesh2.vertices()):
    color1 = mesh1.vertex_property('color', vh1)
    color2 = mesh2.vertex_property('color', vh2)
    assert np.allclose(color1, color2)

当你存储数据时,你应该设置 set_persistent 函数为真,如下所示。 (抱歉使用c++,我不知道python)

OpenMesh::VPropHandleT<float> vprop_float;
mesh.add_property(vprop_float,  "vprop_float");
mesh.property(vprop_float).set_persistent(true);
OpenMesh::IO::write_mesh(mesh, "tmesh.om");

然后,您必须在使用 obj reader 加载网格之前在网格中请求此自定义 属性。顺序很重要。

TriMesh readmesh;
OpenMesh::VPropHandleT<float> vprop_float;
readmesh.add_property(vprop_float, "vprop_float");
OpenMesh::IO::read_mesh(readmesh, "tmesh.om");'

我在下面提到过。 https://www.openmesh.org/media/Documentations/OpenMesh-4.0-Documentation/a00062.html https://www.openmesh.org/media/Documentations/OpenMesh-4.0-Documentation/a00060.html