背景:对三维物体进行可视化编辑,希望实现对三维模型的表情动画模拟和控制。
1.人脸及其动画系统的实现步骤
人脸及其动画系统包括以下的几个过程:
(1)人脸的三维表示 三维表示研究的是如何表示三维实体。有两种主要的表示方法:一种是多边形表示方法,这是图形学中最常见的表示方法,用多个多边形来表示实体的曲面,使用的多边形越多,表示的精细程度越好;另外一种表示方法是非均匀有理B样条曲面,B样条表示方法是用一个整体的曲面来表示三维物体,它通过一个控制点矩阵来控制曲面上各点的位置和法向量的方向,用B样条函数来拟合控制点多边形。因为B样条函数是高次函数,具有多阶导数,所以拟合出来的B样条曲面是个光滑的曲面。人脸的多边形表示方法比较简单,运算时间短,但是光滑程度不好。B样条曲面表示方法比较复杂,运算时间长,但是光滑程度很好。我们在比较了各种方法的优缺点后,在实验的基础上,最后使用的是基于特征的多边形表示。在多边形网格中定义了眼睛、鼻子、额头、头发、眉毛、耳朵、下巴、脖子、后脑勺等特征点,特征点的作用是定义了人脸部特征的形状和位置。除了特征点以外的网格点叫非特征点或自由点,它们的位置受特征点的影响。复杂的特征所在多边形划分比较细密,而其他地方的多边形划分比较稀疏。多边形表示方法在表示嘴巴、眼睛等需要切割的特征有独到的优势。
(2)三维建模 三维建模研究的是如何从照片、视频序列、激光扫描数据这些二维数据重建三维实体。我们采用的方法是从固定拓扑的原始人头模型变形,这是目前大多数人脸动画研究者采取的建模方法。它的思想是基于人类面部特征的位置、分布基本上是一样的。因而特定人脸的模型可以通过对一个原始模型中特征和其他一些网格点位置自动进行或交互式进行。基于这种特征多边形的人脸表示,对于人脸的建模,采用了两种模型:一种是造型阶段的线性弹性模型,用于一般人脸的生成;另一种是用于动画和表情变形的肌肉模型。线性弹性模型的建模方法要求移动某一个或某一组特征网格点的同时,相关的非特征点要做相应移动,而且要符合弹性特征,即当特征点恢复到原来位置时,非特征点也要能恢复到原来的位置,因此在由一般人脸到特殊人脸时,我们采用了线性弹性模型。肌肉模型实现脸部表情变形和动画时,我们不再使用线性弹性模型,因为这个简单的弹性模型的变形并没有依据人脸的物理特性,产生的动画逼真程度不够。因此,我们使用了肌肉模型来计算动画和表情的变形。
人面部的主要肌肉群分布如图4-23所示。
A.额头的(Frontalis),收缩时提升眉毛;
B.皱眉肌(Corrugator),收缩时使眉毛向里和向下运动,实现如皱眉这样的表情;
C.眼睑提肌(Levatorpalpebrae),收缩提高上眼帘;
D.高提肌(Levatorlabiisuperioris),从鼻子基部一直延伸到上嘴唇的中间,单独收缩产生轻蔑的表情;
E.颧骨的(Zygomaticmajor),收缩是嘴角向斜上方,产生微笑的表情;
F.抬起的(Risorius),收缩时使嘴角向两旁和向下移动,比如在哭泣时;
G.向下压的(Depressorlabiiinferioris),说话时,把下嘴唇往下拉;
H.斜面的(Mentalis),收缩时,把下巴往上拉,产生努嘴的效果。
对于每一条肌肉,都会有一个与骨骼相连的固定点,如图4-23中的P1点,固定点的位置在面部变形时位置是不变的;还会有一个与皮肤组织衔接的可移动点,如图中的P3点,肌肉收缩时,可移动点的位置变动最大。而位于肌肉线条上的其他点,如P2点,它的变形是肌肉最大变形(如P3的变形)的非线性递减。
2.构造物理模型环境
图4-23 肌肉模型
本节采用OpenGL和Visual C++系统环境开发人脸情感表达系统。
OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植[31];OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它在建模的基本图元绘制、基本变换和投影变换、颜色模式设置、光照和材质设置、纹理映射(Texture Mapping)、位图显示和图像增强、双缓存(Double Buffering)动画等方面有相当强大的功能表现。
在Windows中运用OpenGL进行主要的图形操作以及最终在计算机屏幕上绘制出三维场景的基本步骤是:
1)设置设备环境的像素格式:像素格式告诉OpenGL绘制风格、颜色模式、颜色位数、深度位数等重要信息。
2)建立“翻译描述表”:选定设备环境的当前“翻译描述表”。
3)建立模型:根据基本图元建立景物的三维模型,并对模型进行数学描述。
4)舞台布置:把景物放置在三维空间的适当位置,设置三维透视视觉体,以观察场景。
5)效果处理:设置物体的材质(颜色、光学性能及纹理映射方式等),加入光照和光照条件。
6)光栅化:把景物及其颜色信息转化为可在计算机屏幕上显示的像素格式。
7)屏幕显示:在屏幕上显示三维模型。
3.特定人脸模型和动画模型
目前,生成特定人脸采用的方法主要有:①两步修改算法:先将一般人脸模型进行比例变换,然后再将该模型覆盖在特定人脸的照片上,经比较后拖动其预先定义好的特征点,使人脸模型和照片相似,实现特定人脸造型;②采用让本身就有纹理的三维一般人脸模型同二维特定人脸图像进行边匹配边修改坐标和纹理控制参数的方法来产生出真实感极强的三维特定人脸;③不经过模型修改而由二维人脸图像直接得到三维特定人脸的算法,该方法通过在两张摄像机参数不同的人脸图像上定义二维网格,利用小孔成像和极线几何原理,求得二维网格的三维信息,最终生成特定人脸的三维模型。
(1)特定人脸模型 特定人脸模型从一般人脸模型转化而来。一般人脸模型是利用通用三维软件(如:3D Max Studio)建立的一般三维模型,它是三角网格体,实现的精度可以很高,图形的逼真度很高,但是它的动作或表情变化次序都是事先安排好的,无法实现实时控制,如果想在系统中实现实时控制表情动画,那么难度比较大;而且在系统中,希望能够以较小的代价来构建三维人脸模型,基于这些原因,我们采用NURBS曲面和三角形面片相结合的方式进行构建,进行转换时,依据特定人脸的照片并针对模型上的特征点进行交互修改而改变模型形状,使之与特定人脸相吻合。
对于部分静态的脸部模型,采用NURBS曲面进行构造,要理解NURBS方法,必须从B样条方法入手。只有在掌握B样条方法原理与算法的基础上才能进入到NURBS方法。戈登(Gordon)和里森费尔德(Riesenfeld)提出的B样条曲线方程为
式中,Ni,k(u)称为k次规范B样条基函数,有德布尔-考克斯的递推公式给出其计算方法如下:
若给定(m+1)×(n+1)个控制顶点di,j(i=0,1,…,m;j=0,1,…,n)的阵列,构成一张控制网格,又分别给定参数u与v的次数k与l,和两个节点向量U=[u0,u1,…,um+k+1]与V=[v0,v1,…,vn+l+1],这就定义了一张k×l次张量积B样条曲面。其方程为
式中,uk≤u≤um+1,vl≤v≤vn+1。
NURBS曲面在原B样条曲面的基础上增加了权因子控制。NURBS曲面的数学定义为
式中,ωi(i=0,1,…,n)称为权因子,分别与控制顶点di(i=0,1,…,n)相联系。由NURBS曲面可以相应地得到k×l次NURBS曲面的表示式为
这里的控制顶点di,j(i=0,1,…,m;j=0,1,…,n)为一矩形阵列,形成了一个控制网格。图4-24展示了由控制点阵构造NURBS曲面的情景。
图4-24 由控制点阵构造NURBS曲面
对于脸部表情变化的部分,根据人脸的生理特点,将人脸表面分成若干块。将人脸表情特征部位,如眼睛、嘴巴等处的NURBS曲面用面片构成的曲面代替。当特征面片块体位移和形变都很小时,可认为块体内部个体位移是其坐标(x,y,z)的一阶线性组合(高阶忽略),即(www.daowen.com)
为了更易于控制,将参数向量a、b、c,即
转化为具有确定物理意义的块体形变参数向量
式中,(u0,v0,w0)为块体内参考点(x0,y0,z0)的刚体位移;(α,β,γ)为块体绕参考点在xoy、xoz、yoz平面内的转动弧度;(εX,εY,εZ)为块体在x、y、z方向的法向应变;(τxy,τxz,τyz)为块体在xy、xz、yz之间的切向应变。此时式(4-33)就可转化为
式中,l=(x-x0);m=(y-y0);n=(z-z0)。
要得到块体内任意一点的位移,可以先利用几个参考点的位移反求H,然后再利用H来计算块体内所有其他点的位移。H的表达式为
人脸出现某种特定表情时,每一个子块的形变比较小,因此完全可以采用弹性形变模型来模拟脸部表情动画。通过分析,为眼睛眨动、嘴巴张开等脸部动作建立了各自的弹性形变模型,即表情动画模型。
对于如何将NURBS曲面的剪切边界与面片能够密实地接合起来,就需要知道剪切边界的节点坐标,由于NURBS曲面剪切边界并不是按照坐标剪切的,它只是根据整体曲面的比例来进行剪切,这就对我们结合坐标的工作产生一定的难度,但是可以对边界的比例进行换算和平移,就能达到这种效果。相应节点在本坐标系内所采用的换算公式为
式中,(x,y)为该节点的平面坐标;lx、ly为曲面分别在x轴和y轴上的宽度;nx、ny为剪切的比例系数。当nx或ny<0.5时,用左边的公式;而当nx或ny>0.5时,用右边的公式。对于z轴上的坐标,可以用平移函数来解决,因为NURBS曲面的变形是根据点与点之间的相互关系来进行的,因此经过数次平移可以控制在视觉误差范围之内了。
(2)表情动画模型 人脸出现某种特定表情时,每一个子块的形变比较小,因此完全可以采用弹性形变模型来模拟脸部表情动画。通过分析,我们为眼睛眨动、嘴巴张开等脸部动作建立了各自的弹性形变模型,即表情动画模型。以眼睛为例:眼睛有张开和转动眼珠等动作。对眼球的转动模拟如下:眼球的描述是以圆心和半径为基准点进行的,设圆心为T(x0,y0,z0),半径为r0,眼球的大小变化需符合下列公式:
(x-x0)2+(y-y0)2+(z-z0)2=r2 (4-38)
它的位移变化只需在x、y、z方向进行移动和旋转即可。但对眼皮动作的模拟就比较复杂,上眼皮的运动比较剧烈,它不但有上下运动,还有左右运动,而下眼皮的动作幅度相比之下较小。为此,在定义眼睛特征时,用四个基本特征点表示一个眼睛,它们分别位于眼角、眼睛最高和最低处。同时,眼睛外形近似于一个椭圆,椭圆和抛物线在空间曲线的统一表示中,其形状因子最相近,所以用两段抛物线模拟一个眼睛的外形。其外形轮廓近似符合下面公式:
y=a(x-b)2+c (4-39)
对上眼皮:设眼睛闭合时眼睛为一个弹性平衡态,且此时下眼皮无弹性形变,则当上眼皮的抛物线与纵轴焦点值为c、水平方向上的拉动位移Δx=0、垂直方向上的位移Δy(抛物线拟合上眼皮线)时,所有上眼皮三角形定点的位移(以4个特征点的坐标系原点建立坐标系)可表示为
Δy=a[x22-x21-2b(x2-x1)]
Δx=sqrt[(y2-c)/a]-sqrt[(y1-c)/a] (4-40)
因此,定点的坐标变为(x′,y′,z′),且满足
(x′,y′,z′)=(x,y,z)+(Δx,Δy,Δz) (4-41)
综合式(4-40)、式(4-41),可以得到顶点的新坐标,变动a与c值,就可以得到上眼皮运动的一系列新坐标,从而模拟出上眼皮的整个运动过程。对下眼皮,同理可得上述结果。
采用同样方法,还建立了眼睛、嘴巴等许多动作的弹性变形模型。由于保存的是弹性变形模型的数学公式,而非动作功能网格模型,所以在空间耗费上同以往的方法相比要经济多了;每个表情动作之间,只有少数区域的点参与形变,中间过程完全由弹性形变模型确定,因而计算量较小。
(3)程序的编码实现 构建一个在VC环境下的OpenGL绘制的三维模型,本节采用NURBS曲面和三角形面片相结合的方式进行构建。新建一个单文档的应用程序。设计NUBRS曲面来模拟人脸模型。初始化绘制环境:
1)填充PIXELFORMATDESCRIPTOR结构。
2)设置像素格式 确定设备上下文(DC)所支持的像素格式中,与给定像素格式描述符最为匹配的像素格式索引值。
3)创建着色描述表。
4)对灯光,材质等环境相关参数进行初始化。
5)场景布置:为了将物体放置在场景中合适的位置,需要使用一些OpenGL的变换操作。OpenGL变换有基本变换和投影变换两种。基本变换是对三维物体进行平移、旋转、缩放等。投影变换则把物体从三维投影到二维。视区则决定物体的投影图像在显示设备中的尺寸和位置。OpenGL中的多数变换均对应于相应的变换矩阵,可以说就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程。根据变化的类型,分为3种矩阵模式:GL MODELVIEW对应于基本变换;GL PROJECTION对应于投影变换;GL TEXTURE对应于纹理矩阵类型。
①对几何造型初始化;
②设置透视投影变换和视区;
③模型的绘制。
在模型绘制过程中,由于侧重模型的编辑操作,在绘制时并未计算顶点的法向量,仅仅求出了各个面片的法向量。
部分程序如下所示:
在对NURBS曲面的绘制中,设置曲面所需控制点矩阵和节点,以及所需剪切的顺时针内框和逆时针外框,并设置NURBS对象及属性。
其中,gluNurbsProperty( )函数通过选择GLU_OUTLINE_POLYGON等OpenGL常量来控制成员变量,这是一种交互的机制。类似这种OpenGL常量有几百个,一般可以通过控制常量来进行交互选择,或控制程序的运行,或控制图形的处理方式,或控制图形的输出形状等。
本节应用了NURBS曲面的剪切功能,其中gluPwlCurve( )函数就是处理剪切曲面功能的函数。利用这个功能可以制作多连通曲面。多连通曲面是由外部边界线和内部边界线界定的曲面。外部边界是按逆时针方向的,而内部边界是按顺时针方向的。更内层的边界方向可以类似确定。剪切区域定义了将要计算的NURBS表面域的子集,通过限制将要计算的区域,有可能生成包含洞的NURBS表面或生成有光滑边界的表面。剪切区域由一整套表面参数空间的封闭剪切循环定义。
(4)纹理映射 构建完模型就要加上纹理了,加纹理时,使用纹理映射。纹理映射技术是真实感技术的一个重要方面,人脸表面的纹理具有颜色和几何纹理的双重属性。在贴纹理前,必须要确定纹理与人脸的相对关系,即在场景中生成实体时要同时用到纹理坐标和几何坐标。对于一个二维纹理来说,纹理坐标在两个方向上都是从0.0到1.0。这样在设计纹理时就要小心,要使其左右、上下各边能够很好地拼为一体,即要实现纹理图像的无缝连接。在应用中,首先选择一个图像。由于被用作纹理图像的宽和高必须是2的幂次方,所以在预处理部分须将其转换为符合要求大小的格式,并将对应的256分量依次读入缓存区。在初始化时,对纹理映射的各种参数进行设置,要对相对的几何坐标同时给出对应的纹理坐标,本节采用了线积分卷积法来进行纹理的向量场映射方法。设向量场中任一点处的局部特性由一卷积核函数k(w)沿一条从该点开始向前向后跟踪出的一段流线积分的结果来决定,则定点(x,y)的纹理值I(x,y)可由下式得出:
式中,I为(x,y)出发向前向后跟踪的流线段所经过的像素;f(xi,yi)为像素点(xi,yi)处的输入纹理;hi为流线段穿过像素(xi,yi)时在其内的长度。经过这样的处理后,就可以实现具有真实感较强的人脸表面表情。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。