gpt4 book ai didi

c++ - 重新打开修改后的网格后的 OpenMesh 边索引

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:41 25 4
gpt4 key购买 nike

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

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

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

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

有没有不用重启的简单解决方案?例如,重新计算边缘索引的 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";

您可以使用 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");

之后你的属性(property)应该被恢复:

std::cout << new_edge_pm[new_mesh.edge_handle(23)] << std::endl;
// Should print "foo"

关于c++ - 重新打开修改后的网格后的 OpenMesh 边索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39632319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com