UE4 UE5 骨骼动画 高级运动系统 摄像机管理

3

主题

5

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-9-22 15:42:27 | 显示全部楼层
被漆黑烈焰吞噬殆尽吧!
最近在学习虚幻引擎的骨骼动画相关的知识,本着教学相长的想法,在这里写点动画相关的文章现学现卖一下。
(这篇文章我尝试了对话型的写作方式,为了让读者读的有意思,自己写起来也有意思,所以借用了《中二病也要谈恋爱》中的两位主角之口,前面会有一小段背景铺垫,推荐先读一下后记
1.引子

夕阳蔼蔼,秋风徐徐。
晚霞的余晖投射在银杏学园的操场上,映照着体育社团的学生们训练的身影。放学的钟声悠扬,群鸟为钟声所震,绕着校园一隅的大榕树上下翻飞,清脆的啼鸣此起彼伏,点缀着洪钟之声。
滋贺县的马路上车来车往,此时正是这座小城市疲惫地运转了一天后,所迎接的一日的尾声,上班族们各自搭着交通工具,强撑着疲惫的身体向家中走去。
在这来来往往的人海中,并肩走着两个穿着校服的少年少女。勇太和六花。他们正是滋贺县中唯一一所教授虚幻引擎的高中——银杏学园的高一学生。
其中那名少女正在对着远处的风车,高举着手臂,嘴中念念有词……
六花:喝……啊!以黑暗之力,让风车旋转起来!


勇太:真是笨蛋……唉唉。六花,今天学校教的高级运动系统的摄像机管理,你有在好好听课吗?
六花:唔唔…嗯……
勇太:我就知道,你昨晚又熬夜和凸守去做什么秘密行动了是吧?
六花:……!哼!邪王真眼的力量可以接收到管理局无意识发出的脑电波,从而窃取敌人拥有的知识!区区高级运动系……痛!
勇太收回敲六花脑袋的手刀,无奈道:这样下去,我很担心你会挂科啊。趁放学路上有时间,我给你稍微讲讲吧。喏,这是我今天上课时做的笔记,你先拿着看看,可以配合着我过会儿的讲解来理解。


六花:嘿嘿,我就知道勇太对我最好了~
2.梳理ALS的摄像机管理思路

勇太:高级运动系统的摄像机管理,和传统的做法不同。它把放在了人物蓝图中的摄像机与弹簧臂删除,转而自己创建了一个玩家摄像机管理器(PlayerCameraManager)与摄像机的动画蓝图,并让玩家控制器应用这个摄像机管理器类。你知道为什么要这么干吗?


六花:嗯……我想想看……摄像机就像玩家的眼睛,替玩家看着这个世界,因此让摄像机模仿在现实中的一些运动中眼睛看到的东西的变化,可以增加游戏的真实感,比如在冲刺时,随着身体重心的压低,人的眼睛也会降低位置……到这里没错吧?



(ALS在角色冲刺时会让摄像机的高度下降30)

勇太:嗯,差不多,然后呢?你刚刚讲的是“为什么ALS重视对摄像机的管理,而不简单地塞个弹簧臂加摄像机了事”。那为什么ALS要把摄像机独立出来?
六花:哼哼!那自然是因为对摄像机的操作越来越复杂。倘若把它写在人物蓝图中,每次想要修改摄像机的操作时都要去改动人物蓝图,摄像机就与人物蓝图深耦合了。反倒不如将摄像机独立成一个模块来管理和维护,人物蓝图只负责通过接口来传递数据。
勇太:不错。另外,并不是每一个场景中的角色都需要有摄像机,只有会被玩家控制的角色才需要。将摄像机从角色身上“剥”下来后,就无需考虑到底哪个角色需要添加摄像机组件了。这也不是摄像机该知道,该考虑的事情,它只需要知道控制自身变换的逻辑就够了。
一辆洒水车大声播放着音乐从两人身边缓缓开过,二人的对话因此有了短暂的间隙。


六花微微仰起头,遥望着天边的夕阳缓缓沉入水中:勇太,夕阳好美啊。
勇太:是啊,真可谓一道残阳铺水中,半江瑟瑟半江红……咳咳,别想岔开话题,我们继续复习!
六花:好吧……
勇太:因为摄像机的运动是与动画紧密相关的,是依据角色此刻的动画来决定该怎么操作摄像机的。你想想,如果只是单纯地在“角色开始冲刺”时添加一个通知,发送给摄像机管理器,让它下沉一截。等“角色冲刺停止了”,再发送一个通知给摄像机管理器,那这样长此以往下去,很快就会有一大堆七七八八的通知和事件挤在摄像机管理器中。很明显地,这样也不容易维护与扩展,并且违反了开放-封闭原则。
六花:那应该怎么办呢?加一个中间层吗?
勇太:对了。解耦的好办法就是加中间层。ALS的作者思路是让动画蓝图当这个中间层。
因为刚刚说了摄像机的运动和动画紧密相关,可以说动画的切换就是摄像机运动的切换。那为什么不给摄像机也像人物那样建一个动画蓝图呢?也让摄像机获取角色的步态(Gait),姿态(Stance),旋转模式(RotatoinMode),移动行为(MovementAction),像人物的动画蓝图那样根据这些状态来组建状态机,并来回切换呢?
六花:可是,人物的动画蓝图中可以播放动画序列来改变人物的行为,那摄像机的动画蓝图怎么办?我们也要为摄像机建立各种动画序列吗?摄像机的奔跑动画,摄像机的Idle动画……好难想象啊,我的头好痛,勇太——
勇太:笨蛋!摄像机只是玩家观察世界的眼睛,在世界中只需要有一个点来表示它所处的位置与旋转就行了。人物向前移动时需要有向前的位移和自然的走路姿势,而摄像机只需要让这个点向前移动不就好了?
六花:哦~!不愧是DarkFlameMaster!那也就是说,动画状态机中的状态节点并不需要播放什么“摄像机的动画序列”,只需要让摄像机动一动,转一转就行了是吗?
勇太:是的,每个状态节点都可以对摄像机做一些处理,比如让它的视场角变大点,让摄像机抬高一些,跟随玩家的速度慢一点,朝下旋转一些……这些就是摄像机,在人物处于对应状态时,该做的事情。比如在奔跑时,我们就可以尝试让摄像机下压一些,跟随玩家的速度迟缓一些。
但是摄像机的动画蓝图本身无法直接掌管到摄像机的运动,六花,你觉得应该怎么把我们想让摄像机做的这些变换传递给玩家摄像机管理器呢?
六花:这个……那个……我看看勇太的笔记……


六花:哼哼!我知道了,用曲线!对吧~?
勇太:没错,使用曲线在动画蓝图和逻辑蓝图中传递数据,这招在ALS的原地旋转中也用过,当时用的那条曲线是RotationAmount,应该还有印象吧。你看,像这张图这样,修改一下摄像机骨骼的曲线值就行了。


六花:我理解了。但是勇太,这样会不会有些多此一举了?既然摄像机的动画蓝图也是根据角色的运动状态来做不同的摄像机变换处理,那为什么不干脆在把摄像机的曲线值的修改直接集成到人物的动画蓝图中去呢?
详细说的话就是先在人物的骨骼中添加一下摄像机的这些偏移曲线,然后在人物的动画蓝图的各个状态节点中设置摄像机的偏移曲线值,最后让摄像机管理器从人物的动画蓝图中读取曲线值。
你看,这样还省得再在摄像机的动画蓝图那里仿造一套类似的状态机的结构,以后如果想给人物加新的运动模式的时候,比如游泳啦飞行啦,那时候也不需要在人物动画蓝图里先添加一套逻辑,完了又跑到摄像机的动画蓝图里再添加一套逻辑了。不是吗?
勇太:这个问题问的不错,看来六花你也是有在好好思考啊。
六花:欸嘿嘿~
勇太:嗯……我也不是很有把握,我按照我的理解尝试回答一下你的问题吧。明天我去问问同学们是怎么看待这个问题的。
首先,ALS把摄像机从人物蓝图中“剥”下来,就是想让摄像机的功能相对独立,不依赖特定的角色类型。而按照你这个把摄像机的偏移曲线,内嵌进特定的骨骼中的思路,那如果来了个新的角色有着新的骨骼,是不是又要为了这个新的角色,在它的骨骼中又创建一遍这些摄像机的曲线,在这个角色的动画蓝图中,又写一遍对摄像机偏移量修改的操作啊?
六花:唔……
勇太:是吧,这样不仅违背了摄像机与角色两相独立的解耦初衷,还增加了潜在的“复制代码”的可能性。而在设计模式中最忌讳的就是ctrl+c和ctrl+v了。嘛,虽然如果不按照你的做法,那在摄像机的动画蓝图中也会有类似的“复制代码”行为就是了。这点上我确实不是很有把握。
六花:嗯嗯,勇太,我知道了。
3.搭建摄像机的动画状态机

六花:呐,勇太,我渴了~
勇太无奈地横了六花一眼:真是的,我给你讲了半天了,怎么你还比我先喊渴了?


不过经六花这么一说,勇太也感觉自己有点口干舌燥。便暂停了讲解,走到路边的自动售货机前买了两罐饮料。替六花拧开瓶盖后递给了她,自己也喝了一口润了润嗓子。
勇太:下面我要讲的其实和ALS有些出入,是我自己觉得这样做更好而改来的。你看,ALS原版的做法是这样的:


你看这张图片,这里混合了走,跑,冲状态下对摄像机的修正。分为摄像机位置偏移,摄像机跟随置后两个方面,并各自分成了XYZ三个轴的。这一共六个值中,有很多值都是一模一样的。我就想,如果以后想要将摄像机拉近一点,比如让Camera Offset X变为-200。那不是要挨个修改过去吗?
因为在这个状态节点中不仅混合了走跑冲,还要混合站蹲两种站立姿态,所以实际上一共要把六个Camera Offset X值挨个改过去。


六花:确实欸,这样要修改的地方太多了,会增加不必要的工作量,出错的概率也会上升。
勇太:是吧,所以我就想,能不能仿照ALS的角色的动画蓝图那样,用学校里王老师说的“洋葱模式”,来把每一层的细节混合做成一个状态机?
你看,这是我今天做的作业,我是这样做的。还没做完,目前只混合了走跑混合,与视角切换这两层。


六花:勇太,我想看看你走跑混合的状态机
勇太:好吧,不过我今天偷懒了,没把Sprint做出来,就先做了走和跑。
你看,我这样子在Walk和Run的状态节点间切换,其实和ALS它原本做的用“混合姿势(ALS_Gait)”节点做出来的效果,是一样的。


然后这个是Run的状态节点内部。前面讲到曲线时好像有给你看过。


你看,这样即使突然想改基础的摄像机设置,让基础的CameraOffsetZ增减个几十,也不需要把修改曲线的节点挨个改过去。因为在其他状态节点中我修改曲线的应用模式都是添加,基础的值再怎么变也不会导致这里需要改动的。
六花:我还想看看你的另一个状态机ViewModeCameraTransformOffset
勇太:嗯……我们快到家了,这就没必要给你看了吧,再看时间就不够了。那里面只是用了上面已经混合好走跑状态切换的缓存姿势,LocomotionCameraOffset而已。和ALS在动画蓝图中的思想是一致的。如果你忘了洋葱模式的话可以去复习下王老师 @开发游戏的老王 之前上课用的课件
4.玩家摄像机管理器中的一些细节

六花:欸?那也就是说勇太你不教我玩家摄像机管理器具体怎么做了吗?呐,勇太教我,教教我嘛~


勇太:实在是没时间了。而且我本来也只是想帮助你思考“为什么”,而不是直接告诉你“是什么”。具体操作你自己去看课本吧,大部分都比较好理解,没什么好说的。我趁着等红灯的这点时间把最后一些细节跟你说了吧。
六花:真是的~!勇太,小气鬼。
勇太:首先是这个“计算轴无关摄像头滞后”……翻译得可能不是很准确,从功能上来讲它主要其实就是把摄像机的轴位置根据曲线里设置的滞后速度做了个插值。在ALS原版中它把摄像机的轴位置反旋转了下一帧的摄像机旋转,插值完了再旋转回去。关于这个步骤我个人感觉没有必要。


你看,我在我的作业中把这个旋转与反旋转的步骤删去了,测试结果也运行的好好的。不过也可能是我对ALS的理解不够深,没掌握到这一步的用意。


六花:哦哦,我回去也试试看。
勇太:第二个就是ALS中把角色变换作为PivotTransform,即轴心变换。我感觉可以理解为“把角色设置为摄像机要跟随的目标”。然后通过轴心的基础位置增加一些人为设置的偏移量,就能得到摄像机应该设置的目标位置了。ALS把这个偏移量分为了PivotOffset和CameraOffset,前者是通过角色的旋转朝向来进行修正,后者是通过摄像机下一帧的目标旋转朝向来进行修正。
六花:嗯嗯,然后呢?
勇太:最后就是模拟实现一下弹簧臂的防穿模功能。这个你看我在作业中记的笔记就行了,我就不多废口舌了。


说完这句话,二人正好来到了勇太的家门口。六花住在楼上,两个人到这里就要分别了。
六花红着脸,嗫嚅道:今天谢,谢谢,勇…勇……谢谢DarkFlameMaster!但是邪王真眼是最强的!
勇太:别叫我这个名字啊!太羞耻了!笨蛋!
后记

最近看了看以前自己写的文章,感觉已经不知不觉间自然而然地形成了一种固定的文风了——而且这种文风我还不是很满意。于是想尝试探索一下新的文风——怎样才能让文章在严谨的同时,尽可能地有趣,尽可能地让读者读起来没有压力。
我回想起了前一两年读的程杰老师执笔的《大话数据结构》和《大话设计模式》,这两本教材的确做到了不失专业性的同时让读者能觉得足够有趣,愿意读下去。其中大话设计模式就是使用对话形式展开教学,而且也是从博客发展而来的。于是我就想尝试模仿一下这种风格。


但是使用直接使用大鸟和小菜,或者自己编一个师生关系啥的,感觉会花不少时间在铺垫设定上。而本篇文章毕竟是博客,不像书一样,写一次设定后面就不需要再写,总会有人第一次看到我的系列文章,我也不能每篇文章花大篇幅介绍设定。简单介绍设定的话又感觉没那味,不够代入。
于是我就直接套用了我很喜欢的动画《中二病也要谈恋爱》的男女主角的人物与背景设定,顺带一提,我的知乎名字DarkFlameMaster,也是男主角中二时期给自己取的“法号”。

这篇文章因为形式与文风上的改革,写起来远比正常文章花时间花精力来得多的多。而且又非常忐忑,不知道会不会有人喜欢,会不会有人觉得这种形式反而看得更不好懂,会不会……总之希望读者朋友们不看功劳也看苦劳,多多点赞支持一下我为了让文章“更有趣,更易读的进去”而付出的努力吧。同时也很希望各位能给些反馈,无论是正反馈还是负反馈,越具体越好。我好知道该怎么改进写作方式与风格,知道现在做的这种尝试是否是正确的。
此外,我也接受了银弹大佬的建议,这篇文章的图片数量明显是要远多于以往的。


最后,由于笔者水平有限,文章错漏之处在所难免,恳请各位读者大佬不吝赐教,批评指正。
PS:文章中的那个“作业”是我现在与同学合作做的一个类魂战斗框架,其中动画部分都是我负责,参考了ALS的做法,并按照我的理解删繁就简或者做了些改进。等过一段时间比较完善了考虑出点文章讲讲,主要看看有没有读者对此感兴趣。有兴趣的读者可以在评论区说一声,人多的话我就去填坑了。

同系列的其他文章:
目录:DarkFlameMaster:UE4 UE5 骨骼动画 高级运动系统 (ALSV4)
上一篇:UE4 UE5 骨骼动画 高级运动系统 脚部IK - 知乎 (zhihu.com)
下一篇:敬请期待

住在同一个屋檐之下,
一起去学校,一起回来,一起吃饭,一起打游戏,
时而愤怒,时而欢笑,偶尔也会觉得麻烦,偶尔也会觉得安心,
这一件件小事,就是所谓的幸福。

与其紧紧相拥,与其拥吻对方,比任何像恋人的事情都要更加地幸福。
能在更近的距离感觉到六花的存在,六花,天长地久,我只会注视着你一个人。





回复

举报 使用道具

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-22 15:43:15 | 显示全部楼层
三连,学习[大笑]
回复

举报 使用道具

1

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-9-22 15:44:03 | 显示全部楼层
[酷]谢谢王老师的认可
回复

举报 使用道具

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-9-22 15:44:49 | 显示全部楼层
头像怎么换了,我还是喜欢之前色色的头像[机智]
回复

举报 使用道具

3

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-9-22 15:45:26 | 显示全部楼层
因为无论怎样的六花都很可爱[害羞]
回复

举报 使用道具

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