亚纳虚幻学院 动画基础 下
[TOC]
第10课 初识动画蒙太奇
AnimMontage:动画剪辑,音译为蒙太奇
10.1 创建动画蒙太奇
-
在内容浏览器中,**右击 动画 动画蒙太奇** - 双击进入蒙太奇编辑器
- 动画蒙太奇资产不能直接拖入状态机
10.2 利用蒙太奇片段将一个长动画分割
-
将动画资产导入蒙太奇序列
-
将时间轴移动到分割点,**右键 新建蒙太奇分段** -
在右侧的蒙太奇片段窗口,可以设置不同片段的连接关系
- 如果下一个片段选择当前片段,则会在这一个片段不断循环
- 鼠标拖动片段上的紫色箭头,可以修改片段的起始时间
10.3 通过 动画蓝图 使用 动画蒙太奇
10.3.1 修改角色动画蓝图
-
从Defaut状态机中拉出一条线,输入slot,找到插槽DefaultSlot
-
在细节面板中的插槽名称选择动画蒙太奇面板中的插槽名称
-
10.3.2 修改角色蓝图
- 添加鼠标左键事件,触发播放蒙太奇事件
- In Skeletal Mesh Component:该角色的网格体
- Montage to Play:刚刚创建的动画蒙太奇资产
- Starting Section:动画蒙太奇资产中的哪一片段
- 注意是从完成时 ==> 下一个事件
10.4 优化
10.4.1 当玩家不再按鼠标左键时,停止循环播放攻击动画
- 修改角色蓝图
- 添加一个变量MouseLeft,表示鼠标左边是否按下
- MouseLeft为真时,才能播放第二段动画,否则不播放第二段动画
- 注意是从完成时 ==> 下一个事件
10.4.2 当玩家连续按鼠标左键时,不会重复播放第一段动画
-
修改动画蒙太奇资产
- 在动画的开头和结尾处各添加一个通知,表示动画的开头/结尾
-
修改角色蓝图
- 添加变量Jump1?,表示Jump1动画是否播放完
- 变量的初始值为true
-
修改角色动画蓝图
-
从玩家身上获取Jump1?变量,并进行相应的修改
-
初始化时,获取角色的蓝图类
-
获取动画通知事件,同时对Jump1?变量进行相应的修改
-
-
第11课 动画分层混合
- 确定从哪个骨骼开始分割动画,这里选择spine_01
11.1 修改AnimGraph
-
将默认的状态机的输出姿势保存下来(类似一个变量,便于后续调用)
-
借助分层混合函数,将动画分层混合
- Base Pose:基础动画
- Blend Poses 0:第0个混合动画
- Blend Weight 0:第0个混合动画的混合权重,范围为0~1
- 可以通过添加引脚,将多个动画混合起来
-
在分层混合函数的**细节 配置 层设置 分支过滤器**中,将分割动画的骨骼输进去 - 如果混合动画有旋转,则需要勾选网格体空间旋转混合
- 如果混合动画有缩放,则需要勾选网格体空间缩放混合
- 修改混合深度,可以让两个动画混合的更加自然
- 可以添加多个骨骼,混合多个地方的动画
第12课 使用瞄准偏移
12.1 瞄准偏移1D
12.1.1 创建 瞄准偏移1D 资产
-
在内容浏览器中,**右键 动画 瞄准偏移1D**
12.1.2 创建 向左/右看 的动画姿势
-
先将静止状态的动画复制一份,作为参考,命名为Idle
-
进入动画编辑界面,在**资产详情 附加设置**中 - Additive动画类型:网格体空间
- 基础姿势类型:选择的动画帧
- 将ThirdPersonIdle拖入到下方的参考动画
-
将Idle动画复制2份,作为修改动画的起始点
-
修改Idle动画
-
由于我们只需要Idle的姿势,因此可以将后面的动画帧都删除
-
**右击上面的红箭头 移除帧1到帧79之间的帧**,删除后面的所有动画帧
-
-
修改Idle_1动画,将其修改为向左看动画Left
- 选中spine_02骨骼,将其向左旋转60°,然后再将head骨骼向左旋转30°
- 点击关键帧,然后点击应用
- 这个也不需要动作,只需要一个姿势,因此可以将后面的动画帧都删除
-
修改Idle_2动画,将其修改为向左看动画Right
- 选中spine_02骨骼,将其向右旋转60°,然后再将head骨骼向右旋转30°
- 点击关键帧,然后点击应用
- 这个也不需要动作,只需要一个姿势,因此可以将后面的动画帧都删除
12.1.3 在瞄准偏移1D中应用上述动画姿势
-
修改水平坐标的信息
- 名称设置为Z,表示Z轴方向的旋转
- 范围为-90~90
-
将Idle、Left、Right分别拖入到表中
- 此时这三个动画均只有第1帧,因此可以拖进去
12.1.4 修改动画蓝图
-
在AnimGraph中,将刚刚的瞄准偏移1D资产拖入
- BasePose:为状态机的输出姿势
- Alpha:表示混合程度
- Z:是刚刚自定义的水平坐标名称,将其提升为变量
-
修改事件图表,修改Z的值
-
首先,获取角色蓝图ThirdPersonCharacter,并将其提升为变量
-
从ThirdPersonCharacter变量中
- 首先要获得两个旋转:控制旋转、Actor旋转
- 将这两个做一个差量:控制旋转 - Actor旋转
- 将差量的结果做一个R差值,让旋转更加平滑
- R差值的Current是(0, 0, Z)
- R差值的Target是刚刚计算出的差量,即需要旋转到的角度
- DeltaTime是帧更新的时间,从事件蓝图更新动画中获取
- Interp Speed可以控制动画的响应时间,当值偏大时,正常移动会非常流畅,但是到达临界值时,角色会很快的跳到另一个方向。这里设置为10
- 将差值获得的旋转体拆分,获取其Z轴旋转
- 将获取到的Z轴旋转限制角度,范围为-90~90
- 最终得到的值用于设置Z
-
12.2 瞄准偏移
- 使用动画初学者内容包中的角色蓝图Ue4ASP_Caracter
- 在细节中,将自动控制玩家设置为玩家0
- 使用其中的动画Aim_Space_Hip进行操作
12.2.1 创建 瞄准偏移 资产
-
在内容浏览器中,**右键 动画 瞄准偏移** - 选中当前使用的骨骼
12.2.2 创建 待机/向八个角度看 共9个动画姿势
-
将动画Aim_Space_Hip复制9份
-
在每一个动画,类似于12.1.2中的操作,抽取出1帧的动画姿势
-
选中这9个动画,**右击 资产操作 通过属性矩阵进行批量操作** - 修改AdditiveSettings
- 注意这里基础姿势动画是动画资产,而不是刚刚创建的9个动画姿势,这里选择了Idle_Rifle_Hip
12.2.3 在瞄准偏移中应用上述动画姿势
-
修改水平坐标的信息
- 名称设置为Z,表示Z轴方向的旋转
- 范围为-90~90
-
修改垂直坐标的信息
- 名称设置为Y,表示Y轴方向的旋转
- 范围为-90~90
-
将Idle、Left、Right、LeftUp、LeftDown、RightUp、RightDown分别拖入到表中
12.2.4 修改动画蓝图
-
在AnimGraph中,将刚刚的瞄准偏移1D资产拖入
- BasePose:为状态机的输出姿势
- Alpha:表示混合程度
- Z:是刚刚自定义的水平坐标名称,将其提升为变量
- Y:是刚刚自定义的水平坐标名称,将其提升为变量
-
修改事件图表,修改Z、Y的值(与1D类似)
- 首先,获取角色蓝图Ue4ASP_Character,并将其提升为变量
- 从Ue4ASP_Character变量中
- 首先要获得两个旋转:控制旋转、Actor旋转
- 将这两个做一个差量:控制旋转 - Actor旋转
- 将差量的结果做一个R差值,让旋转更加平滑
- R差值的Current是(0, Y, Z)
- R差值的Target是刚刚计算出的差量,即需要旋转到的角度
- DeltaTime是帧更新的时间,从事件蓝图更新动画中获取
- Interp Speed可以控制动画的响应时间,当值偏大时,正常移动会非常流畅,但是到达临界值时,角色会很快的跳到另一个方向。这里设置为10
- 将差值获得的旋转体拆分,获取其Y、Z轴旋转
- 将获取到的Y、Z轴旋转限制角度,范围为-90~90
- 最终得到的值用于设置Y、Z
12.2.5 修改角色蓝图
-
将**细节 Pawn 使用控制器旋转Yaw**取消勾选
第13课 开发角色FOOT IK系统
- 逆向运动学Inverse Kinematics,简称IK
- 正向运动学:即从骨骼的上级到下级进行旋转来达到自己想要的姿势,这是一个正向的思维。
- 逆向运动学:是已知最后想要达成的姿势,然后反求出骨骼们的旋转。
13.1 修改骨骼体
-
在脚部骨骼foot_l、foot_r处添加两个插槽foot_l_Socket、foot_r_Socket,用于判断脚部与地面的碰撞关系
13.2 修改角色动画蓝图
13.2.1 修改AnimGraph
13.2.1.1 添加双骨骼IK函数
-
添加双骨骼IK函数
-
Effector Location:会直接影响当前选中的骨骼
-
Joint Target Location:会影响与当前骨骼有关的关节
-
将Effector Location分割结构体引脚,将Effector Location X提升为变量,重命名为LeftFootIK
- 通过实验可知,要想让角色的脚向上抬,只需要修改Effector Location X
-
在函数的细节处,进行修改
-
**细节 IK:IK骨骼选择foot_l**骨骼 -
**细节 效果器:执行器位置空间选择骨骼空间,执行器目标为foot_l** -
**细节 关节目标:关节目标位置空间选择骨骼空间,关节目标为calf_l**(即foot_l骨骼的上一根骨骼)
-
-
-
复制一个双骨骼IK函数,绑定为foot_r骨骼,重复上述操作
- 注意RightFootIK要进行反向计算,即乘-1
13.2.1.2 对应修改根骨骼的位置
-
由于在上台阶的时候,整体的高度会发生变化,因此我们需要修改根骨骼的位置
-
添加变换(修改)骨骼函数,将Translation分割结构体变量,将Translation Z提升为变量,并将其重命名为BodyZ
-
在函数的细节处,进行修改
-
**细节 骨骼控制:要修改的骨骼设置 为 **pelvis(即控制全身位置的骨骼) -
**细节 平移:平移模式设置 为 **添加至现有
-
-
13.2.1.3 整体蓝图
13.2.2 修改事件图表
13.2.2.1 获取角色的蓝图类
首先,在蓝图初始化时,获取角色的蓝图类ThirdPersonCharacter,提升为变量,重命名为Character
13.2.2.2 自定义函数Track:计算碰撞点与角色之间的距离
函数功能:通过Start==>End连线,进行碰撞检测,返回碰撞点 与 角色网格体 之间的距离
- 添加由通道检测线条函数
- Start、End直接拖为函数的输入
- Draw Debug Type:设置为 针对一帧,便于后续调试
- 从Character ==> 网格体 ==> 场景位置,获取角色的当前位置,并将返回值进行分割
- 将由通道检测线条函数的OutHit信息拆分
- 将击中位置信息OutHitLocation进行拆分向量,并且将Z坐标与场景位置的Z坐标相减,从而算出击中位置与网格体位置之间的距离
- 判断由通道检测线条函数的返回值,从而判断是否发生了碰撞
- 当发生碰撞(即为真)时,添加一个返回节点,将上一步算出的距离返回
13.2.2.3 自定义函数SetFootIK:修改AnimGraph中两脚IK的位置
添加函数SetFootIK,并将其拖到事件蓝图更新动画的后面执行
13.2.2.3.1 通过双线检测,计算角色与地面碰撞点的距离
-
首先,要获取之前添加的两个插槽foot_l_Socket、foot_r_Socket的位置,并将返回值拆分
-
将刚刚的函数Track拖入,创建两个,分别负责左脚和右脚
- 由于抬脚不影响X、Y轴,因此将插槽的X、Y位置直接拖入Track的Start、End的X、Y位置
- 将Track计算出的 碰撞点与角色之间的Z轴距离 提升为变量,分别重命名为LeftFootResult、RightFootResult
- 但是这里只向Track函数传递了检测线的X、Y轴位置信息,Z轴位置信息会在之后通过胶囊体的位置计算出来
-
通过胶囊体的位置信息,得到检测线的Z轴位置信息
- 首先,从Character中获取胶囊体组件
- 然后,从胶囊体组件中,获取胶囊体半高、胶囊体的场景位置
- 进行运算:
- 胶囊体Z位置-胶囊体半高/2:赋值给两个Start的Z信息
- 胶囊体Z位置-(胶囊体半高/2+胶囊体半高):赋值给两个End的Z信息
-
总蓝图
13.2.2.3.2 修改角色整体高度信息BodyZ
-
首先,将RightFootResult、LeftFootResult拖入
-
将两个值进行一个比较选择
-
使用F插值,将两者中的较小的值给到BodyZ中,作为角色整体上升的高度:角色的重心高度取决于较低的那个腿
- Current:之前的BodyZ值
- Target:两者中的较大值,即新的角色与地面的距离
- DeltaTime:场景差量
- Interp Speed:直接提升为变量,默认值设为5,数值越大,变换越快
-
总蓝图
13.2.2.3.3 修改角色双脚的IK信息
-
修改左右脚IK信息
- 首先
- 将右脚的移动距离:RightFootIK ==> BodyZ的绝对值+RightFootResult
- 将左脚的移动距离:LeftFootIK ==> BodyZ的绝对值+LeftFootResult
- 当右脚距地面近时,先设置右脚,再设置左脚
- 右脚的IK信息:RightFootIK ==> BodyZ的绝对值+RightFootResult
- 左脚的IK信息:LeftFootIK ==> BodyZ的绝对值+LeftFootResult ==> 0
- 当左脚距地面近时,先设置左脚,再设置右脚
- 左脚的IK信息:LeftFootIK ==> BodyZ的绝对值+LeftFootResult
- 右脚的IK信息:RightFootIK ==> BodyZ的绝对值+RightFootResult ==> 0
- 首先
-
总蓝图
13.3 优化
13.3.1 删除调试信息
-
在Track函数中,将Draw Debug Type删除
13.3.2 修改膝盖的位置
-
在**动画蓝图 AnimGraph中,修改双骨骼IK Joint Target Location**,左腿为(60,-10,0),右腿为(-60,-10,0)
第14课 初始角色物理动画系统
14.1 启用物理系统
14.1.1 修改角色蓝图
14.1.2 修改关卡蓝图
14.2 物理资产
- 点击模拟后,按住Ctrl+鼠标右键,可以拖动角色,从而检查物理效果的绑定情况
- 紫色的透明胶囊体是角色的碰撞体,物理模拟时是根据胶囊体进行模拟的
14.2.1 添加自定义碰撞体
-
选中某一个骨骼,**右键 添加/替换形体** -
默认添加的碰撞体类型是**工具 基元类型**中的碰撞体类型 - 单凸包、多凸包:会根据网格体的类型,创建一个碰撞体
- 与原网格体吻合较好
- 但是面数多,需要的计算量大
-
一般常用的就是盒体、胶囊体、球体
- 单凸包、多凸包:会根据网格体的类型,创建一个碰撞体
14.2.2 对碰撞体进行约束
-
在骨骼树中,选中所有的形体
-
在图标中,选择所有的约束
-
点击转为骨骼,即可将碰撞体的旋转范围进行约束
- 转为球形和插槽:可以任意旋转、甩动
- 转为转轴:只能进行旋转
- 转为棱柱:只能进行甩动
-
碰撞体上红色、绿色区域表示形体可以旋转、扭动的范围
-
约束(即图标中的黄色蓝图)
-
表示 当前骨骼 与 另一个骨骼 之间的运动关系
-
在**细节 Angular Limits**中,可以修改当前约束的扭动角度范围 - 自由:表示当前轴可以任意扭动
- 受限:表示当前轴只能在一定角度范围扭动
- 锁定:表示当前轴不能扭动
-
在**细节 Linear Limits**中,可以修改当前约束的扭动长度范围,但是不常用,一般情况下都是锁定
-
-
如果模型较小,可以直接全选骨骼,然后添加单/多凸包形体,然后选中所有约束,转为骨骼
14.3 将头发绑定到角色身上
14.3.1 修改角色骨骼体
- 在head骨骼处添加一个插槽headSocket
14.3.2 修改角色蓝图
- 添加组件骨骼网格体组件,作为网格体的子组件
-
**细节 网格体 骨骼网格体**处,选择头发的网格体 -
**细节 插槽 父项套接字处,选择headSocket**,然后修改头发的位置
14.4 让头发飘起来
14.3.3 修改头发的物理资产
-
选中所有需要飘动的形体(即除了根骨骼上的碰撞体之外的碰撞体),在**细节 物理 物理类型处选择模拟** - 可以通过调整约束,调整头发的摆动幅度
14.4.2 修改角色蓝图
-
在**胶囊体组件 细节 碰撞 碰撞预设处,选择IgnoreOnlyPawn** -
在**网格体组件 细节 碰撞 碰撞预设处,选择Custom,并将碰撞响应 Pawn改为阻挡,并将碰撞已启用改为已启用碰撞** -
在**骨骼网格体组件Hair 细节 碰撞 碰撞预设处,先选择RagDoll,然后再选择Custom,并将碰撞响应 Pawn改为阻挡,并将碰撞已启用改为已启用碰撞**
第15课 初识虚幻布料系统
- 飘动效果越逼真,要求模型上的网格数量越多
15.1 在3DMax中创建一个旗帜
- 进入前视图,创建一个平面
- 进入顶视图,创建一个圆柱体
- 选中两个物体,进入图解视图
,将旗子的骨骼绑定在旗杆上面
- 选择连接工具
,将旗子绑定在旗杆上
- 选择连接工具
- 选中两个物体,将坐标归零
- 坐标在界面的下方
-
**文件 导出 游戏导出器,将旗帜导出为banner.fbx**
15.2 在UE中使用旗帜
15.2.1 导入旗帜
- 将banner.fbx导入,注意导入为骨骼网格体
15.2.2 修改碰撞体
- 进入物理资产,修改旗杆的碰撞体,旗子不需要设置碰撞
15.2.3 修改材质为双面
- 进入旗帜的材质编辑器,将材质修改为双面
15.2.4 修改网格体:创建布料数据
-
进入骨骼网格体编辑器,选择片段选择,选中旗子,**右键 从分段创建布料数据** - 物理资产选择当前旗子的物理资产
- 点击创建后,可以在布料视图发现多了一个布料数据flag_Clothing_0
-
再点击旗子,**右键 应用布料数据,选择刚刚创建的布料数据flag_Clothing_0** -
点击激活布料绘制,开始绘制布料
-
在**细节 笔刷 半径**处,可以修改笔刷的半径(绿色圆) -
在**细节 Tool Settings Paint Value**处,可以修改笔刷的布料权重 -
值越大,笔刷刷过的地方飘动幅度越大
-
如上图,浅色的地方权重为100,深色的地方权重为50,模拟效果如下
-
-
在接近旗杆的地方,要留一部分不刷,防止旗子掉下来
-
如果旗子的边角出现问题,可以换一个更大的权重,将边角再刷一边
-
15.3 添加方向风源
-
进入场景,在放置Actor中,选择方向风源
-
在**细节 指向性风源组件中,可以修改风的强度和速度**
第16课 使用动画层接口
作用:将角色的一部分动画逻辑独立出来,做成一个接口进行调用
16.1 创建动画层接口
-
进入内容浏览器,**右击 动画 动画层接口**,双击进入编辑器 -
**我的蓝图 动画层**,是在其他地方调用当前动画层的接口 -
**细节 输入姿势**,代表将一个动画从子级输出给父级的输出过程
16.2 创建子级的动画蓝图
-
进入内容浏览器,**右击 动画 动画蓝图**,双击进入编辑器 -
在这个动画蓝图中,我们不需要待机、奔跑等动画,只需要目标的动画系统,如攻击系统(技能1,技能2…)
-
点击类设置,在**细节 接口 已实现的接口处,选择刚刚添加的动画层接口TestAnimLayerInterface** -
在**我的蓝图 动画层中,选择动画层接口中创建的动画层Ts**,双击进入 -
根据需要,修改输出姿势的逻辑
-
这里以播放ThirdPersonJump_Loop为例
-
16.3 修改角色的动画蓝图
-
点击类设置,在**细节 接口 已实现的接口处,选择刚刚添加的动画层接口TestAnimLayerInterface** -
双击进入Ts动画层,将输入姿势与输出姿势相连
-
进入AnimGraph,添加关联的动画图层
-
**细节 设置 层中,选择Ts**动画层
-
16.4 修改角色蓝图
-
进入事件图表,添加鼠标左键事件
-
将网格体拖入角色蓝图,拉出来关联类动画图层、取消关联类动画图层,InClass选择刚刚新建的动画蓝图TestAnimBlueprint
第17课 使用动画共享设置
作用:将一个模型的动画状态,共享到另一个模型身上,批量设置多个相同属性角色的动画
17.1 创建动画共享设置(1)
-
进入内容浏览器,**右击 动画 动画共享设置**,双击进入编辑器 - 命名为TestAnimationSharingSetup
- 如果没有,可以在插件中搜索Animation Sharing启用该功能
-
在**细节 动画共享 骨骼设置**中,点击➕添加一个骨骼 - 骨骼选择UE4_Mannequin_Skeleton
- 骨骼网格体选择SK_Mannequin_Female
- 状态处理器类新建一个NewAnimationSharingProcessor,保存在Asset文件夹中
17.2 创建枚举类
-
进入内容浏览器,**右击 蓝图 枚举**,双击进入编辑器 - 命名为TestUserDefinedEnum
-
枚举值设置为idle、jump、run
17.3 修改状态处理器类(1)
-
在**细节 动画共享 动画状态枚举中,选择刚刚创建的枚举类TestUserDefinedEnum** -
在**我的蓝图 函数 重载中,选择处理Actor状态**
17.4 创建新角色
-
进入内容浏览器,**右击 蓝图类 角色**,双击进入编辑器 -
命名为TestBlueprint
-
网格体选择SK_Mannequin_Female
-
位置、旋转修改如下
-
-
添加一个变量共享动画,类型为刚刚创建的枚举类TestUserDefinedEnum
-
修改事件图表
- 添加创建动画共享管理器,Setup选择刚刚创建的动画共享设置类TestAnimationSharingSetup
- 添加获取动画共享管理器
- 添加注册Actor
- 目标为:刚刚的动画共享管理器
- InActor为:Self
- Sharing Skeleton为:共享的骨骼UE4_Mannequin_Skeleton
17.5 修改状态处理器类(2)
- 修改重载函数处理Actor状态
- InActor类型转换为目标的角色蓝图TestBlueprint
- 从TestBlueprint中获取变量共享动画,并转化为整数
- 勾选ShouldProcess
17.6 修改动画共享设置(2)
-
在**细节 动画共享 骨骼设置**中 - 在动画状态中,添加三个动画状态,分别对应idle、jump、run
-
以idle为例,**动画设置 动画序列选择ThirdPersonIdle**
- 可以通过修改角色蓝图中的共享动画变量,修改播放哪个动画