本文主要讲的是如何在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;
}
//