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

时间:2022-12-16 21:59:24

[计算机图形学] 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图形的信息:

 struct POINT3{
double X;
double Y;
double Z;
};
struct WenLi{
double TU;
double TV;
};
struct FaXiangLiang{
double NX;
double NY;
double NZ;
};
struct Mian{
int V[];
int T[];
int N[];
};
class PIC
{
public:
vector<POINT3> V;//V:代表顶点。格式为V X Y Z,V后面的X Y Z表示三个顶点坐标。浮点型
vector<WenLi> VT;//表示纹理坐标。格式为VT TU TV。浮点型
vector<FaXiangLiang> VN;//VN:法向量。每个三角形的三个顶点都要指定一个法向量。格式为VN NX NY NZ。浮点型
vector<Mian> F;//F:面。面后面跟着的整型值分别是属于这个面的顶点、纹理坐标、法向量的索引。
//面的格式为:f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3
};

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

 void CMainWnd::ReadPIC()
{
ifstream ifs(name);//cube bunny Eight
string s;
Mian *f;
POINT3 *v;
FaXiangLiang *vn;
WenLi *vt;
while(getline(ifs,s))
{
if(s.length()<)continue;
if(s[]=='v'){
if(s[]=='t'){//vt 0.581151 0.979929 纹理
istringstream in(s);
vt=new WenLi();
string head;
in>>head>>vt->TU>>vt->TV;
m_pic.VT.push_back(*vt);
}else if(s[]=='n'){//vn 0.637005 -0.0421857 0.769705 法向量
istringstream in(s);
vn=new FaXiangLiang();
string head;
in>>head>>vn->NX>>vn->NY>>vn->NZ;
m_pic.VN.push_back(*vn);
}else{//v -53.0413 158.84 -135.806 点
istringstream in(s);
v=new POINT3();
string head;
in>>head>>v->X>>v->Y>>v->Z;
m_pic.V.push_back(*v);
}
}
else if(s[]=='f'){//f 2443//2656 2442//2656 2444//2656 面
for(int k=s.size()-;k>=;k--){
if(s[k]=='/')s[k]=' ';
}
istringstream in(s);
f=new Mian();
string head;
in>>head;
int i=;
while(i<)
{
if(m_pic.V.size()!=)
{
in>>f->V[i];
f->V[i]-=;
}
if(m_pic.VT.size()!=)
{
in>>f->T[i];
f->T[i]-=;
}
if(m_pic.VN.size()!=)
{
in>>f->N[i];
f->N[i]-=;
}
i++;
}
m_pic.F.push_back(*f);
}
}
}

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

 void CMainWnd::GLCube()
{
for(int i=;i<m_pic.F.size();i++)
{
glBegin(GL_POINTS); // 绘制三角形GL_TRIANGLES;GL_LINE_LOOP;GL_LINES;GL_POINTS
if(m_pic.VT.size()!=)glTexCoord2f(m_pic.VT[m_pic.F[i].T[]].TU,m_pic.VT[m_pic.F[i].T[]].TV); //纹理
if(m_pic.VN.size()!=)glNormal3f(m_pic.VN[m_pic.F[i].N[]].NX,m_pic.VN[m_pic.F[i].N[]].NY,m_pic.VN[m_pic.F[i].N[]].NZ);//法向量
glVertex3f(m_pic.V[m_pic.F[i].V[]].X/YU,m_pic.V[m_pic.F[i].V[]].Y/YU, m_pic.V[m_pic.F[i].V[]].Z/YU); // 上顶点 if(m_pic.VT.size()!=)glTexCoord2f(m_pic.VT[m_pic.F[i].T[]].TU,m_pic.VT[m_pic.F[i].T[]].TV); //纹理
if(m_pic.VN.size()!=)glNormal3f(m_pic.VN[m_pic.F[i].N[]].NX,m_pic.VN[m_pic.F[i].N[]].NY,m_pic.VN[m_pic.F[i].N[]].NZ);//法向量
glVertex3f(m_pic.V[m_pic.F[i].V[]].X/YU,m_pic.V[m_pic.F[i].V[]].Y/YU, m_pic.V[m_pic.F[i].V[]].Z/YU); // 左下 if(m_pic.VT.size()!=)glTexCoord2f(m_pic.VT[m_pic.F[i].T[]].TU,m_pic.VT[m_pic.F[i].T[]].TV); //纹理
if(m_pic.VN.size()!=)glNormal3f(m_pic.VN[m_pic.F[i].N[]].NX,m_pic.VN[m_pic.F[i].N[]].NY,m_pic.VN[m_pic.F[i].N[]].NZ);//法向量
glVertex3f(m_pic.V[m_pic.F[i].V[]].X/YU,m_pic.V[m_pic.F[i].V[]].Y/YU, m_pic.V[m_pic.F[i].V[]].Z/YU); // 右下
glEnd();// 三角形绘制结束 /*if(m_pic.VN.size()!=0){
glBegin(GL_LINES); // 绘制三角形
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); // 上顶点
glVertex3f(m_pic.V[m_pic.F[i].V[0]].X/YU+m_pic.VN[m_pic.F[i].N[0]].NX
,m_pic.V[m_pic.F[i].V[0]].Y/YU+m_pic.VN[m_pic.F[i].N[0]].NY
, m_pic.V[m_pic.F[i].V[0]].Z/YU+m_pic.VN[m_pic.F[i].N[0]].NZ); // 左下
glEnd(); // 三角形绘制结束
}*/
}
}

