我修改了一个网格,并添加了一些边。
然后我将修改后的网格保存到.obj文件中。当我使用OpenMesh read函数打开这个.obj文件时,边的索引与我保存网格时的边的索引不同,因为.obj文件只有顶点和面的信息。
在保存修改后的网格时,我需要按边缘索引顺序保存一个额外的边缘信息文件。但是根据我上面提到的,顺序是不同的,所以重新打开修改后的网格后,边缘信息是错误的。
我有一个解决方案。我保存修改后的网格(旧网格),然后将保存的文件读取为新网格。按索引顺序检查新网格的每条边,并在旧网格中找到相同的边。然后,我可以按新网格的边缘索引顺序输出边缘信息。
有没有不需要重新打开的简单解决方案?例如,重新计算边缘索引的OpenMesh函数?
谢谢
发布于 2016-09-22 15:48:00
根据您所说的,我认为您可能正在使用(或者至少应该使用)一个自定义边缘属性来存储您的附加信息。理想情况是这样的:
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"https://stackoverflow.com/questions/39632319
复制相似问题