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

时间:2018-05-18 14:16:21

标签: python python-3.x io openmesh customproperty

我正在使用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)

打印返回[0, 1, 2, 3]。到现在为止还挺好。但是当我再次阅读网格时,自定义属性已经消失:

mesh1 = OM.TriMesh()

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

print(mesh1.vertex_property('prop1'))

返回[None, None, None, None]

我有两个猜测:
1 - 该物业未首先保存 2 - 读者在读取文件mesh.om

时不知道有自定义属性

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

感谢您的帮助,

查尔斯。

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

在存储数据时,应将set_spersistent函数设置为true,如下所示。 (很抱歉使用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阅读器。顺序很重要。

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