APP下载

一种三维参数化虚拟人台建模的新方法

2013-10-27王小波李英琳

天津工业大学学报 2013年5期
关键词:绘制向量部位

王小波,李英琳

(天津工业大学纺织学部,天津 300378)

近年来,高级定制和个性化设计越来越广泛的受到人们的关注,传统的量体裁衣方法耗时耗力,无论是顾客还是设计师都迫切希望从这繁琐的测量工作中解脱出来.显然,建立参数化虚拟人台是解决这一问题的良策,设计师可以通过三维虚拟服装CAD系统设计出合体的服装.因此寻求一个合理可行的参数化人台建立方法已经成为一个迫在眉睫的问题.但迄今为止,人们在人体建模领域的研究工作主要是集中在计算机图形学方面,虽然这些研究在很大程度上推动了人体建模的发展,但是真正针对服装CAD系统的人体建模方法还有待探究.近年来,在这一领域里已经有了很多学术方面的研究,但依然迫切需要寻求出一些能应用于实际生产的技术方法.基于以上原因,本文对传统的模型建模法进行了改进,以获得更加令人满意的参数化人体模型.首先在建模软件中建立标准基本模型,然后在OpenGL中读取标准模型的点和面信息,绘制出标准模型;通过输入参数来分析目标模型和标准模型之间尺寸的差别,通过控制函数对需要进行变换的点的点信息进行计算和更新,最后将得到的新模型绘制出来.此方法不仅可以通过用户界面对模型特征部位的尺寸信息进行调整,而且允许用户通过用户界面对模型的变换函数进行微调设置.通过此方法得出的模型具有良好的精确度和可用性,而且人体不会走形,具有良好的外观.

1 相关研究

随着计算机图形学和建模技术的发展,人体建模方法也越来越多样化.概括起来可以分为4类:①直接建模;②模版建模;③图片识别建模;④统计综合建模.直接建模方法分为2种:3D人体扫描法和骨骼建模法.3D人体扫描法无疑是各种人体外形获取方法中最精确的方法之一.随着3D图形捕获技术的发展,3D人体扫描技术的应用也日趋成熟和普遍.但是对于服装CAD系统来说,3D人体扫描技术仍然存在一些严重的不足:首先,三维人体扫描设备过于昂贵;其次,三维人体扫描设备得到的人体数据在后期转换为建模数据时非常复杂.所以目前来说,三维人体扫描法并不适合用于服装CAD系统.骨骼建模法则除了要求对人体的表层建模外,还要对人体的一些内部组织进行建模,如肌肉、骨骼、皮下组织等,之后再将皮肤覆盖在它们的表层.此过程要求建模人员对人体结构和计算机图形学有着深入的了解,所以尽管其建出的模型非常逼真,但是它并不适用于服装CAD系统.

模版建模是指程序员先在系统中建立一个基础模型,之后的其他模型以此为基础进行变换.这种方法因其简单易行而被广泛采用,特别是在一些在线的试衣系统上.但是它无法保证其精确度,且大多数此类建模方法无法建立人体各部位间的变换关系.

图片识别建模法,首先对建模对象拍摄一系列照片,然后通过图片处理技术获得被拍摄人体的外形轮廓和一些测量数据.这种方法在一定程度上减轻了开销和劳动强度,但是其也有相当的局限性.譬如其对照片的拍摄背景有着严格要求,并且其建立的模型有着相当的噪点[1].

统计综合建模法为每个示例模型的扫描数据生成同类的网格结构,最后通过这些网格结构生成我们需要的新模型的网格结构.此法以同类网格生成为核心技术,以此确定所建标本模型的拓补结构和网格连通性.这种建模方法的缺点是难以自行输入模型尺寸,其主要应用PCA(即主元分析算法)技术代替之前提到的三维扫描技术和模型获取技术.PCA的模型中存在诸多的假设条件,这就决定了它存在一定的限制,在有些场合可能会造成效果不好甚至失效.

本文采用的是模版建模方法,通过一种新的算法来在原先建模方法的基础上进行改进,从而在保留此方法简单易行优点的同时弥补此法的不足.

2 建立基本人台

首先建立一个标准的人体模型.本文试图通过Poser软件获得一个特定的女性人体模型.模型的数据信息为:身高165 cm,肩宽38 cm,胸围84 cm,腰围68 cm,臀围84 cm.

