首页 > 其他分享 >[计算机图形学] OpenGL读取obj文件并显示其3D效果

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

时间:2023-04-03 23:05:23浏览次数:57  
标签:head obj OpenGL int double pic 图形学 vn

 

 

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

 读取三维网格模型(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<POINT3> V;//V:代表顶点。格式为V X Y Z,V后面的X Y Z表示三个顶点坐标。浮点型
24     vector<WenLi>  VT;//表示纹理坐标。格式为VT TU TV。浮点型
25     vector<FaXiangLiang> VN;//VN:法向量。每个三角形的三个顶点都要指定一个法向量。格式为VN NX NY NZ。浮点型
26     vector<Mian> 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()<2)continue;
12         if(s[0]=='v'){
13             if(s[1]=='t'){//vt 0.581151 0.979929 纹理
14                 istringstream in(s);
15                 vt=new WenLi();
16                 string head;
17                 in>>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<3)
43             {
44                 if(m_pic.V.size()!=0)
45                 {
46                     in>>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<m_pic.F.size();i++)
 4     {
 5         glBegin(GL_POINTS);                            // 绘制三角形GL_TRIANGLES;GL_LINE_LOOP;GL_LINES;GL_POINTS
 6         if(m_pic.VT.size()!=0)glTexCoord2f(m_pic.VT[m_pic.F[i].T[0]].TU,m_pic.VT[m_pic.F[i].T[0]].TV);  //纹理    
 7         if(m_pic.VN.size()!=0)glNormal3f(m_pic.VN[m_pic.F[i].N[0]].NX,m_pic.VN[m_pic.F[i].N[0]].NY,m_pic.VN[m_pic.F[i].N[0]].NZ);//法向量
 8         glVertex3f(m_pic.V[m_pic.F[i].V[0]].X/YU,m_pic.V[m_pic.F[i].V[0]].Y/YU, m_pic.V[m_pic.F[i].V[0]].Z/YU);        // 上顶点
 9         
10         if(m_pic.VT.size()!=0)glTexCoord2f(m_pic.VT[m_pic.F[i].T[1]].TU,m_pic.VT[m_pic.F[i].T[1]].TV);  //纹理
11         if(m_pic.VN.size()!=0)glNormal3f(m_pic.VN[m_pic.F[i].N[1]].NX,m_pic.VN[m_pic.F[i].N[1]].NY,m_pic.VN[m_pic.F[i].N[1]].NZ);//法向量
12         glVertex3f(m_pic.V[m_pic.F[i].V[1]].X/YU,m_pic.V[m_pic.F[i].V[1]].Y/YU, m_pic.V[m_pic.F[i].V[1]].Z/YU);        // 左下
13 
14         if(m_pic.VT.size()!=0)glTexCoord2f(m_pic.VT[m_pic.F[i].T[2]].TU,m_pic.VT[m_pic.F[i].T[2]].TV);  //纹理
15         if(m_pic.VN.size()!=0)glNormal3f(m_pic.VN[m_pic.F[i].N[2]].NX,m_pic.VN[m_pic.F[i].N[2]].NY,m_pic.VN[m_pic.F[i].N[2]].NZ);//法向量
16         glVertex3f(m_pic.V[m_pic.F[i].V[2]].X/YU,m_pic.V[m_pic.F[i].V[2]].Y/YU, m_pic.V[m_pic.F[i].V[2]].Z/YU);        // 右下
17         glEnd();// 三角形绘制结束    
18 
19 
20         /*if(m_pic.VN.size()!=0){
21             glBegin(GL_LINES);                            // 绘制三角形
22             glVertex3f(m_pic.V[m_pic.F[i].V[0]].X/YU,m_pic.V[m_pic.F[i].V[0]].Y/YU, m_pic.V[m_pic.F[i].V[0]].Z/YU);        // 上顶点
23             glVertex3f(m_pic.V[m_pic.F[i].V[0]].X/YU+m_pic.VN[m_pic.F[i].N[0]].NX
24                 ,m_pic.V[m_pic.F[i].V[0]].Y/YU+m_pic.VN[m_pic.F[i].N[0]].NY
25                 , m_pic.V[m_pic.F[i].V[0]].Z/YU+m_pic.VN[m_pic.F[i].N[0]].NZ);                    // 左下
26             glEnd();                                // 三角形绘制结束
27         }*/
28     }        
29 }

 

标签:head,obj,OpenGL,int,double,pic,图形学,vn
From: https://blog.51cto.com/u_14682436/6167682

相关文章

  • 驱动开发:探索DRIVER_OBJECT驱动对象
    本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些详细参数,例如驱动大小,驱动标志,驱动名,驱动节等等,每一个驱动程序都会存在这样的一个结构。首先来......
  • 【论文速递】ECCV2022 - PETR: Position Embedding Transformation for Multi-View 3D
    【论文原文】:PETR:用于多视图3D对象检测的位置嵌入变换论文:https://arxiv.org/abs/2203.05625代码:https://github.com/megvii-research/PETR博主关键词:小样本学习,语义分割,图注意力网络,互监督,目标检测,三维视觉摘要在本文中,我们开发了用于多视图3D对象检测的位置嵌入变换(PET......
  • OpenGL Mac开发-如何使用imgui(1.89.4)插件进行调试
    为了调试我们的OpenGLDemo,可以尝试使用一个成熟的开源GUI插件imgui。1,首先进入imgui在github上的地址。在Release中下载最近的版本,可以得到一个Zip压缩包。现在是2023年的4月1日,我下载到的版本是1.89.4,与Cherno的OpenGL教程中的代码略微有些区别。如果你看的是Cherno的教程,也......
  • 常用API(Math,System,Runtime,Object,Objects,BigInteger,BigDecimal,正则表达式)
    常用API(Math,System,Runtime,Object,Objects,BigInteger,BigDecimal,正则表达式)多使用帮助文档类型取值范围和默认值Math类:​ 概念:帮助我们进行数学计算的工具类,里面的方法都是静态的,所以无需实例化这个类​ 常用方法:​ abs::获取绝对值 absExact:获取绝对值 rou......
  • opengl在编译的过程中,glad使用
    我在编译的过程中,遇到:无法找到-lglad这个错误。最后才发现对于glad的使用不能用-glad。因为我们通过glad的在线服务可以得到一些文件,其中glad.c文件我们是需要放在我们的项目下面的。之后在编译的过程中使用下面这个命令:g++mian.cppglad.c-omain.exe这样,我们就可以使用......
  • objectARX环境配置指南 VS2019+AutoCad2023 (在VS中创建ARX项目指南)
    一、下载四个软件,缺一不可(注意版本对应,注意版本对应)VisualStudioAutoCadobjectARXSDKObjectARXWizards版本对应见下:有道云笔记(youdao.......
  • Uncaught ReferenceError: bobj is not defined
    创建好的水晶报表,报表没有生成。查看html代码,数据库的数据已经获取...按F12:出现如标题错误。看到此异常,想起来,是因为做少了一件事,即是需要把:C:\inetpub\wwwroot\的as......
  • error while loading shared libraries: libxxx.so: cannot open shared object file:
    发生这种问题就在于编译程序链接的库在运行时找不到,或者不存在,或者版本不正确等。使用ldd你的应用程序|grep-i"libxxx"来查看程序中具体链接的库的位置和版本号,然后查看......
  • Learning Objectives COMP 250
    Assignment3COMP250Winter2023posted:Thursday,March23,2023due:Thursday,April6,2023at11:59mLearningObjectivesBytheendofthisassignment,yo......
  • OpenGL环境搭建时遇到的问题
    前言 环境搭建流程貌似不是大问题,问题是中间遇到的问题背景 最近打算学习下OpenGL,遂开始按照教程搭建环境,昨天搭建了一天也没成功,差点就放弃了。环境Windows10 V......