UE物理模拟
课程大纲
Chaos Physics
帧率 子步 迭代
物理引擎全局解算精度的设置,帧率越高,子步越多得到的模拟结果就越精确。
引擎默认情况下是以变化的帧率运行的,但是对于Chaos物理引擎来说。一般子步越小,帧率越固定,效果就会更好更稳定一些。
图示的分步选项就是依据下方的最长子步时长和最大步数对动态变化的帧率,进一步的做拆分来保证物理效果。
对于影视项目建议都开启分步选项。
红色框内有三个迭代次数的设置,这是Chaos基于位置的约束求解算法专用的一个设置,可以简单理解为迭代次数越高,当前帧一个子步内得到的结果就越精确。
碰撞
碰撞是物理模拟中最基础的一个交互形式。
引擎中的建模工具和网格体的资源编辑窗口中,实际都内置了对复杂模型进行凸包分解的碰撞体生成工具。
打开窗口>凸包分解工具
可以生成凸包碰撞体。
约束:PhysicsConstraintActor
约束是在Chaos系统中对模拟元素施加控制的一个基本手段,刚体的破碎靠的是打破我们预先切割好的小碎块之间的约束。角色身上跟随摆动的一些小挂件是靠和带动画的关节建立约束,限制它们之间的角度和距离来实现摆动。更复杂的像角色身上的布料,它的拉扯弯曲还有褶皱的这些动态都是依据布料的拓扑来搭建各种类型的约束来实现的。
引擎中有个PhysicsConstraintActor可以在场景中不同物体间搭建点对点的两点约束。它就是Chaos系统中最基础最通用的一个约束。
接下来以下面Actor为例对约束的主要参数和特性做一个介绍。
- 基础:距离/角度控制
约束最常用的功能就是对约束物体间的距离和角度加以控制。
下图参数它是在三个维度的移动和绕三个轴向的旋转上分别加以控制。提供的控制选项也有三个,Free是不加控制,Locked是完全锁住没有相对运动,而Limited是最常用的指定一个范围使被约束的物体可以在这个范围内进行拉伸和摆动。
演示效果
距离和角度的限制完全固定住,模拟时移动上方物体。
如果给它一定的距离范围,模拟时移动上方物体,下方物体有一定的跳动。
如果再给它的角度一定的范围,模拟时移动上方物体,下方物体有一定的摆动。
- 状态:Rest Target(Motor)
这里给大家介绍约束中两个比较基础的概念,不只是在Chaos系统中,大多数物理引擎中的约束都有这两个重要的状态或者说是Pose。
Rest状态是物体不受力原本状态下的姿势,比如布料舒展的状态或者角色在T-Pose下的关节间的约束位置和角度。比如前面讲距离长度的限制和角度的设置都是相对于约束的Rest状态来说的。
Target状态是物体运动的一个目标,在Chaos约束的参数面板中,我们称之为Motor,在布料中我们称之为动画驱动。
模拟过程中可以理解为Rest状态是物体总是被动的要返回的一个状态,而Target状态是物体主动的想要到达的一个目标。
目标状态可以是动态变化的。蓝图中也有对应的接口对它进行修改设置。
演示效果
如果给约束加一个角度的目标,模拟时下方物体会对抗重力试图达到目标状态。
添加目标速度可以减少震荡,相当于刚体模拟中的阻尼。
- 高级:Soft Plastic Break
Chaos支持Soft(软约束),Plastic(塑性约束),Break(可断裂的约束)
软约束就像一根弹簧,我们可以按Stiffness(弹性系数),对超出我们设置的距离或角度限制的物体施加力把它拉回来,表现会比普通的角度距离限制更自然一些。但是要注意它是要配合较高的迭代次数来使用的。使用时同样也注意开一些阻尼,避免发生比较高频的抖动或震荡。
塑性约束是根据一定的距离或者角度的阈值,对约束的Rest状态进行调整,使它无法恢复初始的状态,发生永久的形变。比如模拟钢铁的弯曲或者车辆被撞后的凹痕。
可断裂的约束也是阈值进行控制的约束,当被约束的物体的运动超出这个限制时,就直接把约束打断
- 校正:Projection
Projection投影它是模拟过程的后处理校正手段,尤其是在跟随角色运动的挂件和长链条模拟中应用的很广,它的用途是可以修正在动画运动比较快或者是迭代次数不足的时候关节间发生的分离。需要注意的是它只对硬约束有效不会对高级选项中的软约束进行校正。
- 物理场
物理场是分区域对局部空间的模拟对象进行物理属性调控的一个系统。它空间范围的划分是由几种基本形状来做组合的。操作的对象可以是刚体,布料,但在粒子特效系统中也有对应的接口可以采样物理场中的属性进行效果联动。目前物理场应用最广的是在破碎系统中。
物理场一般是在蓝图中进行配置的,引擎内容中提供了几个通用的模板。可以通过调整它们的参数来覆盖大部分的物理控制效果。
大家如果有自定义的需求,这里分类列举了一些常用的蓝图节点,左上的这部分节点是用来设置物理场中的属性值,可以是单一的整数,浮点数或向量,也可以是从中心发散的辐射向量或者说是noise还有随机值。
左下的这部分就是通过几种基本的形状来指定操作的范围,而且我们可以设置这些物理值在指定的形状内,从中心到边缘进行衰减。
然后不同的场之间是可以做组合的,如右上角所示可以做剔除,也可以做加减乘除的数学运算。比如我们用一个单一的向量乘上一个noise就可以在方向控制上做一个强度的变化。
最后我们把场设置好后,就可以通过右下的接口,把它应用到摆放在场景中的FieldSystem实例上面去。
模拟对象
刚体基础
刚体是不可发生形变的物体,也就是说在运动过程中模型上各点间的相对距离不会发生变化,只会有整体的位移或者是旋转。
在普通的粒子系统中,参与模拟的元素是一个点,也就是无限小没有体积的一个质点。刚体可以理解为以这个质点为轴心把物体的形状考虑进来,运动过程中有质心的平移还有绕着质心的自转。因此常说刚体有六个自由度,三维的位移和三个轴向的旋转。因此对应的在模拟过程中,我们描述刚体的运动会用到下面几个基本的变量。
刚体Physics Material
刚体其它的物理属性可以通过Physics Material来指定。它和普通的渲染材质一样是一个单独的资产,我们可以把它链接到不同的渲染材质中去。也可以在不同actor的细节面板上Override。包含的参数如下。
- 碰撞接触面:摩擦和反弹系数
- 密度
- Sleep Threshold 帮助刚体快速稳定的一个设置,速度低于这个阈值就可以让它静止下来,去除多于的一些小抖动。
抖动问题解决方案
- Mass和Inertia不宜过小
- 适当提高sleep threshold
- 稍加damping
Chaos Destruction
破碎模拟的大致逻辑,对比普通的刚体,我们用一个新的资产GeometryCollection(几何体集)来制作破碎,几何体集是以静态网格体为源进行创建的,我们有一整套比较健全的工具对模型进行切割,对断面斩UV还有烘焙贴图以及生成碰撞体。这些数据都记录在几何体集的资产中。另外我们还会在几何体集中组织碎块的层级,一方面这个层级后面会影响到破碎的节奏,另一方面对性能优化也很有帮助。解算时在actor的Construction阶段,物理引擎会自动帮我们在小碎块间搭建约束网,运行过程中我们根据预先设置好的约束断裂阈值,在发生碰撞的位置或者是物理场添加String的位置,把这些约束打断,然后产生破碎的效果。
创建几何体集
- 单个或多个静态网格体
在编辑器中切换到破碎模式,选取需要破碎的静态网格体,我们就可以在右边的工具集中新建几何体集。如果选取了多个Actor会被分到不同的碎块里。
- 外部切割:分割组件
勾选后可以保留外部切割的碎块。
- 模型要求:封闭无穿插
切割与层级
切割与层级划分是破碎制作的核心。
- 基于Voronoi的切割
它是先在空间中散布一些种子点,再对模型做切割是各个面离哪个种子最近就会被归属到这个种子的碎块中去。因为算法是按距离判断的,也导致最终生成的碎块都是凸包碰撞就很好处理。
引擎提供了多种的切割控制方式
- 统一模式是比较随机比较平均的种子分布方式
- 簇的方式可以参考第二张图,可以看到种子会聚集成随机的几簇来分布,这样切割出来的碎块在大小上就会有更多的对比和变化。
- 圆形,切片还有砖块是一些有特殊逻辑的分布方式,在制作像玻璃,人造砖墙之类的特殊物件就很有用
- 平面,网格体,自定义这三种模式没有前面那么随机,可以依据物体特定的材质,比如石块,木头来控制切割面的外形。其中平面是手动摆放一个无限大的平面来进行切割。网格体是可以用其它任意形状的静态网格体对它进行布尔切割。自定义模式可以让我们手动的来调整每簇种子的位置,特别是在动画的镜头制作中,我们往往会预先设计好破碎发生的位置,这时候我们就可以用自定义的工具,把预先知道会破碎的区域切的更细,效果会更自然。
具体演示看视频
小碎块状态的设置
渲染层
- 断面材质
- UV
- 模型数据烘焙
- Embed:驱动其它物体
模拟层
- 小块处理
出于解算稳定性的考量,不要切割出太多的小碎块。小碎块一方面很容易穿插,另一方面容易在碰撞的接触面抖动,会对我们的视线造成一定的干扰,一些细节的小沙石可以用特效粒子来表现。另外工具栏中的TinyGeometry功能也可以帮我们查找到过于小的碎块,并且可以设置自动和周围的大块做模型的合并。
动态调整
破碎的控制可以大致分为两个部分,一个是破碎阈值的设置,另外就是物理场的设置。
Damage Threshold
- 按Cluster层级
- 按碎块大小
物理场
- Anchor Field:固定碎块 把范围内的所有碎块设置为Static。
- Sleep/Kill Field:稳定/移除碎块 帮助碎块在撞击级地面后快速稳定下来,游戏中很常用。
- FS_Master_Field:触发破碎,控制形态 通过施加String人为的控制哪些区域需要打碎,通过添加力或者设置速度来调整碎块爆炸时候的形态。
具体演示看视频
次级元素和缓存动画调整
具体看内容示例的例子,不做过多展开。
角色物理
RBAN
具体演示看视频
布料模拟
Chaos Cloth特性
对比UE4
- 更精确的碰撞
- 取消碰撞体个数限制
- 支持Taped Capsule,Multi Convex Hull
- 自碰撞效果优化
- 更方便的环境交互
- 环境碰撞
- 风,物理场
- 材料表达
Chaos Cloth制作建议
适用于影视
-
参数设置
- Use Bending Element (对布料弯曲的计算更精准)
- Collision:CCD,自碰撞 (对运动比较大的布料)
- Iteration与Subdivision (针对快速移动的角色可以把Subdivision 开高点)
-
Proxy Simulation Mesh
- 拓扑均匀舒展
- 面数合理
- 多Mask支持
- 最大距离
- 材料属性
- 风力影响
- 法线反方向活动限制
- 动画驱动强度
- …
- Mask绘制
- Brush Tool
- 从模型顶点色上拷贝