将建立的标准女体模型导入3DMAX,并对其进行切片,保留其主体部分,再将所有身体部位合并为一个物体,如图1所示.然后将文件命名导出为women.ASE,并将其数据精度设为小数点后2位,其他设置默认.这个文件包含之后绘制时需要的所有网格和顶点信息.

图1 人体模型Fig.1 Model of human body

3 基本人台在OpenGL的中的数据读入和绘制

导出了包含网格和顶点信息的ASE文件之后,就需要对ASE中的文件信息进行读取和绘制.为了方便和简化之后的读取工作,可对之前获得的ASE文件进行适当简化,这些简化并不会影响网格和顶点的数据信息.过程为:将ASE文件用记事本方式打开,在其工具栏选择:编辑——替换.将所有的多个连续空格符替换成一个空格符,并将TAB符也替换成单个空格符,完成后保存文件.ASE文件的文件格式非常规范,所用关键字都是对应含义的英文全称.文件内容的开始部分是一些3DMAX文件信息,以及一些场景设置信息,这些对本文模型的建立没有影响,“*GEOMOBJECT”字符之后的一些信息为场景内的物体信息,包括物体的名称等,在此不做深究.从“*MESH”字符开始,之后的信息就是关键的网格和顶点信息,其对应的含义如表1所示.

之后需要对这些数据进行读入和存储,限于文章篇幅,本文对其将从简介绍.本文主要是通过自己编写的一个GetString(FILE*fp)函数来对文件进行读取.其算法如图2所示.

GetString(FILE*fp)函数完成读取之后,数组s[i]中将产生一个字符串.本文通过判定这个字符串是什么,来改变一个标志位(这个标志位是事先创建的一个整型数据).具体方法为:首先为每个关键字定义一个字符串变量,并将其初值设置为与其相对应的关键字字符串.之后通过判断所读入的字符串是否与刚才定义的字符串变量相同来识别当前读取的字符串是什么,进而改变标志位的值.其算法如图3所示.最后得到的标志位与字符串信息的对应关系如表2所示.

表1 关键字含义对照表Tab.1 Meaning of key words

图2 读取算法图Fig.2 Reading algorithm

识别读取之后就需要对数据进行循环存储,首先构建一个结构体object,其成员包括:double x[4630],double y[4630],Double z[4630],int facex[7742],int facey[7742],int facez[7742],double nx[7742],double ny[7742],double nz[7742],double vtxnum,double facenum.这些成员用于之后存放网格和点的信息.这里事先在ASE中确定了物体的面和点的数量,所以数组的大小是确定的,也可以用动态数组来构建成员变量,但是这将影响程序的效率和运行速度.构建数据结构的算法如图4所示.

图3 识别算法图Fig.3 Identification algorithm

表2 flag标志位含义对照表Tab.2 Meaning of flag

图4中的“读取指针向后移动”和“读取数据”都是指运行一次GetString(FILE*fp)函数.图中建立了2个object类型的指针变量,一个是用于实时绘制模型,另一个是用于存储原始模型.需要注意的是3DMAX中的坐标系与OpenGL中的略有不同,OpenGL中坐标Z值应该为3DMAX中坐标Y值的相反数,而OpenGL中坐标Y值应该为3DMAX中的坐标Z值,读入时应注意其坐标的转换.另外,之前构建的object结构体中的成员变量都是整型或者浮点型,但是ASE文件的数据被读入后存储在s[i]中却是字符串,所以需要用atof()函数和atoi()函数进行转换,在图中为了便于描述对此进行了省略.至此,模型的所有数据都完成了从ASE文件格式到模型程序的读取存储,之后就需要对模型进行绘制.这个过程比较简单,直接利用OpenGL自带的三角形绘制函数即可完成,需要注意的是在给定三角网格的每个顶点之前,先要给定这个顶点的法向量坐标,这样最后的模型才有正确的三维光照效果.

图4 构建数据结构算法Fig.4 Build data structure algorithm

4 在OpenGL中对模型数据进行变换

