如何在Python的OpenMesh中保存自定义顶点属性?
如何在Python OpenMesh中正确保存和读取带自定义顶点属性的网格
你猜的没错!问题确实出在自定义属性的持久化设置上。默认情况下,OpenMesh创建的自定义属性是临时的,只会存在于内存的网格对象中,不会被写入保存的文件,所以重新读取后自然看不到属性值。下面是具体的问题分析和解决方案:
问题根源
你原来的代码中,通过set_vertex_property隐式创建的属性默认是非持久化的(persistent=False是默认参数),这类属性不会被write_mesh写入文件。所以当你重新读取网格时,这些临时属性已经不存在了,返回的就是None。
解决方案:创建持久化自定义属性
要让自定义属性能被保存和读取,核心是在创建属性时显式标记它为持久化,具体步骤和修正后的代码如下:
1. 修正后的保存代码
import openmesh as OM import numpy as np # 创建网格并添加顶点 mesh = OM.TriMesh() 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])) # 关键:创建持久化的自定义顶点属性 mesh.add_vertex_property('prop1', persistent=True) # 设置属性值(循环或批量赋值都可以) data = np.arange(mesh.n_vertices) for vh in mesh.vertices(): mesh.set_vertex_property('prop1', vh, data[vh.idx()]) # 也可以用更简洁的批量赋值: # mesh.vertex_property('prop1')[:] = data # 验证属性值 print(mesh.vertex_property('prop1')) # 输出 [0, 1, 2, 3] # 保存网格(.om格式原生支持持久化属性) OM.write_mesh('mesh.om', mesh)
2. 修正后的读取代码
import openmesh as OM # 读取网格 mesh1 = OM.read_trimesh('mesh.om') # 直接访问自定义属性 print(mesh1.vertex_property('prop1')) # 输出 [0, 1, 2, 3],不再是None!
额外说明
- 如果需要添加其他类型的自定义属性(比如浮点型、三维向量型),可以在创建时指定数据类型,例如:
# 创建浮点型持久化属性 mesh.add_vertex_property('float_prop', dtype=np.float32, persistent=True) # 创建三维向量型持久化属性 mesh.add_vertex_property('vec_prop', dtype=np.ndarray, persistent=True) - 除了
.om格式,OpenMesh的.ply格式也支持自定义属性,但.om作为原生格式,对持久化属性的支持最完善,推荐优先使用。
内容的提问来源于stack exchange,提问作者CDuvert
相关产品推荐
相关产品推荐

