虚幻引擎 Physics Control Component 简介

5

主题

6

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-1 16:51:42 | 显示全部楼层
没想到Epic直接把整套物理动画方案实现出来了,而且看起来非常简单易用(比我自己写的好多了)。果然只要我够懒,Epic会把我想实现的都实现一遍。
本篇文章只是初步印象,随着自己的看法更新和Epic的代码更新,文章内容可能随时会变化。
前言

物理动画是3A的一个很重要的方向,既然MotionMatch已经开做了,Epic一定不会放弃物理动画这个方向的。另一方面,之前UE4的Physical Animation Component实在有点不尽人意,连Epic自己都无法做出什么能用的demo,无法说服大家去使用。(Fallen Order的实现方式也是基于Joint motor的)
正当大家默默自己写Moror代码,自己计算各种弹簧参数的时候,UE5.1发布了,大家发现了Epic居然做了一个全新的物理动画系统。这次的Physics Control 对比之前的Physical AnimationComponent相比简直是脱胎换骨一样,大家从Demo上看就知道,简单地把整个Physics Animation in Uncharted 4: A Thief's End[1]的几个重要Demo都给实现了。(蓝图上看的确很简单,天知道作者调参数时候掉了多少头发)
在这里,简单分析一下Physics Control的实现以及用法。这东西的完成度也太高了,可以愉快地玩一天。
原理

PhysicsControl 主要的实现还是靠关节系统。通过设置关节的LinearPosition Target和AngularOrientation Target来让自身的物理BodyInstance弹性地跟随着动画。因为设置的目标Transform是程序算的,所以可以很方便地支持世界空间和组件空间两套体系。
通过设置世界空间和组件空间的各种Spring参数,达到一个很好的物理动画效果。而且传入的参数是更好理解的Strength和DampingRatio,程序会帮你换算成Damping和Spring,不需要直接设置让人费解的Spring和Damping了。
关于Strength和DampingRatio可以参考一下文章:
关于物理动画的详细原理要参考我的上一篇介绍。[2]
内部组件介绍

首先Physics Control Component是一个入口,具体的操作都是针对里面的各个Control实现的。
Control(FPhysicsControl)

Control可以对单个骨骼控制,也可以对肢体(比如从大腿到脚)整体控制。
找到具体的Control主要靠名字,ParentSpace的名字是 父骨骼名字_子骨骼名字_0 ,WorldSpace的名字是 骨骼名字_0 。当然如果包装成Limb的话,直接用Limb的名字从数组里面找也可以。
Control Setting(FPhysicsControlSettings)

设置一些Control的初始设置,比如是否使用动画数据。动画的速度的倍率,是否自动禁用,是否禁止碰撞等。
Body Modifier(FPhysicsBodyModifier)

Body Modifier针对单个Body Instance。
MovementType可以很方便地控制这个肢体的模拟方式(Static 静止/Kinematic 动画/Simulated 模拟)
CollisionType可以控制这个肢体的碰撞方式(要不要跟物理世界有接触),某些接触物体的肢体需要关闭碰撞,不然会抖动。
GravityMultiplier可以调整重力缩放。
其他参数没发现有用到的,先不讲解了。
Control Data(FPhysicsControlData)

ControlData主要控制关节弹簧的各种参数,Strength主要是控制力度,DampingRatio控制弹簧到达的方式,一般设为1(临界阻尼)。设置物理动画主要通过分别设置各个肢体的本地空间/世界空间的力度,这样可以让角色更好地表现物理。
Control Multipliers(FPhysicsControlMultipliers)

Control Multiplier主要是可以对ControlData乘以一个倍率,这样可以更精细地控制XYZ方向的各种力度,和更方便地设置角度弹簧的力度。
Control Target(FPhysicsControlTarget )

控制具体的接触点的位置和角度,一般用于接触外部的Mesh的触点(比如要摸着别的东西)。这样关节的目标会到达这个目标触点。
如何设置一个角色

首先我们遵循官方的指引,去设置角色。


首先它会把角色的关节设为HingesOnly,其实就是肘部和膝盖被设成了Hinges(只开放Twist)。其他关节是完全自由的,这样角色应该会比较柔软,不会出现角色关节限制住想移动到的位置的问题(表现为抖)。
然后再为世界空间和本地空间(这里叫ParentSpace)各创建一套Controls。
最后创建一套Modifiers,用来快速切换各个部分(Body)的模拟方式。
如何使用

使用的话就很简单了,我们首先把所有的Modifier设置成Simulated。然后把需要动画控制的部件,单独切换为Kinematic。
然后我们把需要的世界空间/本地空间的控制都打开。世界空间的控制的话看你要把哪些肢体拉到世界空间的位置,本地空间控制则是把关节调整到动画的角度,力度越大拉力越强,越还原动画的姿势
Drive示例是选择把脊椎链的世界空间控制打开(背靠座位),然后所有部位的本地空间控制都打开。
悬挂Demo是把上半身控制到世界空间位置(力度各不相同,这调参得要多久),下半身和头控制到本地空间的角度。
如果角色需要捉住外部的东西,则用Make Control来增加控制器,只需要把外部的Mesh和挂点设置Control Target传进去就可以了。Strength设特别大让骨骼可以紧跟目标。Drive的Demo通过这个方式来实现握方向盘和拉手柄(这就是程序化动画>_<)。
我们可以通过简单的几行蓝图代码给Driver示例增加一个扶着车门的乘客。(再复制粘贴2个我们就实现了神海Demo了)





乘客1

后话

Physical Control的开发是Danny Chapman,看介绍还是Euphoria的开发,真羡慕Epic这种想做好哪个功能就把人挖过来写好的魄力。
要做好物理动画,简单的参数只是第一步,Ragdoll的关节设置(每个关节的Twist轴和Swing轴朝向其实都有讲究的),还有不同场景里面的不同躯体的刚度设置,这些才是核心难点,是需要不断尝试沉淀的(物理很残酷的,参数不对的话就会抖)。不过有了官方的demo,大家可以快速地复制一份,可以更快地应用在自己的项目上。
看示例,最好配合着Physics Animation in Uncharted 4: A Thief's End一起看,这样可以明白每个部分的意义。
之后应该也会出一个Profile功能(自己写也很快),不同的场景直接切换不同的Profile,不用苦兮兮地逐个设置参数。
参考


  • ^Physics Animation in Uncharted 4: A Thief's End https://www.youtube.com/watch?v=7S-_vuoKgR4
  • ^虚幻引擎中的物理动画 - 总览 https://zhuanlan.zhihu.com/p/507489982
回复

举报 使用道具

1

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-1 16:52:20 | 显示全部楼层
这个demo哪里获取呢
回复

举报 使用道具

0

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2022-12-1 16:52:32 | 显示全部楼层
5.1的示例内容
回复

举报 使用道具

1

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2022-12-1 16:53:14 | 显示全部楼层
虚幻不是一直有个自家的DEMO,每次更新都会往上面添加案例,去更新就行了。
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表