《vcglib库的入坑体验(读取obj文件并显示)》一文不能显示obj的材质,这里提供一个:
#include <......>
using namespace std;
using namespace vcg;
class PEdge;
class PFace;
class PVertex;
struct PUsedTypes : public UsedTypes<Use<PVertex> ::AsVertexType,
Use<PEdge> ::AsEdgeType,
Use<PFace> ::AsFaceType> {};
class PVertex : public Vertex<PUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::Qualityf, vertex::Color4b, vertex::BitFlags > {};
class PEdge : public Edge< PUsedTypes, edge::VertexRef, edge::BitFlags> {};
class PFace :public vcg::Face<
PUsedTypes,
face::PolyInfo, // this is necessary if you use component in vcg/simplex/face/component_polygon.h
face::PFVAdj, // Pointer to the vertices (just like FVAdj )
face::Color4b,
face::BitFlags, // bit flags
face::Normal3f, // normal
face::WedgeTexCoord2f
> {};
class PMesh : public tri::TriMesh< vector<PVertex>, vector<PEdge>, vector<PFace> > {};
//入参:Obj名称
//返回:顶点坐标,顶点法线,顶点纹理坐标(按3个点成1个三角面,也即 glDrawArrays 样式排列)
// 顶点数量,材质图像文件名
void ImporterOBJ(char *ObjName, float*&vertex, float*&normal, float*&TexCoord, int &VertexNum, std::string & textureName)
{
clock_t t1 = clock();
PMesh m; //定义一个网格对象
int mask; //定义mask
//注意your filePath不能有中文路径
//vcg::tri::io::ImporterOBJ<GLMesh>::Open(m, filename, mask);
// 读取或写入 OBJ 文件的代码,参数 mask 为可选,mask 是返回参数:读入了哪些属性
int result = vcg::tri::io::ImporterOBJ<PMesh>::Open(m, ObjName, mask);
if (result != vcg::tri::io::ImporterOBJ<PMesh>::E_NOERROR) {
std::cout << "Load OBJ file ERROR: " << vcg::tri::io::ImporterOBJ<PMesh>::ErrorMsg(result) << std::endl;
}
///* 3 */ "Texture file not found",//从当前目录去读取 MTL 时发生,实际上还是会到OBJ文件目录去读取 MTL 的
//为每个点计算法线并归一化
vcg::tri::RequirePerVertexNormal(m);
vcg::tri::UpdateNormal<PMesh>::PerVertexNormalized(m);
printf("网格有: %i 个顶点和 %i 个面\n",