你的浏览器不支持canvas

让我们携手共创奇迹!

物理模拟

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是随手记得,很杂,在做的过程中一直改,还未整理,仅供参考

参考UE官方物理模拟

布娃娃基础

5分钟快速构建

How to Make an Easy Ragdoll in Unreal Engine 5 - YouTube

20分钟快速构建

UE4 Active Ragdoll Tutorial (GTA Ragdoll) - Updated 2021 + Mixamo Animation Retargeting

UE4 Active Ragdoll Tutorial (GTA Ragdoll) - Updated 2021 + Mixamo Animation Retargeting - YouTube

1小时复杂构建

Physical Animation: The Ultimate Starter Guide [UE4/UE5]

Physical Animation: The Ultimate Starter Guide UE4/UE5] - YouTube

微调物理限制部分

UE5 | Human Physics Constraints Setup for Ragdoll

[UE5 Human Physics Constraints Setup for Ragdoll - YouTube](https://www.youtube.com/watch?v=KTCn7fmC6pc)

完全版教程14集(推荐系统化学习使用,部分章节思维混乱)

Character ragdoll physics and animation - YouTube

如何触发布娃娃深度示例

Unreal Engine - Physical Animation Hit Reactions W/Trigger (Part 1) - YouTube

官方手册四篇-很简单

创建新的物理资产

[在虚幻引擎中创建新的物理资产 虚幻引擎5.0文档 (unrealengine.com)](https://docs.unrealengine.com/5.0/zh-CN/creating-a-new-physics-asset-in-unreal-engine/)

Physics-Based Animation

[Physics Driven Animation in Unreal Engine Unreal Engine 5.2 Documentation](https://docs.unrealengine.com/5.2/en-US/physics-driven-animation-in-unreal-engine/)

碰撞响应参考

[碰撞响应参考 虚幻引擎文档 (unrealengine.com)](https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Physics/Collision/Reference/)

动画姿势快照

[动画姿势快照 虚幻引擎文档 (unrealengine.com)](https://docs.unrealengine.com/4.27/zh-CN/AnimatingObjects/SkeletalMeshAnimation/PoseSnapshot/)

深度概念介绍(超越官方解释)

《Exploring in UE4》物理模块浅析原理分析] - 知乎 (zhihu.com)

II 物理模拟动画的概念解释

BODY的设置

  1. Mass ,默认是根据你Body上的体积自动计算的,我们可以更改。最终影响的是惯性

  2. LinearDamping:线性阻尼。控制Body的线性速度减缓强度。值越大,速度减小越快。

  3. AngularDamping:角速度阻尼。控制Body的角速度减缓强度。值越大,速度减小越快。

以上两个数值,若启用PhysicalAnimationProfile,一般不再设置这两个数值,Profile的值也影响该效果

  1. Enable Gravity:是否启用重力。关闭后不受重力影响,只受Body的惯性影响。

  2. 碰撞Reponse:是否和外部物体碰撞。需要和外部物体碰撞时打开,如在人群中穿行和碰墙壁

Physical animation Profile的设置

  1. Is Local Simulation:是在世界空间还是在局部空间,判断移动Kinematic时是全局还是相对父Body的。Orientation Strength和angular velocity strength主要和local配对

Position Strength和Velocity strength主要受world配对

  1. Orientation Strength:用于更正方向误差的力。值越大,越靠近动画的角度

  2. Angular Velocity Strength:用于更正角速度误差的力。值越大,速度稳定(向动画靠近)的越快。

  3. Position Strength:用于更正线性位置误差的力。仅可用于非局部模拟。值越大,越靠近动画的位置

  4. Velocaty Strength:用于更正线性速度的力。仅可用于非局部模拟。值越大,速度稳定(向动画靠近)的越快。

  5. Max Linear Force:用于更正线性误差的最大力。(设为0)

  6. Max Angular Force:用于更正角度误差的最大力。(设为0)

constrain Profile的设置

功能:局部控制。关节驱动身体靠近动画,靠近动画的姿势,而不影响Body的属性。如果靠PhysicalAnimationProfile驱动,会导致Body过于僵硬无法移动,ConstraintProfile解决了这个问题,但运动时需要PhysicalAnimationProfile去稳定Body的位置(全局的)。

原理:设置Constraint的Motor,setDrive驱动关联的两个Body到达动画的相对Rotation。

SkeletalMeshComponent需要设置Update Joints From Animation为true.

Angular Drive Mode需要设置为Twist and Swing,Motor才会生效。

Target Orientation: 不必设置,Update Joints From Animation会取动画来设置该Orientation。

Strength:向动画靠近的强度。值越大越靠近,10000的值基本和动画一致。

Target Velocity: 设为0即可。可理解为停下的快慢。 待做:添加Update Velocity From Animation,从动画中取得目标速度。

Strength: 值越大,当前速度越靠近目标速度。若Target Velocity为0,值越大,则移动速度越慢(靠近0)。

III 物理碰撞体预设定

有关physics asset的设定(非常非常重要)

  1. 第一要创建一个root的碰撞体,并且将物理类型修改为kinematic运动学。“官方的解释为其继承来自owner component的行为如接受controller的运动输入;但不接受物理模拟影响;同时还可以与物理模拟的形体部分进行交互,就是和其它物理模拟的骨头互相施加影响。另外,请关闭root的碰撞碰撞。

注意它的配置方式:物理类型-运动型、物理动画-全部参数为0,说白了就是不受物理模拟影响。

其次就是在它的线性和角度限制配置里面:XYZ、摆动1、2和扭动都为自由,也就是不受的子节点pelvis的约束。

  1. 接下来我们创建两个profile. Physical animation profile主要负责全局的约束参数限定,而constrain profile主要负责局部之间的互相约束,我们可以叠加使用这两种Profile。同时注意记录joint关节名称因为将来在蓝图里面用得到,我们自己创建的root碰撞体会有一个特殊名字如UserConstraint_1。

  1. 接下来我们可以按照这个逻辑进行归类。

A.形体上半身(从spine开始到head结束)

B.约束上半身(从spine02开始到head结束,注意忽略spine和pelvis因为pelvis的约束我们最后集中做)

C.形体下半身(从thigh_l/r开始到foot_l/r结束)

D.约束下半身(注意忽略thigh_l/r和pelvis之间的约束我们最后集中做)

E.形体

F.盆骨约束

A.形体上半身

这里的朝向强度、角速度强度、位置强度分别为500、100、500。上半身用这套效果刚刚好。

B.约束上半身

线性限制全部为锁定;角度限制全部为受限,如果有时间追求更精益求精的效果,可以逐项挨个设定三轴的角度限制方式和角度。

C.形体下半身

这里的朝向强度、角速度强度、位置强度分别为1000、100、1000。下半身朝向强度和位置强度比上半身高一倍比较稳。

E. 形体盆骨

这里的朝向强度、角速度强度、位置强度分别为1000、100、1000。

F.约束盆骨

注意pelvis到spine, thighl, thighr之间都是三轴自由度的。

IV 布娃娃系统-physical based animation基于物理模拟的人物动画 模块介绍

构建物理资产physics asset / 碰撞体设定

  1. 简单版本(全身物理模拟)

参考视频:

How to Make an Easy Ragdoll in Unreal Engine 5 - YouTube

  1. 复杂版本

2.1初始化物理模拟参数,关键节点为apply physical animation settings below,这个是用于设定全局的物理模拟参数如orientation strength定向强度、Angular velocity strength角速度强度、position strength位置强度、velocity strength速度强度。第二个关键节点为apply physical animation profile below.这个是用于设定人物的物理关节之间的约束关系的profile.

参考视频:

How to Make an Active Ragdoll (like Gang Beasts) in Unreal Engine 5 - YouTube

2.2 Physical Animation运行设置

注意以下仅仅为一个实例,除了一些原则性的框架不可修改外,可以根据自己实际使用需求进行参数的调整、触发方式的调整、是否混合普通动画和物理模拟动画等,都可以根据项目情况自行修正。

2.2.1 手动进入离开布娃娃系统

使用Set all bodies below simulate physics节点可以将某骨骼节点和之下、或之下的节点进行物理模拟,比简单版本的好处在于可以针对某一骨骼链进行物理模拟。Include self为是否包括自身骨骼节点。

使用sel all bodies below physics blend weight指是否和动画进行混合,权重为1是完全使用物理模拟,权重为0为完全使用动画,权重0.5为各50%进行混合并以此类推。

进入物理模拟后mesh和胶囊体实际是断开了,所以在恢复的时候需要调用attach component to component节点进行重新绑定,并且注意rule选择snap to target。另外注意mesh和胶囊体之间默认的offset也要恢复(-90,-90度)。

为了解决全身进入物理模拟后胶囊体和mesh断开后产生的四处乱跑情况,可以添加以下方式加以同步。

参考视频:

UE4 Active Ragdoll Tutorial (GTA Ragdoll) - Updated 2021 + Mixamo Animation Retargeting - YouTube

2.2.2落地进入布娃娃系统

使用Event on Land事件触发整个流程,基本逻辑为当落地速度大于某一临界值,则触发进入布娃娃系统。另外通过impulse施加一个冲量来触发布娃娃的反应。另外在进入布娃娃系统时关闭运动,延迟一段后再重启开启运动。

参考链接:

UE5 l Falling and Death Scene using Ragdoll 碰撞 l 5-Minute Tutorial l Unreal Engine 5 - YouTube

2.2.3 摔倒后向前或者向后爬起来

当接收到input如空格键起身的时候,人物蓝图character BP判断姿态是面朝天还是面朝地并选择相应的动画蒙太奇Anim Montage进行播放。判别逻辑很简单,就是用射线的方式检测人是向前还是向后的,然后决定爬起来的动画。这里容易出错的地方是因为character有默认的Z轴-90度旋转才能匹配轴向,所以要用get right vector来替代get forward vector来获取向前的向量。

判别后播放两种不同的起身动画

为了将趴着和爬起来的动作衔接的更加自然,使用了动画姿势快照功能,官方手册建议提前通读一遍。[动画姿势快照 虚幻引擎文档 (unrealengine.com)](https://docs.unrealengine.com/4.27/zh-CN/AnimatingObjects/SkeletalMeshAnimation/PoseSnapshot/)。具体的实现方式为首先捕获趴着的最后一帧作为姿态快照。注意这里在技术上需要用两次delay=0这个节点来保障完成快照动作。

然后在动画蓝图的执行过程中,在其中的Event Graph部分通过cast to character BP这种方式获取到snapshot变量并保存为本地变量以便后面在AnimGraph中进行混合。

在AnimGraph中,使用blend pose by bool 节点进行动画切换,个人感觉这个节点应该改名叫switch animation by bool似乎更贴切。

我们回到人物蓝图继续执行接下来的步骤,个动作执行完了后进行一些逻辑变量的设定以便应对各种复杂的动画中间变更状态如在从布娃娃切换到正常状态中不接受input驱动,如在未完成切换中可以继续接受碰撞事件再次触发布娃娃等。

2.2.4 人互相碰撞后踉跄的跑步效果

首先使用胶囊体检测人和人之间的碰撞或者重合事件以便进入物理模拟

同时使用力、冲量、速度作为运动输入.

延迟一段时间后平滑退出

其他

在物理资产编辑器编辑时一般是可以看到紫色的物理形体,如果看不到需要考虑是否开启了安卓预览模式,如果开启了需要关闭

可参考的工程模板介绍

Active Ragdoll

可以实现被撞击后进入布娃娃系统,这个蓝图整体切换逻辑写的有点随意比如使用flipflop,另外目前已经发现了循环逻辑的存在,所以建议整体框架上不要参考这个。这个蓝图的优点姿态判断部分这块不错,我们上文已经引用过。还有很多布娃娃系统的细节处理做的不错,这些细节素材都可以参考。

UE4 Multiplayer Ragdoll - YouTube 功能介绍

UE4 Multiplayer Ragdoll - Documentation Tutorial - YouTube 原理和使用介绍

UE4 Multiplayer Ragdoll - Issue Fix - YouTube 迁移后同步问题的解决

finterpto曲线如下

物理模块浅析原理分析

《Exploring in UE4》物理模块浅析原理分析] - 知乎 (zhihu.com)

基于物理的角色动画基础篇

【UE5】基于物理的角色动画(基础篇) - 知乎 (zhihu.com)

虚幻引擎中的物理动画总览 (里面提供了多套游戏的物理模拟制作思路链接,扩充经验非常好用)

虚幻引擎中的物理动画 - 总览 - 知乎 (zhihu.com)

抚摸小狗狗-很好的纯物理模拟原型思路

[New Character Physics in UE5: Can You Pet the Dog? GDC 2023 - YouTube](https://www.youtube.com/watch?v=FK7FBBdY5fY&t=192s)

深度解析基于物理后台公式

[UnrealOpenDay2020]虚幻引擎中基于物理的动画 EpicGames 马空_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1UV411a7Jq/?vd_source=5ddb04e10580087d44987f7aa59533c0)

基于程序的动画延展

Full Body IK: Procedural Dragon Animations - YouTube

使用建模工具添加碰撞


对于本文内容有问题或建议的小伙伴,欢迎提出问题