基于VC和OpenGL的OBJ人脸模型的读取与交互操作_第1页
基于VC和OpenGL的OBJ人脸模型的读取与交互操作_第2页
基于VC和OpenGL的OBJ人脸模型的读取与交互操作_第3页
基于VC和OpenGL的OBJ人脸模型的读取与交互操作_第4页
基于VC和OpenGL的OBJ人脸模型的读取与交互操作_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于vc卄和opengl的obj人脸模型的读取与交互操作基于0pengl和obj模型文件格式的研究,本文实现了在 opengl中obj人脸模型的读取与显示及相关交互操作。重点 介绍了 obj文件的文件格式及如何利用opengl来构建模型、 绘制模型,同时,利用opengl的强大功能来实现三维显示 和交互操作,并应用于人体三维建模、地形建模以及虚拟现 实等领域。【关键词】三维模型opengl obj文件1概述opengl由sgi公司的iris gl发展而来。最初iris gl 是个2d函数库,逐渐发展到高级3d编程apr对iris gl 移植性进行了改进便产生了 opengl,由于opengl开

2、放的缘 故,得到各大硬件厂商支持,发展很好o opengl有两个含义, 其一:是一个3d图形编程api,其二:是一个彳亍业标准,使 得硬件厂商在opengl标准的约束下能够得到很好的支持和 发展。opengl即开放图形库,是一个开放的三维图形软件接 口,以opengl为基础的应用程序可能方便地在各个平台间 移植;同时,opengl可以和visual c+语言协同工作,对 于实现图形算法带来了便捷;并且,opengl效率高、便于使用,因此opengl得到了广泛的应用。2 oej文件简介obj文件是alias公司开发的一种三维动画软件的数据 输出类型,其定义了对象的几何特性。鉴于其文件结构的简 单

3、,因此,应用于应用程序过程中的读取等操作。0bj3.0e5格式不仅仅支持多边形、直线、表面,也可以定义自由形态曲线。多边形模型是用点、线、面等基本元 素来构造,而自由曲面模型则是使用参数曲面来定义的。下 面是某个obj模型内容的一小部分:v -0. 770000 -0.320000 17.639999 v 2.040000 0. 140000 16.400000v 0.990000 2.200000 17.139999 vn -0.011452 -0. 343559 0. 939061vn 0.818583 -0. 103764 0. 564938vn 0.426133 0.472201 0.

4、771646从上面展示的数据可知,obj文件内容是由一些文本行 组成的,每一行文本第一个字都是文件关键字,如"v”、“vn”等等,而后面的数据则是该关键字所表示含义的具体 参数。如“v”开头则表示该行描述的是一个顶点向量,即 表示该顶点的三维坐标信息。表1列举了主要的关键字及其 具体含义。在obj文件中,不包含面的颜色定义信息,但是可以引 用材质库,其信息是存储在一个后缀是“.nitl”的文件中。 关键字“mtllib”即表示材质库。材质库中主要包含材质的漫反射,环境,光泽的rgb的 定义值,以及反射,折射,透明度等其他特征。3 obj文件的读取与交互操作3. 1 obj文件的读取经

5、过对obj文件格式的结构熟悉之后,要读取模型,首 先需要建立对应的模型数据结构体,如对象顶点的结构体、 颜色列表结构体、材质描述结构体、投射投影矩阵等。代码 如下:typedef struct taglocalsetupgldouble ffovy;gldouble fznear;gldouble fzfar;double fvview0rg3;double fvviewtarg3;double fvviewver3;glfloat fvmatambient4;glfloat fvmatspecular4;glfloat fmatshininess;glfloat fvmatbasecolor

6、4; localsetup;obj文件中存储点向量、法向量、面和纹理的信息及相 应的个数定义如下:double (*m_pntobj) 3;double (*m_nor) 3;int (*m_triobj) 3;float (*m_texcrd) 2;int (*m_textri);int m_0bjvertexnum;int m_trinum;int m_texcrdnum;对于obj文件的读取,定义了 loadobjmodel函数:bool loadobjmodel (cstring filename);通过加载loadobjmodel函数,获取顶点、面、法线和 纹理相关信息。3.2 ob

7、j模型的显示导入obj模型之后,即可利用opengl强大的图形输出 功能来将obj模型显示出来。通过3. 1可知,函数 loadobjmodel可以获取模型的相关信息,然后构造函数 drawobjmodel来显示模型。具体代码如下所示:(本代码没 有加入纹理信息)glbegin (gl_triangles);for (int i 二 0; i m_trinum;i+) int a, b, c;a 二 m_tri0bji 0;b = m_tri0bj i 1;c = m_tri0bji 2;glnormal3dv ( m_nora ) ;glvertex3dv(m_pnt0b j a ) ;gl

