查看: 1664|回复: 2

关于读取obj模型再纹理映射

[复制链接]

该用户从未签到

发表于 2013-7-2 15:22:47 | 显示全部楼层 |阅读模式
本帖最后由 一大波蓝猫 于 2013-7-2 15:28 编辑

读取了一个obj文件 获得点云坐标和面的信息 有对应的彩色图像 还有点的索引(即纹理坐标) 然后用如下代码进行纹理映射 因为三角网格比较粗糙 有地方没有三角形 所以纹理映射的结果 有空洞 请问如何能把这些洞也补上 就是用响应的彩色图像填充上呢 求指导 谢谢
  1.         ifstream objFile("./data/triangle.obj");
  2.         string strLine;
  3.         string s1;
  4.         float xin, yin, zin;
  5.         int v1, v2, v3;
  6.         int temp = 0, tempMap = 0, nTri = 0;
  7.         geometry->setVertexArray(triVertexs);        //设置顶点数组
  8.         geometry->setTexCoordArray(0, tc.get());                //设置纹理坐标数组
  9.         geometry->setNormalArray(nc.get());
  10.         geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
  11.         while(getline(objFile, strLine)){
  12.                 if(strLine[0] == 'v'){        //读取点云数据
  13.                         temp++;
  14.                         stringstream sin(strLine);
  15.                         sin>>s1>>xin>>yin>>zin;
  16.                         //读点云的索引
  17.                         if(xin != 0.0 || yin != 0.0 || zin != 0.0){
  18.                                 pointCloudMap.insert(pair<osg::Vec3, int>(osg::Vec3(xin, yin, zin), pointCloudIndex[tempMap]));
  19.                                 coords->push_back(osg::Vec3(xin, yin, zin));        //设置点云坐标
  20.                                 int texIndex = vertexIndex[tempMap] - 1;
  21.                                 objIndexMap.insert(pair<int, osg::Vec3>(vertexIndex[tempMap], osg::Vec3(xin, yin, zin)));
  22.                                 tempMap++;
  23.                         }
  24.                 }else if(strLine[0] == 'f'){        //读取拓扑连接关系
  25.                         stringstream sin(strLine);
  26.                         sin>>s1>>v1>>v2>>v3;
  27.                         triVertexs->push_back(objIndexMap[v1]);
  28.                         triVertexs->push_back(objIndexMap[v2]);
  29.                         triVertexs->push_back(objIndexMap[v3]);
  30.                         int i1 = pointCloudMap[objIndexMap[v1]];
  31.                         int i2 = pointCloudMap[objIndexMap[v2]];
  32.                         int i3 = pointCloudMap[objIndexMap[v3]];
  33.                         tc->push_back(osg::Vec2(i1%(int)width, (int)height-1-(int)(i1/width)));        //设置纹理坐标
  34.                         tc->push_back(osg::Vec2(i2%(int)width, (int)height-1-(int)(i2/width)));
  35.                         tc->push_back(osg::Vec2(i3%(int)width, (int)height-1-(int)(i3/width)));
  36.                         geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,nTri*3,3));//添加三角形
  37.                         nTri++;
  38.                 }
  39.         }
  40.         objFile.close();
复制代码
运行效果如图
网格有大洞.jpg

该用户从未签到

发表于 2013-7-4 16:51:15 | 显示全部楼层
先从补模型,空洞处要有图元,纹理贴图就自动有了

该用户从未签到

 楼主| 发表于 2013-7-4 17:04:50 | 显示全部楼层
fenma3422 发表于 2013-7-4 16:51
先从补模型,空洞处要有图元,纹理贴图就自动有了

明白了。。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表