You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:23