读取OpenMesh文件时
OpenMesh::EPropHandleT<bool> prop_feature_edge;
mesh.add_property(prop_feature_edge, "feature");
OpenMesh::IO::read_mesh(mesh, "testmesh.om");我知道错误了
Assertion failed: block_size == b, file E:\JB\workspace\OpenMesh-Windows-Gitlab-master\c9e6b25f\src\OpenMesh\Core\IO\reader\OMReader.cc, line 564我在源代码中查找了它,但并没有真正了解断言在那里检查的内容。这个问题可能与网格的不同属性是如何存储/加载有关的,但是错误消息并不能真正帮助我们发现出了什么问题。
注意,断言中的文件路径来自openmesh二进制文件,而不是我的项目路径。断言被定义为在这个源中。
该文件是使用
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:
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] 因此,这看起来确实像是自定义属性中的一些错误的大小计算。我复制了代码,添加了自定义属性,并请求现有属性(如面部状态和顶点颜色)在读取网格之前编写网格,以确保具有相同的网格属性,并且仍然会崩溃。
比较配置网格的属性,它们似乎是相同的:
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:发布于 2018-03-16 13:00:25
我找到了解决问题的办法。
在写之前,我已经删除了面孔。这需要在faces上设置一个(非永久的)状态标志,它需要通过request_face_status()添加。
这样做很好,collect_garbage()正确地删除了脸,但是相应的边缘没有被删除。这会导致写入之前和加载后的边数不同,而存储的feature属性的大小可能与以前不匹配加载的边数。
解决方案是添加
mesh.request_edge_status()除了mesh.request_face_status()。根据网格上的操作,使用mesh.request_vertex_status()也可能是个好主意。
https://stackoverflow.com/questions/49302295
复制相似问题