基于OpenGL的OBJ文件显示

上传人:野鹰 文档编号:46147470 上传时间:2018-06-22 格式:PPTX 页数:11 大小:228.38KB
返回 下载 相关 举报
基于OpenGL的OBJ文件显示_第1页
第1页 / 共11页
基于OpenGL的OBJ文件显示_第2页
第2页 / 共11页
基于OpenGL的OBJ文件显示_第3页
第3页 / 共11页
基于OpenGL的OBJ文件显示_第4页
第4页 / 共11页
基于OpenGL的OBJ文件显示_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《基于OpenGL的OBJ文件显示》由会员分享,可在线阅读,更多相关《基于OpenGL的OBJ文件显示(11页珍藏版)》请在金锄头文库上搜索。

1、VC环境下实现基于OpenGL的OBJ文件显示1.OBJ1.OBJ文件的特点文件的特点 2.OpenGL2.OpenGL概述概述 3.3.基于基于VCVC的实现读取的实现读取OBJ文件的特点OBJ文件的特点OBJOBJ文件本质是一个文本文件,是程序编辑过程中生成的一种文件本质是一个文本文件,是程序编辑过程中生成的一种 中间代码文件。它是基于工作站的中间代码文件。它是基于工作站的3D3D建模建模.3D .3D Max,Maya,LightWaveMax,Maya,LightWave等三维软件都支持等三维软件都支持OBJOBJ文件的生成和读文件的生成和读 写。写。 OBJ OBJ 文件不包含面的颜

2、色定义信息,不过可以引用材质库,材文件不包含面的颜色定义信息,不过可以引用材质库,材 质库信息储存在一个后缀是质库信息储存在一个后缀是“. “.mtlmtl“ “的独立文件中。的独立文件中。材质库中包含材质的漫射材质库中包含材质的漫射(diffuse)(diffuse),环境,环境(ambient)(ambient),光泽,光泽 ( (specularspecular) )的的 RGB( RGB(红绿蓝红绿蓝) )的定义值,以及反射的定义值,以及反射( (specularityspecularity) ), 折射折射(refraction)(refraction),透明度,透明度(transp

3、arency)(transparency)等其它特征等其它特征。OBJ文件的特点顶点数据(顶点数据(Vertex dataVertex data):): v v:几何体顶点:几何体顶点(Geometric vertices)(Geometric vertices)。 表示本行指定一个顶点。表示本行指定一个顶点。 此前缀后跟着此前缀后跟着 3 3 个单个单 精度浮点数,分别表示该定点的精度浮点数,分别表示该定点的 X X、Y Y、Z Z 坐标值。坐标值。 VtVt:贴图坐标点:贴图坐标点(Texture vertices)(Texture vertices)。 表示本行指定一个纹理坐标。表示本行

4、指定一个纹理坐标。 此前缀后跟着两个此前缀后跟着两个 单精度浮点数,分别表示此纹理坐标的单精度浮点数,分别表示此纹理坐标的 U U、V V 值。值。 VnVn:顶点法线:顶点法线(Vertex (Vertex normalsnormals) )。 表示本行指定一个法线向量。表示本行指定一个法线向量。 此前缀后跟着此前缀后跟着 3 3 个单个单 精度浮点数,分别表示该法向量的精度浮点数,分别表示该法向量的 X X、Y Y、Z Z 坐标值。坐标值。元素元素(Elements):(Elements):P P:点:点(Point)(Point) L L:线:线(Line)(Line) F F:面:面(

5、Face)(Face) CurvCurv:曲线:曲线(Curve)(Curve) surfsurf:表面:表面(Surface)(Surface)成组成组(Grouping):(Grouping):g g 组名称组名称 (Group name) (Group name) s s 光滑组光滑组 (Smoothing group) (Smoothing group) mg mg 合并组合并组 (Merging group) (Merging group) o o 对象名称对象名称 (Object name) (Object name) OBJ的索引特点OpenGL概述OpenGLOpenGL是一种

