我正在使用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自定义顶点属性保存和读取网格吗?或者它是否可能(以前有人做过吗?)? 是不是我的代码有问题?
感谢您的帮助,
查尔斯。
答案 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