2

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

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

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

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

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

谢谢

4

1 回答 1

2

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

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"
于 2016-09-22T07:48:00.300 回答