基于3DS与OpenGL的三维人体模型构建方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于3DS与OpenGL的三维人体模型构建方法
摘要:在应用程序中构建三维人体模型是实现三维虚拟试衣系统的一项基础工作。在Visual C++6.0开发环境下,利用OpenGL和3DS优势互补实现人体模型的构建和交互。克服了因OpenGL没有提供三维模型的高级命令,仅通过点、线及多边形等基本几何图元构建模型所造成的工作量和难度大的问题,实现了快速构建高质量三维人体模型的目的。
关键词:三维人体模型;OpenGL;3DS
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)等主要数据结构。