基于几何建模的旗帜飘动模拟研究与实现

2019-02-25 13:14李婷婷
计算机技术与发展 2019年2期
关键词:质点旗帜风力

李婷婷

(大连东软信息学院,辽宁 大连 116023)

0 引 言

近年来,随着虚拟现实技术及计算机动画技术的快速发展,人们对计算机动画模拟的真实性及稳定性等方面也相应提出了更高的要求。旗帜飘动模拟可以实现在虚拟场景中,旗帜表面在自然风力作用下随风飘动效果,在影视广告、数字娱乐以及三维游戏等方面应用广泛。同时,其在学术领域也受到了广泛关注并得到了深入研究。例如,Chen等在流体力作用下,研究了湿润织物面料的流体扩散效果[1-2];Liu等模拟了织物面料在风力影响下产生的动态效果[3];吕梦巧等基于柏林函数构建风场,模拟织物面料受风力影响下的运动效果[4]。目前,已有很多专家学者对织物面料受力运动进行了模拟研究,旗帜飘动作为布料动画的一种,研究甚少。因此,文中采用几何建模方式仿真出风力作用下的旗帜飘动的动态效果,以实现动态旗帜飘动快速逼真的仿真效果。

1 基于几何的旗帜建模

构建旗帜模型是旗帜模拟中最基本同时也是最关键的核心问题,几何法和物理法是两种经典方法[5]。基于物理的建模方法能够表现旗帜真实的物理运动,但是需要求解一组复杂的微分方程,计算开销大,计算效率受数值方法的稳定性限制[6]。近年来,随着虚拟现实领域对模型动画实时性和稳定性的迫切需求,基于几何方法建模方式呈现出新的优势,因为几何法不考虑旗帜面料本身的物理特性,无需求解复杂的动力学方程组,计算稳定,生成动画的效率也很高[7]。因此,文中采用基于几何建模方式模拟旗帜在风力作用下的动态飘动效果。

1.1 旗帜的网格化

采用四边形网格对旗面进行建模,四方网格模型由M*N个质点构成。坐标原点O在屏幕的左下角,X轴正方向为水平向右,Y轴正方向为垂直向上,Z轴正方向为垂直屏幕向外。在XOY平面内设定M*N个距离相等的质点表示旗面,这些质点按照自左向右、自上向下的顺序排列,按照质点排列的顺序对质点进行编号,从左上角到右下角,得到编号的ID为0到(M-1)*(N-1)的M*N个质点。

1.2 旗帜飘动的总体建模

在对旗帜表面进行网格化排位后,为了模拟旗帜飘动过程,需要根据旗帜表面的运动原理实时计算网格中每个质点的坐标值。根据旗帜飘动特性可知,在平稳的微风吹拂下,旗帜飘动呈现出一定的波动周期性,采用正弦函数予以建模,而对于风力较大且吹拂方向不均时,旗帜表面的飘动特性则可以采用指数函数予以建模。

正弦函数的表现形式为Y=Asin(ωx+φ),其中ω用来确定旗帜表面飘动的波动周期,A用来确定旗帜飘动的幅值,而φ用来确定在不同网格上质点的“错位”情况;指数函数表现形式为Y=ax(a>0,a≠1),a用来控制旗帜表面的起伏程度。

1.3 旗帜的运动模拟

旗帜运动模拟过程可以认为是质点间Z轴数值传递过程,通过不断变换Z轴数值来实现旗帜飘动效果。Z轴数值变化可以通过指数函数和正弦函数实现。为了体现出旗帜飘动过程中更多的细节特征,将旗帜网格划分为3个区域。其中,0~15列质点为区域1,16~34列质点为区域2,35~49列质点为区域3。

(1)微风影响下,旗帜表面运动建模(正弦函数)。

