--- title: AdvancedLocomotionV4学习笔记(1)——动画节点 date: 2022-08-24 09:39:43 excerpt: 摘要 tags: rating: ⭐ --- # 前言 本人最近在学习AdvancedLocomotionV4,并尝试将其中可用部分移植到自己的项目上。在此分享一些自己的心得。 ## 学习建议 首先应该从动画蓝图ALS_AnimBP看起,Editor为后处理动画蓝图可以跳过。个人建议从AnimatoinGraph开始看,你可以学习到状态机的层次逻辑、合理的动画图表折叠模式、IK的实现、动画融合逻辑(之后的文章我会举个例子说明)。 其中的相关变量驱动着状态机切换与动画融合,所以下一步你需要看UpdateGraph(AdvancedLocomotionV4将事件与更新逻辑分成了2个Graph),之后是EventGraph。这里是动画蓝图与角色类的数据沟通与变量更新逻辑都在于此。完成以上两个步骤后,你就了解了这个项目的总体脉络了,但还是推荐先把熟悉一下Ue4相关的动画要点。 ## Anim Modifiers 一种用于修改 Animation Sequence 或者 Skeleton Asset的蓝图类。 例如,精确定位左脚或右脚踩到地面时的帧来创建自动脚部同步标记(等诸如此类的各种应用)。通过使用该信息,可以将 动画同步标记 添加到脚部骨骼处于最低点(或接触地面)时的帧。 在AdvancedLocomotionV4中有大量的同步组、AnimNotify、以及曲线,纯靠手动指定费事费力。所以本人尝试制作了相应的AnimModifier,将在下一篇文章中分享。相比之下AdvancedLocomotionV4的Anim Modifiers做的就十分的菜了,让人怀疑是不是作者在隐藏些什么。 ## Virtual Bones 有了它就无需因为要制作Ik、FK等效果,而将原始美术资源返工重做。不过4.24有个限制就是无法重复添加相同父骨骼与相同目标骨骼的虚拟骨骼。 注意:LHS_ik_hand_gun用在后处理类型的动画蓝图Editor。 ## Anim Curve 可以在SkeletonAsset编辑器中查看所有的Curve,并且进行添加。 之后就可以在AnimationSequence中添加Anim Curve。但有个尴尬的问题就是无法查看哪些AnimationSequence设置了指定Curve。没有很好的引用关系图,这让学习项目的人十分头疼。总不可能为了学习而去写一个编辑器插件吧…… ## Pose Blend 与 Pose Driver 这个两个东西和流程相关,如果没有特殊流程,只适合于制作表情系统或是较为简单的动画。(有大佬告诉我还可以做肌肉效果,毕竟表情也是一种肌肉效果……) ## 节点 ### FABRIK 俗话说的正向动力学,关节弯曲效果。 ![image](https://docs.unrealengine.com/4.27/Images/AnimatingObjects/SkeletalMeshAnimation/IKSetups/diagram_FK.webp) ![image](https://docs.unrealengine.com/4.27/Images/AnimatingObjects/SkeletalMeshAnimation/IKSetups/diagramIK.webp) ### 转换空间节点 LocalSpace(局部空间):骨骼变换坐标系为其父骨骼所在坐标系。 ComponentSpace(组件空间):骨骼变换坐标系为SkeletalMeshComponent所在坐标系。 使用他们的原因在于,动画蓝图默认处于 局部空间。但特定的混合节点和所有的Skeletal Controls节点都处于组件空间中。所以在使用这些节点时需要进行空间转换。 注意:空间转换会带来性能损耗,所以建议把Skeletal Controls节点都放在一起进行计算。 ### Skeletal Controls #### AnimDynamics 这个节点是一个小型动力学解算器。可以给SkeletalMeshComponent提供一些次要的物理效果。可以用来给锁链、头发、披风加上简单物理效果。 需要注意: - 惯性效果是通过把骨骼转换为Box来计算的 - 不计算碰撞,但计算在物理资源中设置的约束 ![image](https://docs.unrealengine.com/4.27/Images/AnimatingObjects/SkeletalMeshAnimation/NodeReference/SkeletalControls/AnimDynamics/AnimDynamicsChain.gif) #### Apply a Percentage of Rotation 从指定骨骼获取旋转值,并按照指定比例应用到目标骨骼上。 #### Copy Bone 将指定骨骼数据复制到另一个骨骼上。将上面的模拟效果复制到另一侧的弹药包上。 #### Observe Bone 在界面中显示指定骨骼的Translate信息。 #### Spline IK 样条 Ik解算。用于模拟类似脊椎之类的样条结构骨骼动画效果。 #### Spring Controller 弹簧控制器,用于模拟因为前一个动作所造成的反作用力效果,就好像指定处的骨骼换成了弹簧。 #### Trail Controller 轨迹控制器,可以用于类似贪吃蛇之类动画效果。 #### Look At 让指定骨骼朝向目标骨骼位置。 #### Modify Curve 修改指定名称的曲线值(在Animation Sequence中),曲线值可以在材质、Niagara、蓝图中获得。 #### Rigid Body 使用在物理资源中设置碰撞体数据进行物理效果模拟。 在使用此节点之前,先在骨骼大纲视图选中所有需要模拟骨骼,点击右键将其设置为 Simulated 类型。 ![image](https://docs.unrealengine.com/4.27/Images/AnimatingObjects/SkeletalMeshAnimation/NodeReference/SkeletalControls/RigidBody/RigidBody_02.webp) ![image](https://docs.unrealengine.com/4.27/Images/AnimatingObjects/SkeletalMeshAnimation/NodeReference/SkeletalControls/RigidBody/RigidBody_11.webp) #### Hand IK Retargeting 对应用了IK效果的骨骼进行重定向。按照给定参数向指定的FK骨骼进行偏移。 #### Two Bone IK 适用于两根骨骼的反向动力学解算节点。 #### CCDIK 4.21加入的节点。轻量级,可用于驱动一段骨骼链。CCDIK提供了定义角约束的功能,需要在解算中限制任意骨骼的旋转时较为实用。 #### Bone Driven Controller 通过其中一个骨骼信息来设置另一个骨骼的信息。 例如B.Localtion.x=A.Localtion.y; https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/SkeletalMeshAnimation/NodeReference/SkeletalControls/BoneDrivenController/ ### 视频推荐 Cesar SC制作了UE4 Skeletal Controls系列视频,里面有简单演示过程,可以帮助你理解以上节点。 https://youtu.be/FrwB6iVh_DY ## PhysicalAsset 刚体类型:有用于碰撞的、也有用于模拟的(用来做肚子上的肥肉效果)如果模拟中出现乱弹现象可以通过删除部分重叠刚体的碰撞来解决。4.18改善了编辑器,可以更好地观察刚体、约束、骨骼之间的关系。操作也方便了。具体的可以去看官方的视频。 ## 布料与碰撞 通过在PhysicalAsset中创建胶囊来实现布料碰撞(布料只支持胶囊体) 注意:我在这个过程中遇到了碰撞失效的问题,后面发现是因为根骨骼的scale值不为1造成的,动画外包在导出文件时候,场景单位和导出单位设置有问题造成的。 ### biped骨骼与rootmotion Biped骨骼的根骨骼会强制定义为Biped001,且无法修改。所以为了匹配Ue4的RootMotion动画规则。我们需要在在Biped001根节点外面再加一条Root骨骼。 经过测试,其他商城中的RootMotion动画也可以正确地重定向Biped骨骼中。 ### 布料与环境碰撞 想要与环境碰撞,比就必须要StaticMesh的mobility 设置为Static。 在角色的SkeletalMesh中检查cloth-Collide with Environment是否勾选。并且关闭Collide with Attached Children选项。 ## 其他有用功能 自动重新导入功能,在编辑器设置-General-Loading & Saving-Auto Reimport。动画师会十分喜欢这个功能,因为在DCC保存动画数据后,Ue4就会自动更新,不用再去点ReImport了。