OpenMesh 读写网格控制(读取写入纹理坐标,法向等)

时间:2022-02-03 01:43:28

OpenMesh读取网格默认是不自动读取obj网格中的法向,纹理坐标等信息的,写入网格同样也是。所以要读取(或写入)这些信息需要修改默认的选项。

先看一下其读写网格的函数

   template<class Mesh>
  bool OpenMesh::IO::read_mesh(
  Mesh &_mesh,
  const std::string &_filename,
  Options &_opt,
  bool _clear = true
  )
   template<class Mesh >
  bool OpenMesh::IO::write_mesh(
  const Mesh &_mesh,
  const std::string &_filename,
  Options _opt = Options::Default,
  std::streamsize _precision =
  )

函数中的参数 Options 就可以控制读写其他信息。

  • OpenMesh的IO::Options::Flag

在OpenMesh的官方文档中,有很多关于IO的options,更详细的内容请看这里  http://www.openmesh.org/media/Documentations/OpenMesh-Doc-Latest/a00231.html#details

    enum Flag
{
Default = 0x0000, Binary = 0x0001, MSB = 0x0002, LSB = 0x0004,
Swap = 0x0006, VertexNormal = 0x0010, VertexColor = 0x0020, VertexTexCoord = 0x0040,
EdgeColor = 0x0080, FaceNormal = 0x0100, FaceColor = 0x0200, FaceTexCoord = 0x0400,
ColorAlpha = 0x0800, ColorFloat = 0x1000, Custom = 0x2000
}

这些options可以让你自定义读取/写入网格。

  • OpenMesh 读网格

如果想要在读取obj网格的时候自动读取纹理坐标,只需要添加读取纹理坐标的option,注意在读取网格之前要先给纹理坐标分配内存,即 request_vertex_texcoords2D()。读取法向或其他信息也是一样。

     OpenMesh::IO::Options opt_read = 0x0040;   //选项控制读取纹理坐标
   ptr_mesh_->request_vertex_texcoords2D();
if ( !OpenMesh::IO::read_mesh(*ptr_mesh_, byfilename.data(), opt_read) )
{
std::cerr<< "Cannot Open mesh to file '1.obj'" << std::endl;
return;
}
  • OpenMesh 写网格

如果要想在写入网格时写入顶点的法向信息,也是同样的。

      OpenMesh::IO::Options opt_write = OpenMesh::IO::Options::VertexNormal;
if (!OpenMesh::IO::write_mesh(*ptr_mesh_, "mesh.obj", opt_write))
{
std::cerr << "Cannot Write mesh to file" << std::endl;
return;
}

如果要控制写入网格的数据精度,也很简单:

 OpenMesh::IO::write_mesh(*ptr_mesh_, "mesh.obj", opt_write,)