区域1:α(sin((8x)*rand()*δ);

区域2:β(sin((8x)*rand()*δ);

区域3:γ(sin((8x)*rand()*δ)。

其中,α、β、γ分别为旗帜飘动时的震动幅度影响因子;δ为随机因子,实际应用时可根据情况进行设置。在后面的实验中分别选取α、β、γ为1.5、2.5和4.5,δ为4×10-6。

(2)较大风力影响下,旗帜表面运动建模(指数函数)。

区域1:aα*sin(9x);

区域2:bβ*sin(9x);

区域3:cγ*sin(9x)。

其中,a、b、c分别为旗帜质点起伏程度因子。实验中分别选取a、b、c为1.04、1.06、1.08,α、β、γ为3.5、5.0和6.5。

1.4 旗帜飘动速度控制

为了体现出旗帜受风力影响下的动态飘动效果,根据划分好的旗帜网格区域进一步将Y轴上质点进行分区,一共划分出三个区域,通过设置不同的刷新频率来实现旗帜表面运动效果的不同,从而动态模拟旗帜飘动过程中受风力影响的效果。实验中设置0~15行质点为V1速度刷新区,16~34行质点为V2速度刷新区,35~49行质点为V3速度刷新区。

2 旗帜的绘制

在旗帜几何造型的基础上,采用纹理映射的方法渲染旗帜表面,同时采用色彩融合技术和灯光特效来增强旗帜飘动时的视觉效果[8-9]。

(1)纹理映射。

纹理映射是把存储在内存里的位图包裹到所生成的旗面网格上,增强旗帜飘动时的真实感。文中选取蓝色水波纹作为纹理测试图片,如图1所示。

图1 旗面纹理测试图

在具体实现过程中,首先对旗帜的纹理测试图像进行分块(将图像划分为50*50大小的矩形块),然后将每块小纹理图像对应实时地映射到旗面网格的每个四边形小网格上。

(2)色彩融合。

文中采用色彩融合技术来实现旗帜色彩融合的视觉效果。首先,将旗帜颜色各分量依据一定的比例混在一起。然后,修改RGBA(r,g,b,a)中各颜色分量中Alpha值,定义a为不透明性,称(1-a)为透明性[10]。实验中使用的具体融合函数如下:

glEnable(GL_BLEND);

glColor4f(1.0f,1.0f,1.0f,0.5f);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

(3)添加光照。

在虚拟仿真中光源特效种类很多,有全局环境光、双面光照、光的衰减、聚光、多光源、光源位置的改变等等。为了增强旗帜飘动时的视觉效果,在场景中添加全局环境光和漫反射光源特效,并将光源位置定义在(0,0,2)处。具体实现时,首先在程序中创建光源并设定光源位置,接下来再启动光照。实验中使用的光照函数如下:

GLfloat LightAmbient[]={0.5f,0.5f,0.5f,1.0f};

GLfloat LightDiffuse[]={1.0f,1.0f,1.0f,1.0f};

GLfloat LightPosition[]={0.0f,0.0f,2.0f,1.0f };

glEnable(GL_LIGHTING);

3 交互控制

在虚拟场景漫游中,观察者可以通过设定时间控制器或是键盘来控制视点的位置、视向和参考方向[11]。视线方向可以由参考点位置确定,漫游的过程就是通过不断移动视点或改变视线方向进行[12-13]。采用键盘上w、s、a、d键实现观察者的前后左右移动,进而实现控制用户在虚拟场景内的漫游效果;采用z、x键实现仰头和低头动作;采用q键实现升旗操作;采用e键实现降旗操作,交互控制效果如图2所示。

图2 旗帜交互效果图

4 实验结果

为了验证旗帜飘动效果,文中进行了大量仿真实验。实验在配置为Pentium(R) G4400、CPU 3.3 GHz、DDR4 4G内存及Intel HD Graphics 510(128M)核心显卡的PC机上,编译环境为Visual Studio 2010,代码编写采用C++语言,通过调用OpenGL函数库实现。旗面飘动实验结果如图3~4所示。为了验证旗帜建模的有效性,还分别构建了两个虚拟场景,将旗帜分别放入虚拟场景中模拟出当受到不同风力作用时,旗帜飘动的不同效果,如图5~6所示。

图3 旗帜网格效果图

图4 旗帜表面效果图

图5 风力较大情况下的旗帜飘动效果图

图6 微风情况下的旗帜飘动效果图

5 结束语

旗帜飘动过程具有动态变化的特性,而用尽可能少的时空开销去模拟旗帜飘动效果是文中主要的研究任务。对此,提出一种基于几何建模方式快速构建旗帜网格平面,通过对旗帜网格平面的分区刻画出不同刷新频率下旗帜的飘动效果。实验结果表明,该方法实现简单,消耗计算机内存小,同时考虑到了风力作用下的动态变化效果,可满足影视、娱乐、数字游戏中对动画实时性的要求,取得了较好的模拟效果。下一步将继续考虑采用物理建模方式并利用GPU加速处理,得到更为真实、流畅的旗帜模拟效果。

猜你喜欢
质点旗帜风力
在党的旗帜下出发
海上漂浮式风力发电机关键技术研究
巧用“搬运法”解决连续质点模型的做功问题
心中的旗帜
一百年的旗帜
我愿是你旗帜上的星
为什么风筝有线能飞,断了线就飞不了了?
帆不是越大越好
质点的直线运动
质点的直线运动