[计算机图形学] OpenGL读取obj文件并显示其3D效果 您所在的位置:网站首页 3dmax模型只显示线条 [计算机图形学] OpenGL读取obj文件并显示其3D效果

[计算机图形学] OpenGL读取obj文件并显示其3D效果

2023-04-07 13:00| 来源: 网络整理| 查看: 265

[计算机图形学] OpenGL读取obj文件并显示其3D效果 精选 原创

TwcatL_tree 2023-04-03 22:06:58 ©著作权

文章标签 浮点型 i++ 3D 文章分类 JavaScript 前端开发 yyds干货盘点

©著作权归作者所有:来自51CTO博客作者TwcatL_tree的原创作品,请联系作者获取转载授权,否则将追究法律责任

 

 

[计算机图形学] OpenGL读取obj文件并显示其3D效果_i++

 读取三维网格模型(Wavefront OBJ文件)

无法向立方体:cube.obj

有法向兔子模型:bunny.obj

有法向有纹理八字模型:Eight.obj

OBJ文件的格式可参考:http://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html

 利用OpenGL显示该模型的绘制效果(全部)

顶点显示

线条显示

面片显示

 核心代码说说

1、下面的点、纹理、法向量、面用于构成一个PIC的类,PIC用于存储从OBJ文件中读取的3D图形的信息:

1 struct POINT3{ 2 double X; 3 double Y; 4 double Z; 5 }; 6 struct WenLi{ 7 double TU; 8 double TV; 9 }; 10 struct FaXiangLiang{ 11 double NX; 12 double NY; 13 double NZ; 14 }; 15 struct Mian{ 16 int V[3]; 17 int T[3]; 18 int N[3]; 19 }; 20 class PIC 21 { 22 public: 23 vector V;//V:代表顶点。格式为V X Y Z,V后面的X Y Z表示三个顶点坐标。浮点型 24 vector VT;//表示纹理坐标。格式为VT TU TV。浮点型 25 vector VN;//VN:法向量。每个三角形的三个顶点都要指定一个法向量。格式为VN NX NY NZ。浮点型 26 vector F;//F:面。面后面跟着的整型值分别是属于这个面的顶点、纹理坐标、法向量的索引。 27 //面的格式为:f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3 28 };

2、下面函数用于读取obj文件并将信息保存在PIC实例的对象中:

1 void CMainWnd::ReadPIC() 2 { 3 ifstream ifs(name);//cube bunny Eight 4 string s; 5 Mian *f; 6 POINT3 *v; 7 FaXiangLiang *vn; 8 WenLi *vt; 9 while(getline(ifs,s)) 10 { 11 if(s.length()>head>>vt->TU>>vt->TV; 18 m_pic.VT.push_back(*vt); 19 }else if(s[1]=='n'){//vn 0.637005 -0.0421857 0.769705 法向量 20 istringstream in(s); 21 vn=new FaXiangLiang(); 22 string head; 23 in>>head>>vn->NX>>vn->NY>>vn->NZ; 24 m_pic.VN.push_back(*vn); 25 }else{//v -53.0413 158.84 -135.806 点 26 istringstream in(s); 27 v=new POINT3(); 28 string head; 29 in>>head>>v->X>>v->Y>>v->Z; 30 m_pic.V.push_back(*v); 31 } 32 } 33 else if(s[0]=='f'){//f 2443//2656 2442//2656 2444//2656 面 34 for(int k=s.size()-1;k>=0;k--){ 35 if(s[k]=='/')s[k]=' '; 36 } 37 istringstream in(s); 38 f=new Mian(); 39 string head; 40 in>>head; 41 int i=0; 42 while(i>f->V[i]; 47 f->V[i]-=1; 48 } 49 if(m_pic.VT.size()!=0) 50 { 51 in>>f->T[i]; 52 f->T[i]-=1; 53 } 54 if(m_pic.VN.size()!=0) 55 { 56 in>>f->N[i]; 57 f->N[i]-=1; 58 } 59 i++; 60 } 61 m_pic.F.push_back(*f); 62 } 63 } 64 }

3、下面函数用于根据保存在obj中图形利用openGL中的函数绘制出来:

1 void CMainWnd::GLCube() 2 { 3 for(int i=0;i 收藏 评论 分享 举报

上一篇:TACACS+和RADIUS这两种协议间的差异

下一篇:配置OSPF发布聚合路由



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有