使用UE4制作僵尸世界大战电影尸潮爬墙学习笔记
最近在B站看到一个关于电影僵尸世界大战的尸潮爬墙的效果的制作,观看完之后也自己动手学习制作。现在来做一点新知识的记录。
(附上视频地址:教程地址,感兴趣的可以看看,挺有意思的)
尸潮爬墙
首先对这个特效做一个简单粗暴的介绍(其实讲道理能点进来你肯定知道是啥,不然你点进来干哈?)上图
就大概是这么一个效果,聚堆的爬墙,建议看一下电影僵尸世界大战才比较震撼。
制作
思路
根据这个图我们能看出来这是一个大型踩踏事件,就是一个人踩着下面的人往上爬的一个过程。
实现
-
首先创建一个基础的ZombieActor作为基类,这里为了单纯实现效果,没有采用其他的character或者pawn。
-
整个效果需要在Tick结点驱动下进行,因为对物体施加力的时候需要使用Tick及各种碰撞检测后的判断
值得注意的一点是,这次使用的碰撞检测结点是SphereTraceForObjects,这是一个根据ObjectTypes类型来进行检测的结点,和使用channel来判断的有所不同,为了方便且不与其他的物体发生跟多的交互,需要在UE4中左上角的 编辑->引擎->Collision中的Object Channels中添加一个碰撞类型,我创建的是Zombie 反应为Block,也就是图中Object Types的类型。至于碰撞检测的参数,就是单纯一个向前方向的检测。 -
碰撞检测之后需要做一系列的判断如下图。
因为在我制作的场景中只有墙和zombie,所以碰撞之后我只需要对这两种类型进行判断,判断方法就是cast to一下Zombie基类,转换成功就是Zombie,失败就是墙。
判断完类型后,需要做的就是判断何时进行攀爬了,这里需要两个布尔类型的参数来帮助我们判断。
CanClimb:设定当前的Zombie是否可以攀爬。以下简称CC
IsClimbing:表示当前Zombie是否处于正在攀爬的状态。以下简称IC
总共大致分为以下几个情况:
a. 没有发生碰撞,则直接施加一个向前方向的力。
b. 发生碰撞但碰撞的物体不是Zombie类型,则设置CC为True,IC为False,然后继续施加一个向前的力
c. 发生碰撞且碰撞的物体是Zombie类型,则需要先判断它能否攀爬,若不能,则什么都不做,施加一个向前的力,若能,则需要设定自身的CC为True,并判断碰撞物体是否处于正在攀爬状态,即它的IC是否为True,如果为True,则自身的IC设定为False,并继续施加向前的力;若它的IC为False,则做攀爬的操作。 -
力的操作:
力的操作上大致分为两种:
第一种 如上图,即确定的力,图中有两个add force结点,分别是施加向前的力和向上的力的结点。上半部分为向上的力,下半部分为向前的力。根据物理我们可以知道,在理想状态下F=ma,给一个物体施加一个恒力,物体做加速度恒定的匀加速运动,但这不符合我们做Zombie的状态,因为Zombie也是人,需要有一个最大速度,不可能无休止的加速下去,所以,我们需要对Zombie的速度做限定。通过 Get/Set Physics Linear Velocity两个结点来获得和设置物理线性速度,首先通过get来获得速度这一矢量,通过Normalize获得单位向量,即速度的方向;VectorLength来获得速度的大小,然后用Clamp结点对大小做限制,最后通过矢标量相乘获得被限制了的速度矢量,再通过set来设置,就完成了一个力的施加并使其获得速度。第二种 则是不确定的力。不过在这之前需要先提一个生成大量数量Zombie的SpawnActor,具体实现会在后面说,这里只是为了方便解释这个力。下图的box是生成Zombie的区域,箭头指的是运动向前的方向。
力的实现蓝图如下图,由尸潮爬墙的图我们可以看出,这个爬墙有一个特点就是,他们是聚堆朝着中心爬的,并不是全部都在线性的向上,所以我们需要给Zombie施加一个向中心的力。而这个向中心的力由于我们是生成的Zombie,所以每个Zombie的位置都不一样,所以需要让他们向中心的方向是不确定的。那么我们就需要有一个参照物来让这个力确定下来。大致分为以下几个步骤:
a. 既然以Box为参照,那首先需要找到Zombie对于Box的位置,因为在整个世界中两个物体的向量原点并不是Box的向量位置,所以需要将Zombie的向量减去Box的向量,来获得以Box为原点的Zombie的相对向量位置。
b. 获得相对位置之后,因为我将Box的X轴正方向作为中心,所以需要判断Zombie在X轴的左右,方法是将相对向量投影到Y轴,然后将得到的向量单位化成单位向量,再和Box的右方向向量进行点乘,因为都是单位向量所以得到的值就是两个向量角度的cos值,又因为都在同轴,所以角度非0即180,所以得到的值非1即-1,以此来判断Zombie的位置。
c.判断完位置之后,就可以进行力的施加,不过由于Zombie在左我需要让它向右,在右需要向左,所以需要将运动的方向再乘以-1,便是我们施加力的正确方向。
-
生成Zombie的Box。这个东西没有什么太大的难度,新的知识就是一个Set Timer By Event结点,就是能绑定一个事件,隔段时间就能运行这个事件。大致的思路就是在整个Box区域内固定时间间隔随机位置生成固定数量的Zombie。需要考虑的几点就是在生成的时候跟地面的碰撞检测,不能出现模型穿模(当然了,开启了物理模拟应该也不会的吧),然后就是在生成了之后需要调用一下每个Zombie设置自身SpawnActor的参数。总体来说没什么难度。
总结
整体做下来,感觉收获大的地方应该在于Zombie的设计上,实现上需要考虑的情况比较多。
转载:https://blog.csdn.net/qq_40281688/article/details/101214295