我修改了一个网格,并添加了一些边缘。
然后我将修改过的网格保存到.obj文件中。当我使用OpenMesh读取函数打开此.obj文件时,边缘的索引与保存网格时的边缘索引不同,因为.obj文件仅包含有关顶点和面的信息。
保存修改过的网格时,我需要在边缘索引顺序中保存一个额外的边缘信息文件。但根据我上面提到的,顺序是不同的,所以重新打开修改过的网格后边缘信息是错误的。
我有一个解决方案。我保存修改后的网格(旧网格),然后将保存的文件作为新网格读取。按索引顺序检查新网格的每个边缘,并在旧网格中找到相同的边。然后我可以以新网格的边缘索引顺序输出边缘信息。
有没有重新开放的简单解决方案?例如,一个重新计算边缘索引的OpenMesh函数?
由于
答案 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");