【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2628|回复: 2

[基础技术] Unity3d高级教程 | 实时变形布特效算法

[复制链接]
发表于 2014-11-7 23:06:33 | 显示全部楼层 |阅读模式
摘要: 写这个小程序的目的是为了验证一个想法,那就是布的模拟并没有人们所想的那么复杂。如果你对物理模型的方法和3D Coding比较熟悉的话,很快就可以编出一个类似的程序。(左图是运行截图,请先下载运行ClothDef.zip, ...





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

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

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

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

  小球的受力分析(设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钮。)

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







发表于 2014-11-18 20:29:54 | 显示全部楼层
超级给力,值得学习,谢谢
发表于 2014-12-18 16:32:35 | 显示全部楼层
这个必须收藏学习下,希望我能学的懂。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 04:00

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表