OpenMesh设置模型颜色并输出obj+mtl OpenMesh set_color()

本文主要讲的是如何在OpenMesh中对输出的模型进行着色,并输出obj+mtl文件。
OpenMesh中,可以对mesh的顶点、面片、边、半边等进行着色,步骤都大同小异,以下为面片着色为例。
首先,在OpenMesh中申请一下一块内存来存储颜色。因为我们一般read的obj模型是不带颜色空间的。
所以mesh.request_face_colors()
如果想使用其他着色方式,可以使用例如request_edge_colors()release_vertex_colors()或者request_halfedge_colors()
接着就可以使用set_color()函数对mesh进行颜色的赋值,我此处用的是面片着色,函数原型如下:

//--------------------------------------------------------------- face colors

  const Color& color(FaceHandle _fh) const
  { return this->property(face_colors_, _fh); }

  void set_color(FaceHandle _fh, const Color& _c)
  { this->property(face_colors_, _fh) = _c; }

其他着色方式的函数原型如下:

  //------------------------------------------------------------- halfedge colors
  
  const Color* halfedge_colors() const
  { return this->property(halfedge_colors_).data(); }
  
  const Color& color(HalfedgeHandle _heh) const
  { return this->property(halfedge_colors_, _heh); }
  
  void set_color(HalfedgeHandle _heh, const Color& _c)
  { this->property(halfedge_colors_, _heh) = _c; }
  //------------------------------------------------------------- edge colors
  
  const Color* edge_colors() const
  { return this->property(edge_colors_).data(); }
  
  const Color& color(EdgeHandle _eh) const
  { return this->property(edge_colors_, _eh); }
  
  void set_color(EdgeHandle _eh, const Color& _c)
  { this->property(edge_colors_, _eh) = _c; }
  
  //------------------------------------------------------------- vertex colors

  const Color* vertex_colors() const
  { return this->property(vertex_colors_).data(); }

  const Color& color(VertexHandle _vh) const
  { return this->property(vertex_colors_, _vh); }

  void set_color(VertexHandle _vh, const Color& _c)
  { this->property(vertex_colors_, _vh) = _c; }

将颜色赋值给Mesh后,就可以使用OpenMesh::IO::write_mesh函数对模型进行输出。需要注意的是,函数默认只有两个参数,分别是mesh和路径,想要将颜色输出,需要添加Options。下面是官方给出的Options的选项:

  • Options::VertexNormal
  • Options::VertexTexCoord
  • Options::VertexColor
  • Options::FaceNormal
  • Options::FaceColor
  • Options::FaceTexCoord
  • Options::ColorAlpha
  • Options::ColorFloat
  • Options::Custom

选择对应的参数即可,最后就可以生成一个.obj文件和一个.mat文件。
由于obj文件对应的材质文件是.mtl文件,所以这里需要手动把.mat的后缀改成.mtl,并在obj文件中也把mat改成mtl即可正常显示。
(还没有找到能直接生成mtl文件的办法)
下面附上完整代码(以面片着色为例)

//...
mesh.request_face_colors();
MeshTraits::Color c(0.67578125, 0.296875, 0.3515625, 1.);
for(const auto& fh : mesh.faces()){
    mesh.set_color(fh,c);
}
std::string output = "output.obj";
if(!OpenMesh::IO::write_mesh(mesh,output,OpenMesh::IO::Options::FaceColor)){
   std::cout<<"write error"<<endl;
}else{
   std::cout<<"write done"<<endl;
}
//
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES是一种针对移动设备的图形渲染API。它是OpenGL的子集,功能较为轻量化,适用于资源有限的移动设备平台。通过使用OpenGL ES,我们可以在移动设备上渲染2D和3D图形以及进行图形处理。 OBJObject)文件格式是一种常见的3D模型文件格式,它包含3D模型的几何信息和材质信息。OBJ文件通常由一组顶点坐标、法线向量和纹理坐标定义一个几何体,以及所需的材质属性。OBJ文件格式是一种简单易读的格式,被广泛用于3D建模软件和游戏引擎之间的模型交换。 MTL(Material)文件是与OBJ文件配套使用的,用于定义OBJ模型的材质属性。MTL文件包含了与模型相关的颜色、纹理和光照信息。MTL文件通常包括了材质的颜色值、贴图文件的路径,以及光照模型等。 在使用OpenGL ES加载OBJ模型时,我们需要解析OBJ文件和MTL文件获取模型的几何信息和材质属性。通过读取OBJ文件,我们可以获取到模型的顶点坐标、法线向量、纹理坐标等信息,并将其存储在OpenGL ES可用的数据结构中。同时,通过读取MTL文件,我们可以获取到与模型相关的材质属性,并在渲染过程中应用到模型上。 总结来说,OpenGL ES是一种移动设备上常用的图形渲染API,OBJ是一种常见的3D模型文件格式,MTL则是与OBJ文件配套使用的材质文件,它们可以在OpenGL ES中被用来加载3D模型并进行渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值