【问题标题】:OpenMesh edge index after reopening a modified mesh重新打开修改后的网格后的 OpenMesh 边缘索引
【发布时间】:2016-09-22 07:01:09
【问题描述】:

我修改了一个网格,并添加了一些边。

然后我将修改后的网格保存到 .obj 文件中。当我使用 OpenMesh 读取功能打开这个 .obj 文件时,边的索引与保存网格时边的索引不同,因为 .obj 文件只有顶点和面的信息。

保存修改后的网格时,我需要以边缘索引顺序保存一个额外的边缘信息文件。但是按照我上面说的顺序是不一样的,所以重新打开修改过的mesh后边信息是错误的。

我有一个解决方案。我保存修改后的网格(旧网格),然后将保存的文件读取为新网格。按索引顺序检查新网格的每条边,并在旧网格中找到相同的边。然后我可以按照新网格的边缘索引顺序输出边缘信息。

有没有不重新打开的简单解决方案?例如,重新计算边缘索引的 OpenMesh 函数?

谢谢

【问题讨论】:

    标签: c++ openmesh


    【解决方案1】:

    根据您的说法,我认为您可能正在使用(或至少应该使用)一个自定义边缘属性来存储您的附加信息。理想情况下是这样的:

    auto edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew<
            OpenMesh::EPropHandleT<std::string> >(mesh, "edge_info");
    // Set some random edge info.
    edge_pm[mesh.edge_handle(23)] = "foo";
    

    您可以使用 OpenMesh 的原生 .om 格式,该格式允许您存储自定义属性。看看/src/Unittests/unittests_read_write_OM.cc 中的单元测试,特别是WriteTriangleVertexBoolProperty 实现了一个示例,其中具有自定义属性的网格被保存到.om 文件中,然后再次从该文件中读取。对于上面的示例,它看起来像这样:

    // Flag property so it gets serialized.
    mesh.property(edge_pm.getRawProperty()).set_persistent(true);
    bool ok = OpenMesh::IO::write_mesh(mesh, "bar.om");
    

    从文件加载网格时,请务必先创建属性:

    Mesh new_mesh;
    auto new_edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew<
            OpenMesh::EPropHandleT<std::string> >(new_mesh, "edge_info");
    bool ok = OpenMesh::IO::read_mesh(new_mesh, "bar.om");
    

    之后应该恢复您的财产:

    std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl;
    // Should print "foo"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2014-04-03
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多