链接

本文链接:http://www.cnblogs.com/zjutlitao/p/4187529.html

本文github: https://github.com/beautifulzzzz/OpenGL/tree/master/TuXing

更多精彩:http://www.cnblogs.com/zjutlitao/p/4125085.html

[计算机图形学] OpenGL读取obj文件并显示其3D效果的更多相关文章

  1. 读取obj文件用Mesh创建实例化

    using UnityEngine; using System.Collections; using System.IO; using System.Collections.Generic; usin ...

  2. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  3. 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具

    opengl  计算机图形学 第三版   第二部分   第三章更多的绘图工具 3.1   概述 第2章中  我们绘图使用的是屏幕窗口的基础坐标系    以像素为单位 屏幕坐标从左下角x从0延伸到scr ...

  4. &lbrack;PHP&rsqb; 读取大文件并显示

    使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据 PHP代码: <?php class Test{ //日志路径 const LOG_PATH=& ...

  5. 图形学基础 &vert; 实现OBJ文件的载入

    1. tiny_obj_loader.h 的使用include这个头文件需要先定义一个宏 #define TINYOBJLOADER_IMPLEMENTATION#include "tiny ...

  6. matlab读取csv文件并显示

    传统的方式可以通过读取文件,然后处理字符串的方式对csv文件进行解析,在matlab中可以通过csvread函数读取csv文件,然后通过plot对数据进行显示,也可以对里面的函数进行分析: csv文件 ...

  7. 计算机图形学——OpenGL开发库开发库

    vc++6.0 有 OpenGL 的东西.有头文件 GL.H, GLAUX.H, GLU.H 但没有 GLUT 软件包/工具包 如果想使用glut.h的话必须自己添加. 首先下载 OpenGL开发库, ...

  8. 计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 &period;&lpar;转&rpar;

    单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素 ...

  9. GeoTools介绍、环境安装、读取shp文件并显示

    GeoTools是一个开放源代码(LGPL)Java代码库,它提供了符合标准的方法来处理地理空间数据,例如实现地理信息系统(GIS).GeoTools库实现了开放地理空间联盟(OGC)规范. Geot ...

随机推荐

  1. svn sync主从同步学习

    svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync.  优缺点分析============== 第一种svnadmin dump是官方推荐 ...

  2. js②

    操作符 ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号).位操作符.关系操作符和相等操作符. 一元操作符 递增和递减操作符(++ --) 一元加和减操作符 对非数值应用 ...

  3. 深入Spring IOC源码之ResourceLoader

    在<深入Spring IOC源码之Resource>中已经详细介绍了Spring中Resource的抽象,Resource接口有很多实现类,我们当然可以使用各自的构造函数创建符合需求的Re ...

  4. c&sol;c&plus;&plus; main函数执行之前&sol;后

    转载自:http://bbs.csdn.net/topics/300103318#r_78088969 main函数之前--真正的函数执行入口或开始 一种解释: 实际上,在可执行文件被加载之后,控制权 ...

  5. JSP&plus;Servlet&plus;JavaBean

    MVC是三个单词的缩写:M,Model(模型):V,View( 视图 ),C,Control(控制). MVC模式的目的就是实现Web系统的职能分工, Model层:实现系统的业务逻辑,即javaBe ...

  6. NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化

    转载▼     在iOS  5 中,苹果引入了一个解析JSON串的NSJSONSerialization类. 通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. ...

  7. android studio依赖库工程Activity显示问题及库工程设置

    android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: s ...

  8. 单双引号的区别,defined容易疏忽的小地方

    单双引号的区别(面试题)                    1.双引号可以解析变量,单引号不行                    2.双引号解析转义字符,单引号不解析转义字符.但是单引号能解析 ...

  9. 全民抵制&OpenCurlyDoubleQuote;辱华”品牌秀,D&amp&semi;G神回复:呵呵~ 那不是我!

    ### 补发一下,前写天写的: 就在今天下午,有网友爆出知名品牌 Dolce&Gabbana(杜嘉班纳)的设计师兼创始人Stefano Gabbana在ins上公然发表辱华言论. 下面截图 可 ...

  10. pycharm clion phpstorn全家桶激活码(可以用到2019年4月)

    SXXI7H41YN-eyJsaWNlbnNlSWQiOiJTWFhJN0g0MVlOIiwibGljZW5zZWVOYW1lIjoicGF5bmUgd2FuZyIsImFzc2lnbmVlTmFtZ ...