`
暴风雪
  • 浏览: 390787 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[转载]数字布料模拟技术简介

 
阅读更多
转自:http://www.cnblogs.com/lai3d/archive/2010/08/06/1793613.html
http://www.tsinghuadmpx.com/zhuantilanmu/shuzibuliaomonijishu/2010/0205/1157.html

导读:首先,这是一篇牵扯到数学和物理知识的文章,如果您对文中所涉及的公式有所不明白的话,请在边上摆上一本《高等数学》以及一些物理学常识的知识。

首先来讲布,第一个问题是:为什么要模拟布的运动?游戏中很多地方都有布,那么目前大部分的做法是什么样的呢?目前大多数游戏所采用的方法是对布建立骨骼,然后由美工针对每个动作做不同的布料骨骼动画,这种做法带来的弊端就是布料不会随着周围环境的变化来变化。比如说,周围刮来一阵风,或者骑在马上,披风不能披落在马背上,等等之类的。而且如果游戏中动作很多的情况下,针对每个动作都需要做不同的布料骨骼的调整,加大的美工的工作量以及工作复杂度,另外如果披风的骨骼的数目不多的话,还会导致即使是调出来的动作也会产生很不美观的效果。

OK,罗嗦了一大堆,那么我们要实现什么呢?我们要实现一套针对布料的物理系统,要求在没有风的情况下,布料会受重力的影响,慢慢的飘落,并且在有风刮起来的时候,你的布要能“随风飘摆”。

下面来看看传统物理中,布料的模型。根据流体力学来说,布料上每个顶点的力可以用圣维南方程组来求,但是在数学里面来说,圣维南方程组是没有精确解的,那么我们就需来设计一种模型来求该方程的近似解。无数的物理高手,在模拟布的过程中,总结出了两套经典的模型,一套是“质点-弹簧”模型,另外一套是由微软中国研究院研究出来的“半钢体-复杂摆”模型,在我的布料引擎中所用到的是“质点-弹簧”模型,理由是该模型所存在的时间比“半钢体-复杂摆”模型要久很多,在稳定性,以及效率方面几乎没有风险。而如果采用“半钢体-复杂摆”,这还只是一个实验品,目前来讲还没有任何的应用,采用这种模型有一定的风险。

那么我们下面就来详细看看经典的“质点-弹簧”模型究竟是怎么样一回事:

在“质点-弹簧”模型中,任何的流体(柔体)都被分解为由N个质点,每个质点之间由各种不同方式的弹簧连接着。主要的连接方式有三种,一种是矩形连接法,即每个质点和他的“上下左右”四个点用弹簧进行连接。另外一种是交叉连接法,即每个质点和他的“左上,右下,左下,右下”四个点用弹簧进行连接。最后一种方法叫隔点连接法,既每个质点和他的“左边的左边,右边的右边,上面的上面和下面的下面”四个点用弹簧体进行连接,这种连接方式主要是用来简化之后的关于弹簧的弯取应力的计算,一般要和前两种连接方式混合起来使用。在我的布料运算的DEMO中,我采用了第一中矩形连接法,然后自己精确计算弹簧的弯取应力来实现的。

物理模型选定之后,就需要我们来针对传送进来的顶点进行编程进行建模,一般的方法是将布料的顶点,按照从左到右,从上到下的顺序传递进来,然后按照布料的宽度来进行程序上的物理建模。当模型建立好之后,我们就需要每一帧对模型中的每一个质点进行物理运算:

那么每个质点所受到的力具体该如何算呢?这里分为两步来进行计算,首先是内力,然后是外力:

每个质点都受到由弹簧建立成的模型所带来的弹簧的拉力,以及弹簧本身的弯取应力。

那么首先来算弹簧的拉力,首先获得当前质点在空间中的位置P0,然后获得和他用弹簧相连的周围各个质点的位置P1-P5,然后循环计算P1-P5和P0的距离,并用这个距离减去弹簧本身的长度,然后乘以弹簧的虎克系数,就是这个点在这一帧受到的弹簧拉力。

另外来算弹簧的弯取应力,在矩形模型中,则是通过计算“上面质点”和“下面质点”的夹角以及“左边质点”和“右边质点”的夹角来乘以一个弯取应系数来获得一个以当前质点为圆,两个质点的距离为半径的圆在邻质点的切线方向的一个力。

到这里,布料的内力都已经计算完成了,那么就需要来计算布料所受的外力了。

首先是重力,重力是根据质点的密度(质量)乘以重力加速度的一个值,然后是一个全局的阻力,否则弹簧会不停的弹来弹去没有个完,注意,这里的被乘数一定要是上一帧的速度向量,而不是当前的力向量。接下来就是风力,我对风力的处理可以理解为在质点的法线方向施加的一个力,力的大小跟风力向量以及质点的方向的夹角有关,当夹角为2*PI的时候,风力达到最大。

至此,质点的内力和外力都计算完毕,那么接下来如果通过这个力来获得下一帧的质点的位置呢?首先根据质点的质量和合力的大小来获得一个带方向的加速度,这一步只需要将算出来的力乘以1/质点的质量,得到加速度之后,就可以根据vt = v0 + at来计算这一帧的速度向量,随后将当前质点在空间中的位置加上v * t就是下一帧的质点的位置。

至此,对于布的模拟已经完全搞定了,不用怀疑,就这么简单,但是目前所实现的东西还无法应用,为什么?很简单,因为还没有做布的碰撞,如果一块披风在人身上穿过来穿过去的,那么做不做布还有什么意义?

对布做精确碰撞检测?这是不可能的,如果你要这样做你的游戏将只有20帧不到的FPS,用AABB包围盒碰撞?你希望看到一阵风吹过来,你的披风贴在一个正正方方的“人”上面?那么这里就提出一个新的概念“椭球包围体”碰撞。注意,这里的椭球体是不存在的,只是一个数学模型,并不是由三角型等组成的,这种椭球体可以绑定在人物骨骼上,随人物骨骼的运动而动,比如说人的头,就是一个x-y-z轴相等的椭球体,髋骨,盆骨,肩胛骨等都可以比较好的用椭球体体现出来。

椭球体是个很有意思的东西,在做FPS类游戏的时候,要实现上下楼梯的效果,用椭球包围体碰撞就是个非常好的方法,而在这里,不是椭球体跟三角型碰,而是顶点跟椭球体碰。那么下面来看看究竟如何比较好的描叙,以及来使用一个椭球体:

椭球体用三个向量来进行描叙,一个是椭球体在空间中的中点,另外一个向量是储存椭球体在x,y,z轴三个方向的半径的长度,另外一个向量则是指定椭球体的方向,我在DEMO中是以椭球体x轴的方向为椭球体的方向。

椭球体的方程是:(x^2 / a^2 + y^2 / b^2 + z^2 / c^2) = 1

那么相应的碰撞检测就是将某个顶点的x,y,z三个值带入方程,看结果是大于1还是小于1,如果小于1则发生了碰撞。那么发生碰撞之后怎么办呢?首先需要把这个顶点强行移动到离椭球体表面最近的点,这一步通过解从椭球体中点,过那个顶点的射线和椭球体方程一起连解,可以获得那个点,具体的推导这里就不列出来了,化简后方程如下:

设:x0,y0,z0为椭球体中点,x1,y1,z1为在椭球体内一点:

那么离它最近的椭球体表面一点为:

t = sqrt(1 / (sqr((x1-x0)/a) + sqr((y1-y0)/b) + sqr((z1-z0)/c)));

x = x0 + t*(x1-x0);

y = y0 + t*(y1-y0);

z = z0 + t*(z1-z0);

最后,由于整个布料的运算是基于物理模型的,所以并不能直接把它弄到椭球体表面就了事了,应该给它一个在椭球体上这一点的法线方向的支持力。
椭球体的法线的计算在化简之后为:

D3DXVECTOR3(sqr((x - x0) / a),sqr((y - y0) / b),sqr((z - z0) / c));

然后通过一个点乘算出当前质点所受的力在负法线方向的分量,然后用当前的力向量减去这个分量即可,之后再需要乘上一个这个椭球体的摩擦系数。

至此,整个布料运算+椭球体碰撞的模型介绍完毕。

分享到:
评论

相关推荐

    带碰撞布料模拟

    这种技术广泛应用于游戏开发、电影特效以及虚拟现实等领域,使得数字角色能够与环境中的布料物体交互,增加了场景的真实感和沉浸感。 在“带碰撞布料模拟”中,关键知识点包括以下几个方面: 1. **物理引擎**:...

    布料模拟的c++代码

    【布料模拟的C++代码】是一个编程项目,主要涉及计算机图形学和物理模拟领域,使用C++语言实现。此项目的核心是应用Verlet积分法来模拟布料的行为,但并未处理布料之间的碰撞效果。图形渲染部分采用了DirectX(DX)...

    布料模拟源代码

    布料模拟是一种在计算机图形学中广泛应用于游戏开发、电影特效和虚拟现实的技术,它能够使数字中的布料表现出真实世界的物理特性,如柔软度、弹性、垂坠感等。本压缩包提供的“布料模拟源代码”是基于粒子弹簧系统...

    计算机动画布料模拟

    在实际项目中,如游戏开发、电影特效等,计算机动画布料模拟技术被广泛应用,使得虚拟环境中的布料动态表现得栩栩如生。通过不断的研究和改进,这一领域的技术正在不断进步,为观众带来更真实的视觉体验。

    “布料模拟”滤波算法(张吴明教授文章)

    《基于布料模拟的机载LiDAR数据滤波算法》 张吴明教授在2016年提出的一种创新的“布料模拟”滤波算法,为点云地面点滤波领域带来了新的思路。这一算法的核心是借鉴了物理学中的布料动力学模型,将点云数据视为可...

    unityf的布料模拟.rar

    在Unity中,布料模拟是一项非常实用的技术,可以为游戏中的角色服装、窗帘、旗帜等带来真实的物理效果,提高游戏的视觉真实感。本教程将深入探讨Unity3D中的布料模拟,帮助开发者掌握这一关键技能。 一、Unity3D...

    Magica Cloth 1.9.5 布料模拟,动态骨骼

    在Unity中,动态布料模拟是一项重要的技术,它可以增强游戏的视觉效果和沉浸感。Magica Cloth通过复杂的物理计算,模拟出布料纤维之间的相互作用,包括拉伸、压缩、扭曲等物理特性,从而实现与现实世界相似的布料...

    基于OSG布料模拟

    【基于OSG布料模拟】是一种使用开源图形库OpenSceneGraph(OSG)实现的计算机图形学技术,它主要用于在虚拟环境中模拟布料的行为。OpenSceneGraph是一个高性能的3D图形工具包,提供了丰富的功能来创建复杂的交互式3D...

    CSF (Cloth Simulation Filter) 基于布料模拟的LiDAR点云地面滤波/分割(裸地提取)方法

    CSF(布料模拟过滤器) 将点云分为地面和非地面测量是从激光雷达(光探测和测距)数据生成数字地形模型(DTM)的重要步骤。已经开发了许多滤波算法。然而,即使是最先进的滤波算法也需要仔细设置许多复杂的参数来...

    计算机图形学之动画和模拟算法:Cloth Simulation:实时布料模拟技术.docx

    计算机图形学之动画和模拟算法:Cloth Simulation:实时布料模拟技术

    布料运动模拟(质量弹力模型)

    在计算机图形学领域,布料运动模拟是一种技术,用于创建逼真的虚拟布料效果,广泛应用于游戏、电影、设计等领域。本项目通过VC++实现,实现了实时性,并且考虑了碰撞检测,使得模拟更加真实。 一、布料运动模拟基础...

    unity布料模拟插件 Obi Cloth 包含多个版本

    unity布料模拟插件 Obi Cloth 包含多个版本 Obi Cloth 3.5.unitypackage Obi Cloth 4.0.1.unitypackage Obi Cloth v6.5.4.unitypackage

    Qualoth面料模拟动画Maya插件V4.2-8版

    Qualoth作为一款备受推崇的面料模拟工具,专为Maya设计,为艺术家们提供了高效、精确且直观的布料模拟解决方案。本文将详细解析Qualoth V4.2-8版在Maya中的应用及特点。 首先,Qualoth插件的核心功能在于其强大的...

    Unity插件 Obi Cloth布料模拟

    它使用了并行计算技术,确保在多核CPU上高效运行,减少了模拟对游戏性能的影响。同时,通过LOD(Level of Detail)系统,Obi Cloth可以在远距离或不重要区域降低布料的细节程度,进一步节省资源。 文件列表中的...

    Magica Cloth最新版1.12.5 布料模拟

    《Magica Cloth最新版1.12.5:布料模拟技术详解》 Magica Cloth是一款先进的布料模拟软件,其最新版本1.12.5在业界备受瞩目。这款工具专为游戏开发者、视觉效果艺术家以及动画制作人设计,旨在提供真实感十足的布料...

    基于python实现的简易布料模拟动画源码(课程作业).zip

    基于python实现的简易布料模拟动画源码(课程作业).zip基于python实现的简易布料模拟动画源码(课程作业).zip基于python实现的简易布料模拟动画源码(课程作业).zip基于python实现的简易布料模拟动画源码(课程...

    实时布料 OPENGL 代码

    3. **有限元素方法**:FEM是一种数值分析技术,常用于解决偏微分方程,如在布料模拟中的应力和应变问题。通过将布料分割成多个小的互连区域(称为“元素”),然后求解每个元素的局部行为,最后整合所有元素的结果来...

    unity动态骨骼脚本 可以模拟动态布料,衣服,尾巴,胸部等

    在给定的标题和描述中,我们关注的是Unity中的动态骨骼脚本,这是一种用于模拟物体动态行为的技术,特别适用于模拟布料、衣物、尾巴和胸部等软体对象的自然摆动和抖动效果。 Unity的动态骨骼系统主要是通过两种技术...

    Magica Cloth最新版1.12.12 布料模拟

    它将现实世界中的物理规律转化为数字代码,从而使布料在虚拟世界中的反应接近真实。开发者通过使用Magica Cloth,可以轻松创建出更为真实的游戏角色服装、自然飘动的窗帘、翻飞的旗帜等动态元素,极大地提升了游戏或...

    CSF-master_布料滤波算法_布料滤波_csf布料算法_CSF滤波_CSF布料生成_

    CSF(Cloth Simulation Filter)布料滤波算法是一种用于模拟和优化计算机生成的布料效果的技术。在游戏开发、电影特效以及虚拟现实等领域中,真实感的布料模拟是至关重要的,而CSF算法正是解决这一问题的有效方法。...

Global site tag (gtag.js) - Google Analytics