一般的模版建模方法是将人台在3DMAX中或者其他建模软件中切割为多个特征部分,然后通过数据输入对某个特征部位的整体进行缩放变换[2-3].这种算法存在着相当的缺陷,譬如:每个模块缩放影响的特征部位已经被人为的规定,这导致在后来建模的过程中无法按照实际情况对变换的部位进行调整;人体部位的变化不应是部位整体按照某个比例一起缩放;事先将人体按照特征部位切分成不同的切片,再经过放缩函数变换后,切片与切片的接合处会出现结合失真,甚至会出现明显的撕裂或者过渡不匀.

本文所研究的算法并不对人台进行切分,而是针对各个部位的点坐标进行不同的变换,各个部位前后的变换不是简单的整体按照一个参数变换,而是独立的按照用户的设置进行变换[4-5];变换函数计算出的新的点坐标在模型重新被绘制后,特征部位之间平滑的接合,不会出现部位之间结合过渡不匀或者裂缝,并且每个部位作用在人台上的实际范围允许用户自行调整.下面将详细介绍这一步骤的具体算法.

首先分析一下人体特征部位的变化规律,譬如腰部.一个标准体人台的腰部应该是向内凹陷的,那么如果给予腰围一定的增量,最明显的变化应该是向内凹陷的程度会逐渐减小,之后随着尺寸的继续增大凹陷会消失,最后取而代之的是原来向内凹陷的地方会变的凸起.并且在此过程中横向增长和纵向增长的程度也会有所不同.又譬如胸部,随着胸围的增加,其点坐标的增量应当随着它们远离胸点所在的水平面而逐渐衰减,臀部应当随着其远离臀围线而逐渐衰减.为了达到这一目的,必须赋给每个坐标点不同的变换系数,而这个系数的变化应当随着其远离中心线而逐渐减小,直到为零.为此可以构造一个二次函数,将特征部位的y轴坐标看成自变量,将放大的比例系数看为因变量.这样构造出来的函数正好满足了变换的需求,而且由于二次函数的图像特点还会使得人体各部位之间的衔接过渡非常平滑.假设人台某个部位的y坐标范围为[y1,y3],而这个部位关键面(本文称特征点所在的面为关键面,如胸点所在的面、臀围线所在的面)的y轴坐标为y2,关键面的变换系数为β,如图5所示.

图5 抛物线示意图Fig.5 Sketch map of parabola

则这个抛物线经过3个已知的点,分别为:(y1,0),(y2,β),(y3,0),可求解其方程式.之后只需将每个点的纵坐标代入方程式就能求出该点的变换系数.已知3 点分别为(x1,y1),(x2,y2),(x3,y3),设其方程为y=ax2+bx+c.

则其抛物线系数的求法为:

为实现参数化变换,最后需要计算求解人台特征部位的y坐标范围.由于模型从3D中导出后每个点的坐标都是经过特定的转换,无法直接得知这些y值的大小.本文采取的方法是将之前的人台的副本在3DMAX中做切片,即把每个部位切成单独的物体,再把这些物体编号.再将本来的程序复制一个副本,并简单修改用于求解,程序的整体算法与原本的程序区别不大,这里就不作赘述,只介绍一下其算法的主要思想.其主要算法为:建立一个object类型的指针数组,在识别一个物体名称后新建一个object指针,并将其存储于指针数组内.然后编写一段求解最大值最小值的代码,分别将指针数组中的指针赋给求解代码中的指针,求出每个物体y坐标的最大值和最小值,这些值主要用于设置抛物线形状,以及之后用户调整变换范围界面的初值设置,切分图和用户范围设置界面图如图6.

图6 模型切分和软件设置Fig.6 Model segmentation and software setting

得到人台各个部位的y坐标范围之后,解出控制函数的方程式.在得到变换方程式之后,可以以此计算各部位中每个点的变换系数,更新之前用于绘制的存储地址中的网格和点信息.譬如更新第i点的z坐标,则为:

以上求解并更新了用于绘制的存储地址中的网格和点的一些信息,此时已经可以绘制出符合用户输入参数的人台模型了.但是绘制完毕后会发现有些凹陷的面看起来并没有凹陷,或者凹陷的程度与看到的不一致.这是由于程序只更新了网格和点的一部分数据,还有一些关键的数据没有得到更新,它们就是法向量信息.

