首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新打开修改后的网格后的OpenMesh边索引

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

Stack Overflow用户
提问于 2016-09-22 15:01:09
回答 1查看 173关注 0票数 2

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

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

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

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

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-09-22 15:48:00

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

代码语言:javascript
复制
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文件中,然后再次从该文件读取。对于上面的例子,它看起来像这样:

代码语言:javascript
复制
// Flag property so it gets serialized.
mesh.property(edge_pm.getRawProperty()).set_persistent(true);
bool ok = OpenMesh::IO::write_mesh(mesh, "bar.om");

从文件加载网格时,请确保首先创建属性:

代码语言:javascript
复制
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");

之后,你的财产应该被恢复:

代码语言:javascript
复制
std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl;
// Should print "foo"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39632319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档