基于3DS与OpenGL的三维人体模型构建方法

时间:2022-08-12 03:08:49

基于3DS与OpenGL的三维人体模型构建方法

摘要:在应用程序中构建三维人体模型是实现三维虚拟试衣系统的一项基础工作。在Visual C++6.0开发环境下,利用OpenGL和3DS优势互补实现人体模型的构建和交互。克服了因OpenGL没有提供三维模型的高级命令,仅通过点、线及多边形等基本几何图元构建模型所造成的工作量和难度大的问题,实现了快速构建高质量三维人体模型的目的。

关键词:三维人体模型;OpenGL;3DS

中图分类号:TP317.4文献标识码:A文章编号文章编号:1672-7800(2013)012-0158-03

作者简介:李素芳(1987-),女,西安工程大学计算机科学学院硕士研究生,研究方向为智能信息与并行计算;谷林(1973-),女,西安工程大学计算机科学学院副教授、硕士生导师,研究方向为参数化三维人体模拟及服装CAD。

0引言

三维人体建模是实现虚拟试衣的基础,也是计算机图形学和服装CAD 领域研究的热点和难点。目前,在服装人体建模中主要使用的方法有4种:多面体建模、基于特征的服装人体曲面建模、参数化的曲面建模、以网格边界线为连续条件的三维人体建模[1]。人体表面复杂、不规则,人体模型建立难度较大,不少学者在人体建模方面进行了相关研究。宋庆文等[2]对人体模型数据进行分析,用NURBS曲面构建了人体的四肢和躯干,但手部和脚的原始三角型网孔依然残留着。吴龙、张欣等[3]在单文档视图模式下调用OpenGL,通过多边形曲面造型方法来实现参数化人台设计。盛光有、姜寿山等[4]以一种基于单目视觉测量原理的三维人体扫描装置获得的人体数据为来源,运用三角面片法构建人体表面,并把人体模型保存为标准的OBJ文件模型格式。李基拓等 [5]提出了使用正、侧、背面 4 幅正交人体图像,通过参数化变形截面环变形人体模型模板后得到带服饰纹理的个性化虚拟人,但基于照片构建的人体模型往往真实程度很差,不能真正反映人体的特征。本文的三维人体模型构建采用多面体建模技术,在获取人体曲面数据阶段,通过Poser中的人体模型导出为3ds文件来获得相关数据,并结合3DS和opengl的方法来实现模型构建和交互。

13DS文件格式

3DS是非常普遍的数据格式,以3DS格式保存的三维图形文件非常丰富。3DS文件由块组成,每个块由信息类别和下一个块的相对位置两部分组成,其中块的信息类别由ID来识别。3DS文件中的数据按低位在前、高位在后的方式组织。例如,两个十六进制字节0x4A5C组成的整型数,表明5C是高位字节,4A是低位字节。每个块是一个层次结构,不同类型的块具有不同的层次结构。3DS文件中有一个ID是0x4D4D的根块,它是文件的开始,其大小就是文件的大小。根块内的块称为主块,有3D编辑程序块和关键帧块两种类型。3D编辑程序块是物体的形体数据定义的开始,主块后面是该主块所包括的子块。3D编辑程序块的子块包括材质列表块、物体块等,而物体块又包括了网格块、亮度信息块、相机参数块等,其中,网格块包括顶点列表块、面信息块、位置信息块等;关键帧块定义关键帧的信息。3DS文件这种块的结构的优势在于应用时可以跳过不需要的块信息,仅读取所需块。

2OpenGL三维图形工具包

SGI公司的OpenGL(即开放性图形库Open Graphics Library)是一种图形与硬件的接口,独立于硬件系统、操作系统和窗口系统,具有广泛的可移植性。OpenGL提供了清晰明了的图形函数,不要求开发者把三维物体模型的数据写成固定的数据格式,开发者不但可以直接使用自己的数据,而且可以利用其它不同格式的数据源,这种灵活性极大地节省了开发

时间,提高了开发效率[6]。OpenGL还提供了建模、变换、着色、光照处理、纹理映射、双缓存动画、反走样等基本操作,但没有提供三维模型的高级命令,只提供绘制简单图元的函数,仅通过点、线及多边形等基本几何图元构建复杂模型的工作量和难度较大。