求解一个点的法向量的基本方法为:遍历所有经过这个点的面,求出这个点在每个面中的法向量值,最后算出它们的平均值.但是这样计算法向量有一个缺点,当很多小面共一个大面或者接近共一个大面时,会导致局部光照粗糙,在此本文使用另外一种法向量计算方法.前面所说的求平均值的方法之所以会出现局部法向量粗糙,是因为程序将每个面对最终法向量的影响看成是一致的.其实,每个面对点最终的法向量的影响程度在大多数情况下是不同的,当这个点所在角的角度较大时,这个面对点最终的法向量的影响就更大,如图7所示,θ2的值最大,所以θ2所在的面的法向量对A点最终法向量贡献最大.基于这个思想,必须求出每个三角网格面中所求点所在角的角度,由于已知这3个点的坐标,假设要求角A的度数θ,那么求解方法为:

这样得到了所求点在每个面上的角度的大小,然后以这个角度为权值,计算最终的法向量值.假设为图7中所示情形,则点A法向量的求解方法为:

式中:nori为A点在第i个面中的分法向量;θi为A点在第i个面中的角度.

以上为求得某点在各个面中的分法向量后如何求解其最终法向量,还需求解一个点在某个面中的法向量.点在某个面中的分法向量其实就等于这个面的法向量,因为一个面上所有点的法向量都是相同的.假设已知 3 点(x1,y1),(x2,y2),(x3,y3),则这个面的法向量(xn,yn,zn)的求解方法为:

图7 法向量合成Fig.7 Compounding of normal

使用以上方法可以求出每个点的法向量,进而更新内存中用于存储绘制数据的内存空间的网格和顶点信息.至此已经全部完成了网格和顶点信息的更新工作,之后再调用一次之前的绘制函数便能绘制出新的模型.

以下是软件的运行效果.

相同的变换范围和前后比例,不同的部位尺寸,在不同的视角下观察,效果如图8所示(注意各部位的尺寸变化).

图8 效果图1Fig.8 The first rendering

相同的部位尺寸和前后比例,不同的变换范围,在不同的视角下观察,效果如图9所示(注意胸部和臀部的变化曲线).

相同的尺寸和变换范围,不同的前后比例,效果如图10所示(注意观察前四幅胸部和后四幅腰部的前后曲线变化).

图9 效果图2Fig.9 The second rendering

图10 效果图3Fig.10 The third rendering

5 结束语

本文主要研究一种新的参数化人体模型的建模方法,此算法是在模型建模法的基础上加以研究和改进的,较好的实现了参数化人体模型的快速建立.模型的效果精确实用,并且用户可以从多方面对模型进行调整控制,能够较好应用于服装在线试穿系统和服装CAD系统.但是由于笔者能力和时间有限,程序中必定还存在着一些问题.后续的研究可以从围度变化的比例与围度上点坐标的变化比例换算入手,从数学角度进一步提高模型的精确度.

[1]BAEK Seung-Yeob,LEE Kunwoo.Parametric human body shape modeling framework for human-centered product design[J].Computer-Aided Design,2012,44(1):56-57.

[2]KANG Tae J,KIM Sung Min.Development of three-dimensional apparel CAD system PartⅡ:Prediction of garment drape shape[J].International Journal of Clothing Science and Technology,2000,12(1):39-49.

[3]蔡剑.基于特征尺寸的个性化三维服装人台参数化建模系统的研究[D].上海:华东理工大学,2011.

[4]SHI Xiu-jin,WANG Zhi-jun,LE Jia-jin.One new method to generate 3-Dimensional virtual mannequin,physics procedia[J].Physics Procedia,2012,25:1919-1925

[5]YASSEEN Z,NASRI A,BOUKARAM W,et al.Magnenatthalmann,sketch-based garment design with quad meshes[J].Computer-Aided Design,2013,45(2):562-567.

猜你喜欢

绘制向量部位
每个女孩都有不允许别人触碰的隐私部位
每个女孩都有不允许别人触碰的隐私部位
向量的分解
聚焦“向量与三角”创新题
基于Excel VBA和AutoCAD的滚动轴承参数化比例图绘制方法
分析当归中不同部位有效化学成分
超萌小鹿课程表
放学后
五个部位冬天尤其要保暖
向量垂直在解析几何中的应用