会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 特效分子
Real-time Cloth Deformation [实时变形布]
发表日期:2007-01-16 17:09:05作者: 出处:  

写这个小程序的目的是为了验证一个想法,那就是布的模拟并没有人们所想的那么复杂。如果你对物理模型的方法和3D Coding比较熟悉的话,很快就可以编出一个类似的程序。(左图是运行截图,请先下载运行ClothDef.zip,需Dx8支持,并将显示模式设为非24bit)

本站的许多其它demo一样,这个程序也是应用基于物理模型的方法来解决问题的。基于物理模型的方法(Physical based),指的是从物体的固有性质出发,从中提取出一般的自然规律,然后在计算机上实现。英文的Physical其实包含了两层意思:第一是客观存在,表明这个东西是存在的而不是虚构的,是看得见摸得着的而不是假想的;第二是符合自然规律,即这个事物是自然界中的一分子,它的运动(广义的)必须符合大自然所赋予它的规律,就象苹果终究会掉到地上,人终有一死一样。

(有人开始扔鸡蛋了... 没法子,写毕业论文时所沾染的八股风气到现在还没有完全摆脱)


际上,布的模型可以简化成这样一个结构:一个由弹簧和小球组成的正方形网格,正方形的每条边是一根弹簧,正方形的每个顶点则是一个小球(如右图所示)。这种模型也被称为“粒子弹簧”(Spring mass),用于各种与布料具有类似性质的物体的计算机模拟中。

么,通过得到所有小球的坐标,我们就可以构造出一个网格(Mesh),用D3D或OpenGL渲染出来,但Mesh和Render纯粹是3D Coding的问题,这里不准备做详细讲解。本文主要介绍如何计算这些小球的运动坐标。

 

面是以一种最简单的受力情况为例,推导出任一小球的运动轨迹(不用害怕,以下分析仅仅需要初中物理课上所学的知识,即使不看,你自己也能推出来)。

球的受力分析(设P(x,y)表示处于网格x,y处小球的3D坐标,L为弹簧的原始长度,C为弹簧的虎克系数):

1、重力。恒定等于mg,方向垂直向下。

2、前、后、左、右四根弹簧的拉力(或推力)。可以用简单的虎克定律来求,即力的大小与弹簧的伸长量成正比,例如右边弹簧对小球的拉力的大小 |F_right| = ( |P(x+1,y) - P(x,y)| - L) × C,方向在P(x+1,y)和P(x,y)的连线上(注意F_right是一个矢量)。

球的运动分析:

假设一小球在某一时刻t0的坐标为P(x,y),速度为V(x,y),那么在t时间后,它的新坐标可以很容易的用下式求得(注意,以下运算均为矢量运算):

小球所受合力 F = mg + F_left + F_right + F_top + F_bottom

小球的速度 V' = V(x,y) + F/m

小球在t后的新坐标 P(x,y)' = P(x,y) + V' × t

(注:在这里,我们假设了在t的时间内,小球以恒定的速度运动,而并没有顾及这段时间内小球的受力、速度都在变化,这是spring mass算法中最重要的假设,因为如果你企图用精确的微积分方法来计算网格中每个球的运动速度和轨迹,即使是10*10的网格,也是一件几乎不可能的事情。所以t的选取非常重要,t越小,则计算越准确,但是显示出来就会成为慢动作回放;t太大的话,整个网格则会很容易失稳,你会亲眼看到你的布变成一团乱麻)

Q:完了?!

A:完了。

Q:这么简单?!

A:就这么简单。

然,以上只是弹簧网格在最简单情况下的运动分析,并没有考虑以下一些因素,而这些是让布显得更加真实的必要条件。

1、弹簧的弯曲应力(Bend stress)。没有它,布在弯曲时不会形成圆弧形的弯角;

2、自碰撞检测(Self collision)。没有它,布会穿透自己;

3、他碰撞检测(Hit detection)。没有它,布会穿透其它物体;

4、空气的阻尼(Air resistance)。没有它,自由落体时,布会象石头一样砸向地面;

5、被风吹动(Affected by wind)。没有它,你永远不可能模拟出一块真实而飘逸的布。

5点在本demo中并没有完全实现,因为它们都极其耗费cpu,不可能做成Real-time的;而且如果非要完成的话,至少还要用去Imagic一个星期的时间(做这种demo,没什么实际用处,只是好玩,又没财团资助,何苦呢)。

后还要解释一下为什么demo中的布看上去并不象块布,而更象是一个弹簧网(你见过有布能象水一样漾来漾去吗),这是因为参数设置的原因(为了让大家能够更清楚的看到整个动画的过程,而使用了比较夸张的设置),照下面来修改参数,你会看到一块比较真实的布。

Delta time = 0.02
Spring force = 30
Decay = 0.98

(设置完后按Reset钮才能生效。还要注意,请不要乱改参数,特别是delta time和spring force一项,否则就会发生上面提到的那样变成一团乱麻,这时你应该赶紧按Stop或Exit钮。)

最后放几幅图,让大家看看老外在做布方面的进展(唉!虽说布是我们中国的发明,可到现在又落在老外的后头了)。

再废话一句:本demo和文章绝对正版,非翻译作品也,如果非要问参考了一点什么东东的话,看看Hugo的主页)
 

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00285