OpenGL的工作流程如图1所示,OpenGL中的几何顶点数据和像素数据可以被存储在显示列表中或者能够立即得到处理。几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过运算器、逐个顶点操作等;图像数据包括像素、影像集、位图集等,图像像素数据的处理方式与几何顶点数据的处理方式是不同的,但它们都经过光栅化、逐个片元(Fragment)处理直至把最后的光栅数据写入帧缓冲区,最后通过硬件显示在输出设备上。

3三维人体数据获取

三维人体数据的获取不仅是建立人体模型的前提,而且是服装工业化生产中制定型号规格标准的基础。人体数据的获取可以通过测量仪测得,可分为传统接触式测量和非接触式测量两种。传统接触式测量是以软尺、测距计、滑动计等为测量工具测出人体有关部位的长度、宽度、围度等二维数据如身高、胸围、腰围、臀围、肩宽、大腿围、小腿围等。非接触式测量通过三维人体扫描仪获得人体的点云数据,具体有立体摄影测量方法、激光测量法、莫尔条纹测量法、TC2分层轮廓测量法、投影条纹相位测量法等。

考虑到用传统测量工具对真实人体进行测量的诸多不便以及三维人体扫描仪比较昂贵,本文采用三维人体造型软件Poser自带的人体模型。Poser是美国Curious Labs开发的三维人体造型软件,它提供了很多标准的人体模型,并具有很强的信息交互能力,可以读取3DS、OBJ、DXF等文件,所以Poser可以与输出以上文件的应用程序进行交互,如3DS max等。

首先将Poser中的人体模型导出为3DS文件的格式,然后根据3DS文件块结构的特点,利用计算机编程将有用的人体曲面的顶点信息提取出来作为人体建模研究的数据。对于其它多块信息则可以忽略,这不会妨碍对所需信息的提取,反而正是3DS文件块结构的优势所在。

4基于VC的人体模型绘制

4.1VC中配置OpenGL绘图环境

实现VC和OpenGL之间图形接口的机制是像素格式设置以及关联DC(Device Context,又称设备描述表)与RC(Render Context,又称渲染描述表)。此后OpenGL即可调用绘图原语,在窗口中绘出图形[7]。VC开发环境下,创建基于单文档的OpenGL应用程序:

(1)工程中添加用来链接OpenGL函数的lib。单击菜单project选择settings,在Link选项卡的Object/library modules里添加代码“opengl32.lib glu32.lib glaux.lib”,每个lib之间用一个空格隔开,然后在需要调用OpenGL库函数的文件顶部包含OpenGL函数的头文件,分别是gl.h,glu.h,glaux.h。

(2)在利用OpenGL绘图的视类中创建OpenGL绘制描述表,用来把OpenGL函数的调用连接到设备描述表。声明变量:HGLRC m_hGLContext。

(3)设置OpenGL像素格式。OpenGL 窗口要求有自己的像素格式, 只有那些从 OpenGL 窗口客户区域获得DC 才容许在窗口中绘图。OpenGL用一个PIXELFORMATDESCRIPTOR 的数据结构保存和转换像素格式。

(4)初始化声明的OpenGL设备环境句柄,使之与当前的DC相连。

如此便完成了OpenGL的绘图环境配置,可以调用OpenGL提供的函数来进行建模操作。

4.2人体数据读取

通过前面对3DS文件结构的分析,结合面向对象编程思想,设计结构体t3DObject和t3DModel 来组织3DS文件读取程序的数据结构以及辅助类CLoad3DS来实现对3DS文件的读取及相关操作。

其中,t3DObject 存放实体对象的相关信息,属性主要记录了对象中的顶点数目(numOfVerts)、面片数目(numOfFaces)、对象的名称、材质ID(materialID)、顶点坐标(pVerts)、法向量(pNormals)、面索引信息(pFaces)等主要数据结构。

一个3DS文件包括一系列的t3DObject,结构体t3DModel是对t3DObject的对象集合的描述。其属性主要记录了对象的数目(numOfObjects)、材质的数目(numOfMaterials)、材质链表信息(pMaterials)、对象链表信息(pObject)。

类CLoad3DS的主要操作有: ReadChunk()读一个块;ProcessNextChunk()读下一个块;ProcessNextObjectChunk()读下一个对象块;ReadVertices()读对象的顶点;ReadVertexIndices()读取面信息;ComputeNormals()计算顶点的法向量。

类CLoad3DS读取3DS文件的操作简单描述如下:

