首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >断言block_size == b在读取OpenMesh文件时失败

断言block_size == b在读取OpenMesh文件时失败
EN

Stack Overflow用户
提问于 2018-03-15 14:37:45
回答 1查看 120关注 0票数 1

读取OpenMesh文件时

代码语言:javascript
复制
OpenMesh::EPropHandleT<bool> prop_feature_edge;
mesh.add_property(prop_feature_edge, "feature");
OpenMesh::IO::read_mesh(mesh, "testmesh.om");

我知道错误了

代码语言:javascript
复制
Assertion failed: block_size == b, file E:\JB\workspace\OpenMesh-Windows-Gitlab-master\c9e6b25f\src\OpenMesh\Core\IO\reader\OMReader.cc, line 564

我在源代码中查找了它,但并没有真正了解断言在那里检查的内容。这个问题可能与网格的不同属性是如何存储/加载有关的,但是错误消息并不能真正帮助我们发现出了什么问题。

注意,断言中的文件路径来自openmesh二进制文件,而不是我的项目路径。断言被定义为在这个源中

该文件是使用

代码语言:javascript
复制
OpenMesh::EPropHandleT<bool> prop_feature_edge;
mesh.add_property(prop_feature_edge, "feature");
mesh.property(prop_feature_edge).set_persistent(true);
OpenMesh::IO::write_mesh(mesh, "testmesh.om");

在我的测试用例中,我编写了网格并重新读取它,它失败了,所以在字节顺序、默认选项或库版本上没有区别。

相关Stacktrace:

代码语言:javascript
复制
    myProgram.exe!OpenMesh::IO::_OMReader_::restore_binary_custom_data(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::BaseProperty *,unsigned __int64,bool)    Unknown
    myProgram.exe!OpenMesh::IO::_OMReader_::read_binary_edge_chunk(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &,bool)   Unknown
    myProgram.exe!OpenMesh::IO::_OMReader_::read_binary(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)   Unknown
    myProgram.exe!OpenMesh::IO::_OMReader_::read(class std::basic_istream<char,struct std::char_traits<char> > &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)  Unknown
    myProgram.exe!OpenMesh::IO::_OMReader_::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &)  Unknown
    myProgram.exe!OpenMesh::IO::_IOManager_::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class OpenMesh::IO::BaseImporter &,class OpenMesh::IO::Options &) Unknown
    myProgram.exe!OpenMesh::IO::read_mesh<OpenMesh::TriMesh_ArrayKernelT<OpenMesh::DefaultTraits> >(OpenMesh::TriMesh_ArrayKernelT<OpenMesh::DefaultTraits> & _mesh, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _filename, OpenMesh::IO::Options & _opt, bool _clear) Line 141    C++
    myProgram.exe!main(int argc, char * * argv) Line 479    C++
    [External Code] 

因此,这看起来确实像是自定义属性中的一些错误的大小计算。我复制了代码,添加了自定义属性,并请求现有属性(如面部状态和顶点颜色)在读取网格之前编写网格,以确保具有相同的网格属性,并且仍然会崩溃。

比较配置网格的属性,它们似乎是相同的:

代码语言:javascript
复制
properties before writing
3 vprops:
  v:points
  <vprop>
  v:colors
1 hprops:
  <hprop>
2 eprops:
  <eprop>
  feature, persistent
2 fprops:
  <fprop>
  f:status
0 mprops:
#bytes written: 169006

properties before reading
3 vprops:
  v:points
  <vprop>
  v:colors
1 hprops:
  <hprop>
2 eprops:
  <eprop>
  feature, persistent
2 fprops:
  <fprop>
  f:status
0 mprops:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-16 13:00:25

我找到了解决问题的办法。

在写之前,我已经删除了面孔。这需要在faces上设置一个(非永久的)状态标志,它需要通过request_face_status()添加。

这样做很好,collect_garbage()正确地删除了脸,但是相应的边缘没有被删除。这会导致写入之前和加载后的边数不同,而存储的feature属性的大小可能与以前不匹配加载的边数。

解决方案是添加

代码语言:javascript
复制
mesh.request_edge_status()

除了mesh.request_face_status()。根据网格上的操作,使用mesh.request_vertex_status()也可能是个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49302295

复制
相关文章

相似问题

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