Meshlab导入obj文件

Meshlab导入obj文件

代码位于vcglib\wrap\io_trimesh(注:为Meshlab中vcg的源代码)
static int Open( OpenMeshType &m, const char * filename, Info &oi)

导入文件的流程

1.读取大致信息

if (oi.mask == 0)
   LoadMask(filename, oi);

meshlab在Open之前有单独调用LoadMask
大致流程如下:
1.获取文件长度,初始化各种标志
2.遍历每一行,统计顶点数量、法线数量、纹理坐标数量、面数量,同时修改部分标记量的值
3.根据统计的信息打开部分表计量,比如如果顶点数量与纹理坐标数量一致,打开IOM_VERTTEXCOORD标记等
接着将通过文件分析得到的mask与mesh本身设置的mask统一

Mask::ClampMask<OpenMeshType>(m,oi.mask);

读取点数据

1.根据点的数量分配内存

VertexIterator vi = vcg::tri::Allocator<OpenMeshType>::AddVertices(m,oi.numVertices);

2.解析以v开头的行,读取点的坐标信息,如果有颜色就读取颜色

读取纹理坐标数据

解析以vt开头的行,先将纹理坐标数据存放在临时的vector中std::vector<ObjTexCoord> texCoords;

解析法线数据

解析以vn开头的行,先将法线信息存放在临时的vector中std::vector<CoordType> normals

解析面信息

解析以f或者q开头的行,此处以常规的f为例,也就是TRIMESH mesh

相关数据结构:
1.std::vector<std::vector<vcg::Point3f> > polygonVect(1) 多边形容器
2.std::vector<int> indexVVect(vertexesPerFace)  顶点序号
3.std::vector<int> indexNVect(vertexesPerFace); 法线序号
4.std::vector<int> indexTVect(vertexesPerFace); 纹理坐标序号
5.std::vector<int> indexTriangulatedVect;       三角形序号
解析面数据的序号信息
//分别解析顶点  法线  纹理的序号
SplitToken(tokens[pi+1], indexVVect[pi],indexNVect[pi],indexTVect[pi], inputMask);
//确保序号正确
GoodObjIndex(indexVVect[pi],numVertices);
GoodObjIndex(indexTVect[pi],oi.numTexCoords);
//根据之前读取的定点数据获取顶点坐标
polygonVect[0][pi].Import(m.vert[indexVVect[pi]].cP());
三角化

根据面的定点数对面进行三角化,获取三角形的顶点序号。一般mesh数据是三个点,那么这种情况下只是简单的获取了序号

处理每个三角形

根据三角化之后的顶点序号处理每一个三角形

//首先获取面上每个点的顶点序号、纹理序号、法线序号
//三角化之后每个顶点的相对序号,也就是在当前面顶点中的序号
locInd[iii]=indexTriangulatedVect[pi+iii]; 
//根据相对序号获取绝对序号,也就是在所有顶点中的序号
ff.v[iii]=indexVVect[ locInd[iii] ];
ff.n[iii]=indexNVect[ locInd[iii] ];
ff.t[iii]=indexTVect[ locInd[iii] ];

获取面使用的纹理的序号

ff.tInd=materials[currentMaterialIdx].index;

判断顶点是否重复

if ((ff.v[0] == ff.v[1]) || (ff.v[0] == ff.v[2]) || (ff.v[1] == ff.v[2]))
将面信息添加到CMeshO

之前解析的面信息都在std::vector<ObjIndexedFace> indexedFaces中,所有的面解析完成之后,通过该容器创建面。

//分配内存
vcg::tri::Allocator<OpenMeshType>::AddFaces(m,numTriangles);
//填写面信息
for(unsigned int j=0;j<indexedFaces[i].v.size();++j)
    *******
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值