打开一个文件,在文件指针合法的情况下,调用ReadChunk()读取第一个块,然后判断该块的ID是否是0x4D4D,若是则说明该文件是3DS文件;接着调用递归函数ProcessNextChunk()将对象读出并保存到t3DModel实例中,在读完整个3DS文件后,调用ComputeNormals()计算顶点的法线。

4.3VC环境下三维人体模型绘制

根据读入的人体数据,利用三角面元来构造人体模型,以下是绘制人体模型的关键程序段:

glBegin(GL_TRIANGLES);//三角形图元

for(int j = 0; j < pObject->numOfFaces; j++)// 遍历所有的面

{

for(int i = 0; i < 3; i++)// 遍历三角形的所有点

{

int index = pObject->pFaces[j].vertIndex[i]; // 获得面对每个点的索引

glNormal3f(pObject->pNormals[index].x,pObject->pNormals[index].y,

pObject->pNormals[index].z); // 给出法向量

glVertex3f(pObject->pVerts[index].x,pObject->pVerts[index].y, pObject->pVerts[ index ].z); //给出顶点

}

}

glEnd();// 绘制结束

4.4人体模型交互

利用 OpenGL 提供的坐标变换、颜色处理、光照处理、选择等功能可实现三维物体更加真实的显示,同时还可以实现三维物体的旋转、放缩等交互操作。

在OpenGL中,利用glTranslate()函数完成物体的平移变换,利用glRotate()函数实现物体的旋转变换,利用glScale()函数实现物体的缩放变换,利用glPolygonMode()函数来设置模型的点、线段、面显示方式。

在工程中主窗口分为左右两部分,单击菜单栏上的数据输入菜单项选择好人体模型的3DS文件后,主窗口的右侧显示人体模型,左侧有面元模式和线框模式两个单选按钮,用户可以选择模型显示的模式;还有光照复选框,选择光照复选框后还可以通过Slider滑动条控件来改变光照颜色。窗口布置如图2所示。

单击人体模型后拖动鼠标来实现人体模型的旋转,鼠标滚动滑轮来实现模型的放大缩小。面元模式下能够真实地体现人体模型的表面信息,并能进行消隐处理,适用于虚拟试衣。实现效果如图3所示。5结语

本文在Visual C++6.0环境下,通过面向对象编程思想,设计类读取3DS文件中的人体数据,调用OpenGL函数实现了三维人体模型的构建和旋转、放缩等交互操作。该方法建模方便快捷、开销小,且效果逼真,为最终实现虚拟试衣打下了坚实基础。

参考文献参考文献:

[1]罗静,杨继新.三维人体建模技术[J].大连工业大学学报,2009,28(5):378-381.

[2]宋庆文,周源华.一种基于模型的人体建模系统[J].计算机应用与软件,2004,21(1): 57-60.

[3]吴龙,张欣,任小玲,等.基于三维人体测量的参数化人台的研究[J].西安工程科技学院学报,2005,19(4):416-419.

[4]盛光有,姜寿山,张欣,等.基于单目视觉测量的人体建模与显示[J].西安工程大学学报,2009,23(4):93-97.

[5]李基拓,王阳生,周霞.由正交图像造型三维个性化虚拟人体模型[J].计算机辅助设计与图形学学报, 2008,20(5):554-559.

[6]赖特,利普恰克.OpenGL编程指南[M].第4版.邓郑祥,译.北京:人民邮电出版社,2005.

[7]高恩婷.基于VC++的OpenGL三维应用程序的设计[J].苏州大学学报:自然科学版,2007,23(4):38-39.

A Method for the Constructing 3D Mannequin Using 3DS and OpenGL

英文摘要Abstract:Constructing 3D mannequin in the application is one of basic work to realize the 3D virtual fitting system.This article uses 3DS and OpenGL which have complementary advantages to construct 3D mannequin and achieves interaction under Visual C+ + 6.0 development environment. OpenGL does not provide advanced commands to construct 3D model, only by basic geometric primitives such as points, lines and polygon to construct model.Its workload is great.This method solves the problem and realizes constructing high-quality 3D mannequin quickly.

英文关键词Key Words: 3D Mannequin;OpenGL;3DS; Interaction

上一篇:Web2.0时代网站建设特征、内容及其应用研究 下一篇:基于知识建构理论的公安院校大学生信息素养提...