6、基于是一种基于C/SC/S和管道的图形库,即一个客户端(用和管道的图形库,即一个客户端(用OpenGLOpenGL绘制景绘制景 物的应用程序)将各种命令和数据写入管道,命令和数据被暂时保存起来,物的应用程序)将各种命令和数据写入管道,命令和数据被暂时保存起来, 当服务器(当服务器(OpenGLOpenGL内核)接收到专门的指令时开始处理他们,并将处理结内核)接收到专门的指令时开始处理他们,并将处理结 果通过管道传给用户。所以果通过管道传给用户。所以OpenGLOpenGL的基本结构是建立管道,根据需要向的基本结构是建立管道,根据需要向 管管 道中写入数据和指令,关闭管道。道中写入数据和指令,关

7、闭管道。 建立管道:获取一个可用的着色描述表建立管道:获取一个可用的着色描述表RCRC(RenderContextRenderContext), ,而在而在 WindowsWindows的的GDIGDI系统中进行图形显示则是通过图形设备描述表系统中进行图形显示则是通过图形设备描述表DCDC( DeviceContextDeviceContext)进行的。)进行的。 由于由于OpenGLOpenGL作图是通过作图是通过RCRC完成的,因此在创建完成的,因此在创建RCRC时必须与一个时必须与一个DCDC建立联建立联 系,这样,系,这样,OpenGLOpenGL函数就可以通过该函数就可以通过该DCD

8、C画到相应的设备上了。所以,利用画到相应的设备上了。所以,利用 OpenGLOpenGL编程的主要步骤为:加入头文件;创建编程的主要步骤为:加入头文件;创建RCRC;绘制、显示三维图形;绘制、显示三维图形; 删除删除RCRC。OpenGL概述OpenGLOpenGL首先将物体转化为可以描述物体几何性质的顶点首先将物体转化为可以描述物体几何性质的顶点 (Vertex)(Vertex)与描述图像与描述图像 的像素的像素 (Pixel) ,(Pixel) ,在执行一系列操作后在执行一系列操作后 , ,最终将这些数据转化成像素数据最终将这些数据转化成像素数据. . 也就是也就是 说说 ,OpenGL,

9、OpenGL是基于点的是基于点的. . 顶点数据首先进行转换和光照顶点数据首先进行转换和光照 , ,然后进行光栅化形成然后进行光栅化形成 图形片元图形片元. . 对于像素数据对于像素数据 , ,像素操作结果被存储在纹理组装用的内存中像素操作结果被存储在纹理组装用的内存中 , ,再像几再像几 何顶点操作一样光栅化形成图形片元何顶点操作一样光栅化形成图形片元. . 整个流程操作的最后整个流程操作的最后 , ,要逐个针对片元要逐个针对片元 进行一系列的操作进行一系列的操作 , ,最后将创建的图像送入帧缓冲区实现图形的显示最后将创建的图像送入帧缓冲区实现图形的显示. .基于VC的实现读取 OBJ OB

10、J 文件的导入文件的导入 要实现程序对模型文件内容的读取,需要为程序建要实现程序对模型文件内容的读取,需要为程序建 立相应的数据结构来。立相应的数据结构来。 由于每个由于每个 OBJ OBJ 文件中的点文件中的点 的个数,面的个数都是不同的,少的几十个几百个的个数,面的个数都是不同的,少的几十个几百个 多的几十万个。因此要选取合适的方便存取的数据多的几十万个。因此要选取合适的方便存取的数据结构来存储这个点和面,选用结构来存储这个点和面,选用 Vector Vector 容器。容器。声明一个声明一个 CMeshVertexCMeshVertex 类来存储坐标点的相关信类来存储坐标点的相关信 息,