8、normal3dv ( in_norb);glvertex3dv (m_pnt0bjb);glnormal3dv ( m_nor c) ; glvertex3dv(m_pnt0bjc);glend ();obj模型显示如下图1 (a)所示。3.3 obj模型的交互操作3. 3. 1模型的缩放、平移和旋转常规下,opengl 使用 glscale > gltrans -late 和 glrotate函数实现对模型的缩放、平移和缩放功能。可是, 本文算法是通过改变glulookat函数的参数来改变模型矩 阵,即改变相机的位置,从而使模型作出相应的变化。 glulookat函数原型如下所示:g

9、lulookat (gldouble eyex, gldouble eyey, gldouble eyez,gldouble centerx , gldouble centery , gldoublecenterz,gldouble upx, gldouble upy, gldouble upz);其中,eyex、eyey、eyez指定视点的位置;centerx. centery、centerz扌旨定参考点的位置upx、upy、upz指定视点向上的方向。obj模型的平移、缩放和旋转如 图1所示。3. 3.2 obj模型的选择在opengl的选择中,涉及到几个核心概念: selection mo

10、del选择模式,opengl有三种模式, gl_render ,普通的绘图模式;gl_select ,选择模式; gl_feedback,反馈模式。 name stack名字栈,用来分配并保存物体的数据id 的堆栈。 hit record命中记录,即物体的数据。 viewing volume 视角范,即用来选择的画框。具体实现步骤:(1) 设置选择缓冲区。选择时,在特定的视景体中绘制每个对象都会产生一个命中消息,命中消息将存放在一个 名字堆栈中,这个名字堆栈就是选择缓冲区。函数: void glselectbuffer (glsizei n, glunint *buff); 指定了一个具有n个

11、元素的整形数组buffer作为选择 缓冲区。(2) 进入选择模式。在定义了选择缓冲区后,需要激 活选择模式。选择模式的指定采用函数:glint glrendermode (glenum mode);其中,参数mode值可以为gl_render (默认值)、 gl_select或gl_feedback,分别指定应用程序处于渲染模 式、选择模式和反馈模式。应用程序一直处于当前模式下, 直到调用本函数改变为其他模式为止。(3) 名字堆栈操作。在选择模式下,需要对名字堆栈 进行一系列操作,包括初始化、压栈、弹栈以及栈顶元素操 作等。void gllnitnames (); /初始化名字堆栈,其初始状

12、态为空。void glpushname (gluint name); /将一个名字压入 堆栈,其中name是标识图元的一个无符号整数值。void glload name (gluint name); /将名字堆栈的栈 顶元素替换为nameovoid glpopname ( ); /将栈顶元素弹出。(4) 设置合适的变换过程。选择操作可以通过矩形选 择窗口来实现,我们可以用下面的函数调用:glupickmatrix ( xpick , ypick , widthpick ,heightpick, *vp);其中参数xpick和ypick指定相对于显示区域左下角的 选择窗口中心的双精度浮点屏幕坐标

13、值。当使用鼠标进行选 择操作时,xpick和ypick由鼠标位置确定,但要注意y坐 标的反转。参数widthpick和heightpick指定选择窗口的 双精度浮点宽高值。参数vp指定了一个包含当前显示区域 的坐标位置和尺寸等参数的整型数组,该参数可以通过函数 glgetlntegerv来获得。这个函数可以设置一个用于选择操 作的观察空间。(5)为每个图元分配名字并绘制。为了标识图元,在 图元绘制过程中需要用一个整型值指定图元的名称,并在选 择模式下,将这个名字压入到名字堆栈中。为了节省名字堆 栈的空间,应该在图元绘制完成后,将其名字从堆栈中弹出。(6)切换回渲染模式。在选择模式下,所有的图元

14、绘 制完成后,应该再次调用函数glrendermode选择渲染模式, 在帧缓冲存储器中绘制图元,并返回被选中图元的个数。int hitcnt = glrendermode (gl_render);(7)分析选择缓冲区中的数据。选择操作完成之后, 可以根据选择缓冲区中的内容进行分析,以确定选择的图o执行选择操作之后,窗口不会显示出来,因此,本文增 加了模型最小包裹的盒子来显示系统的选择操作,如图2所 不o4结束语本文提出了在opengl中实现obj文件的读取、显示和 交互操作功能的方法,实验证明,该方法的速度和复杂度都 有一定的优越性。实时读取obj文件,并能对其实现简单的 移动、旋转和缩放功能,同时还实现了模型选择功能,其中 通过显示最小包裹模型的盒子来显示选择功能。这不仅解决 了 3d人体建模的问题,也方便了建模后的数据处理,具有 很好的实用价值。参考文献白建军,朱亚平,梁辉等.opengl三维图形设计与制 作m.北京:人民邮电出版社,1999: 125.尚游,陈研涛.opengl图形程序设计指南m北京: 中国水利水

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论