重新打开修改后的网格后的OpenMesh边缘索引

时间:2016-09-22 07:01:09

标签: c++ openmesh

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

然后我将修改过的网格保存到.obj文件中。当我使用OpenMesh读取函数打开此.obj文件时,边缘的索引与保存网格时的边缘索引不同,因为.obj文件仅包含有关顶点和面的信息。

保存修改过的网格时,我需要在边缘索引顺序中保存一个额外的边缘信息文件。但根据我上面提到的,顺序是不同的,所以重新打开修改过的网格后边缘信息是错误的。

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

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

由于

1 个答案:

答案 0 :(得分:2)

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

1. SELECT CONVERT(VARCHAR(10), GETDATE(), 102) AS [YYYY.MM.DD]
2. SELECT CONVERT(VARCHAR(10), GETDATE(), 111) AS [YYYY/MM/DD]
3. SELECT CONVERT(VARCHAR(10), GETDATE(), 120) AS [YYYY-MM-DD]
SELECT REPLACE(CONVERT(VARCHAR(10), GETDATE(), 111), '/', '-') AS [YYYY-MM-DD]

or

SELECT convert(varchar(25), getdate(), 121)  – yyyy-mm-dd hh:mm:ss.mmm

您可以使用OpenMesh的原生auto edge_pm = OpenMesh::makePropertyManagerFromExistingOrNew< OpenMesh::EPropHandleT<std::string> >(mesh, "edge_info"); // Set some random edge info. edge_pm[mesh.edge_handle(23)] = "foo"; 格式,该格式允许您存储自定义属性。看一下.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");