11、息, 包括坐标、法向量、纹理坐标,然后以包括坐标、法向量、纹理坐标,然后以 CMeshVertexCMeshVertex 为模板声明一个为模板声明一个 vertices vertices 数据类型数据类型 来存放从来存放从 OBJ OBJ 模型文件中导入的坐标点的各项信模型文件中导入的坐标点的各项信 息。息。对对 CMeshVertexCMeshVertex 的声明代码如下:的声明代码如下: SetPositionSetPosition() ()设置当前点的三个坐标设置当前点的三个坐标 SetNormalSetNormal() ()设置当前点的法线设置当前点的法线 SetTexCoordSet

12、TexCoord() () 设置纹理坐标设置纹理坐标再用一个再用一个 for for 循环来处理循环来处理 OBJ OBJ 模型文件中的所有模型文件中的所有 的文本行,将坐标点、面和相关的坐标、法线、纹的文本行,将坐标点、面和相关的坐标、法线、纹 理坐标信息存到上面声明的数据结构中。理坐标信息存到上面声明的数据结构中。基于VC的实现读取OBJ OBJ 模型的显示模型的显示 OBJ OBJ 文件导入文件导入 OpenGL OpenGL 程序之中后,即可利用程序之中后,即可利用 OpenGL OpenGL 强大的图形强大的图形 输出功能来将这个输出功能来将这个 OBJ OBJ 模型显示出来。由于模

13、型显示出来。由于 OBJ OBJ 模型文件包含的顶模型文件包含的顶 点数据一般来说非常多,点数据一般来说非常多, 为了提升为了提升 OpenGL OpenGL 的渲染速度和性能,使的渲染速度和性能,使 用顶点数组来渲染几何体。用顶点数组来渲染几何体。利用顶点数组实现显示文件包括三个步骤:利用顶点数组实现显示文件包括三个步骤:Step 1Step 1 启用数组启用数组 。最多启用。最多启用 8 8 个数组,它们用于存储不同类型的数据:顶点个数组,它们用于存储不同类型的数据:顶点 坐标、面法线、坐标、面法线、RGBA RGBA 颜色、辅助颜色、颜色索引、雾坐标、纹理坐颜色、辅助颜色、颜色索引、雾坐

14、标、纹理坐 标和多边行边界边标记。标和多边行边界边标记。 glEnableClientStateglEnableClientState( (GLenumGLenum array) array)启用指定的数组。启用指定的数组。 glDisableClientStateglDisableClientState( (GLenumGLenum array) array)函数来禁用指定的数组。函数来禁用指定的数组。基于VC的实现读取Step2Step2 将数据存入数组中。将数据存入数组中。 对数组的存取是根据它们在内存单元地址对数组的存取是根据它们在内存单元地址 (即指向内存单元的指针)进行的。(即指向

15、内存单元的指针)进行的。 在客户端在客户端/ /服务器模式下,服务器模式下, 数据存储在客户的地址空间中。数据存储在客户的地址空间中。 用于指定数组数据的函数也有用于指定数组数据的函数也有 对应的对应的 8 8 个:个: glVertexPointerglVertexPointer() () glColorPointerglColorPointer() () glSecondaryColorPointerglSecondaryColorPointer() () glIndexPointer,glnormalPointerglIndexPointer,glnormalPointer() () g

16、lFogCoordPointerglFogCoordPointer() () glTexCoordPointerglTexCoordPointer() () glEdgeFlagPointerglEdgeFlagPointer() ()基于VC的实现读取Step 3Step 3 使用数据来绘制几何体。使用数据来绘制几何体。OpenGL OpenGL 通过对指针解除引用来获得被启用通过对指针解除引用来获得被启用 的数组中的数据。的数组中的数据。glArrayElementglArrayElement( (GLintGLint i i) )获得所有被启用的数组中的第获得所有被启用的数组中的第 i i 个顶点的数个顶点的数 据。据。获得数据后就可以用获得数据后就可以用glDrawArrayglDrawArray() ()来把指定的数组中的顶点绘制出来来把指定的数组

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号