物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映。
游戏引擎中的物理引擎的主要目的是为了解决物体在空间的状态信息。
常规的物理引擎遵循物理定律,按照给定的算法,进行模拟物理运动。所以在没有多元因素影响的情况下,物理引擎的计算结果是一致的。这和现实世界基本一致。
虚幻使用的是PhysX3.3的物理引擎驱动物理仿真以及碰撞计算。
碰撞相应和**追踪响应(射线)**构成了虚幻引擎4在运行时处理碰撞和光线投射的基础。
虚幻中的碰撞交互方式分为三种:忽视,重叠,阻挡
忽视:物体和物体之间不产生任何物理结果,这使得物理引擎将这两种物体不作为检查范本。
重叠:物体和物体本身可以相互穿透,并产生事件通知。物理引擎时刻会关注物体之间的位置关系。
阻挡:物体和物体之间不可以相互穿透,将产生阻挡效果。
在虚幻引擎中,能够被物理引擎计算的物体必须具备刚体(包裹外壳)。如果希望加入物理引擎运动,还需要开启去物理模拟。
在虚幻引擎中,物理碰撞添加的途径有两种,第一种是静态网格编辑器中,第二种是物理资源编辑器中(为骨骼Mesh使用)
静态网格的添加的碰撞形式分为两种,简单碰撞和复杂碰撞。
简单碰撞是基础,如方块、球体、胶囊体和凸包。复杂碰撞是给定对象的三角网格图。虚幻引擎4默认在Physx中创建简单和复杂两种形态,然后再基于用户需要(复杂查询vs简单查询)使用相应形态。
LOD(Levels of Detail):多层次细节,LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
例如游戏中,背后和远处的物体为非重要物体,细节度低,眼前近处的物体的细节度高。
打开静态网格编辑器,在碰撞下拉菜单中找到形状添加,虚幻提供三种简单的形状碰撞器:球体、胶囊体、盒体。
K-DOP是包围体的一种,是K离散导向多面体(K discrete oriented polytope)的缩写(K是轴对齐平面的数字)。它抓取轴对齐的平面,将其尽力推向离网格体最近的位置。
10-方块有4条边形成斜角-可选择X、Y或Z轴对齐的边
18-方块中所有边均形成斜角
26-方块中所有边和角均形成斜角
自动凸包包裹也属于简单碰撞包裹,通过程序进行计算获得包裹数据信息。需要调整凸包顶点最大数量。
凸包数量:决定了包裹物体需要使用的凸包个数,越多越精确,消耗也越大
最大外壳定点数:每个凸包最大允许使用多少个顶点
凸包精准度:使用多少模型面做计算参考,数量越大精度越大
遇到特别复杂的物体,建议先提升凸包数量,其次是凸包精准度。
虚幻中规定,若一个物体开启了复杂(精准)碰撞,就不能再开启物理模拟了。
例如,开启了复杂碰撞的椅子不能再被一个球击倒。
开启复杂碰撞后,需要在细节面板中将碰撞复杂度改成“将复杂碰撞用作简单碰撞”,物体才能与其他物体进行物理交互。
项目默认(Default):此设置“默认“使简单碰撞请求使用简单碰撞,复杂请求使用复杂碰撞。引擎默认使用的是SAC模式。
简单与复杂(Simple And Complex) :创建简单和复杂的形状。简单形状用于常规场景查询和碰撞测试。复杂形状(逐多边形)用于复杂场景查询。通俗的说,在此状态下,物体之间的碰撞交互使用的是简单碰撞,射线(比如枪射出子弹)使用的是复杂查询。
将简单碰撞用作复杂碰撞(Use Simple As Complex):若请求复杂查询,引擎仍将查询简单形态,无视三角网格图。这有助于节约内存,因此我们不需要烘培三角网格图。如果碰撞几何体更简单,则可增强性能。通俗的说,在此状态下,物体之间的碰撞交互使用的是简单碰撞,射线(比如枪射出子弹)使用的也是简单查询,该种模式最高效。
将复杂碰撞用作简单碰撞(Use Complex As Simple):若请求简单查询,引擎将查询复杂形态,无视简单碰撞。该设置可将三角网格图用作物理模拟碰撞。**注意:如果您使用的是Use Complex As Simple,则无法模拟物体;但可将其和其他模拟(简单)物体进行碰撞。**通俗的说,在此状态下,物体之间的碰撞交互使用的是复杂碰撞,射线(比如枪射出子弹)使用的也是复杂查询,此种性能最低。
最推荐使用默认设置, 即简单与复杂模式,这种模式即保证了碰撞的高效,又保证了查询的精细。
虚幻中加入了多种碰撞预设,帮助我们快速设置场景中物体与物体间的碰撞关系,我们可以使用碰撞预设解决场景中大部分碰撞关系问题。
碰撞预设可以在项目设置-碰撞-Preset 中查找到
创建新的碰撞预设需要需要分别选择物体类型和追踪类型
两个物体,它们对对方的碰撞预设必须是一致的,不能一厢情愿。
虚幻中使用物体类型来描述碰撞关系。虚幻只提供了少量的物体类型。我们可以在碰撞设置中进行添加。虚幻允许我们额外添加18种碰撞物体类型。
踪迹类型用来响应和射线之间的交互关系。虚幻中默认提供两种踪迹类型。我们可以自定义添加更多踪迹类型,最多18个踪迹类型。
比如,发出来一条Visibility类型的射线,如果你希望被打到,就勾选区块;不希望被打到就勾选忽略或者重叠。
在碰撞预设描述面板中我们可以调整物体之间的碰撞关系,包括当前预设提供给的物体的对象类型,碰撞的方式,响应方式,踪迹类型。
踪迹类型:当前物体与射线发生关系方式
对象类型:当前对象类型与其他对象类型发生的关系方式
如果碰撞启用都没有开启,后面的也不用看了。
无碰撞(No Collision):没有任何碰撞信息产生,并且没有物理碰撞结果。
纯查询(Query Only):只会产生碰撞通知(堆叠通知),但没有物理效果
纯物理(Physics Only):只会产生物理通知,不产生碰撞通知
已启用碰撞(Collision Enabled):即会产生碰撞通知,又会产生物理效果
虚幻中的碰撞响应分为忽略,堆叠,阻挡。与之对应的事件我们均可以得到。常见的StaticMesh组件,Collision组件均具备通知事件。并且我们可以调整组件的碰撞预设,或是自定义碰撞预设,以达到响应碰撞的不同结果。
重叠事件分为进入堆叠和推出堆叠,在虚幻中,如果希望获得堆叠事件通知,需要满足以下条件:
1、双方勾选生成堆叠事件(下图),中文翻译也是“生成堆叠事件”
2、物体有碰撞包裹
3、碰撞预设中物体之间的碰撞方式为重叠(有一方开启即可)
撞击事件产生的必要条件:
1、希望接收事件通知方(在蓝图中写有组件命中节点的一方)勾选生成撞击事件
2、双方任意一方开启物理模拟
3、双方具备碰撞包裹
4、碰撞预设中物体的碰撞关系为阻挡
(中文翻译为”模拟命中生成事件“)
虚幻中的物理追踪是指引擎运行状态下,允许我们使用线或是形状与场景物体产生交互,并将交互结果进行反馈,以达到动态生成物理交互响应的目的。
1、线性的检测(射线检测)(射击游戏,枪射出子弹)
2、形状检测(球,盒子,胶囊)
射线检测分三种方式,**一种是通道检测(通道射线检测),一种是预设检测(预设射线检测),一种是物体类型(物体类型射线检测)。**检测的方式主要区别是用来筛选目标。
检测分为单检测(只能扫描到一个目标)和多个目标检测(返回多个目标)
单检测和多检测通俗理解:多检测就是射线能穿透,可以检测到多个目标。
使用轨迹通道为主要检测判定依据,碰撞物体与该通道必须为阻挡关系,才能被收集。
如果想要射线被检测到,需要保证物体的碰撞设置中,与该射线通道的响应方式为阻挡。
(中文翻译为:由通道追踪线条)
Trace Complex :钩选后,射线便不跟物体的包裹进行交互,而是跟物体的复杂碰撞进行交互。
Actors to Ignore:这是一个放对象的数组,用于存放不想被射线打到的目标(比如射击游戏中的队友)
Ignore Self:是否忽略自己
Draw Debug Type:调试信息
使用预设关系进行碰撞检测,需要填入预设名称。
注意:射线使用预设如同物体之间的预设关系一样,如果希望被射线检测到,需要保证射线预设物体类型,和希望被检测到的物体类型之间的响应关系为阻挡(注意预设设定需要双方预设关系种的物体响应方式均为阻挡),方可被检测到。
Profile Name:放一种碰撞预设(填入该碰撞预设的名称),该射线的检测遵循该碰撞预设的设定。
将希望被射线检测到的物体类型构建成为数组进行填入,并且只与类型匹配的物体产生交互关系。
Object Types:这是一个数组,填入想要交互的物体类型。常见的物体类型有:静态场景(World Static)、动态场景(World Dynamic)、Pawn、物理形体(Physics Body)、载具(Vehicle)、可破坏物(Destructible)
形状检测方式与射线检测方式相同,会根据给定的形状进行检测设定。
提供了三个形状:球形、盒形、胶囊形
以球形通道检测为例,是从起始位置到结束位置不断发射球形:
Radius是发射球的半径
球形预设检测和球形物体类型检测和射线部分相同,便不在此赘述。
盒形和胶囊形与球形相同,不在此赘述。
虚幻中,物体开启物理模拟,即代表收到重力的影响。
在虚幻中力的作用方式分为两种:一种是冲力(impulse),一种是推进力(force)。推进力在虚幻中其实也是叫力,推进力是我们为了便于区分,取的名字。
区别:
冲力:瞬间力,作用结束后直接施加给物体,修正物体在物理引擎中的运动表现。(跑动的人撞到物体,施加的是冲力)
推进力:单帧作用力,当前帧力效果施加后,如下一帧不存在推进力,则作用力无效果。如果推进力是持续增 加力,随着时间推演作用力累加。像是火箭推进器。(用双手推物体,施加的是推进力)
只有开启了物理模拟的物体才能受到力的作用。
直接将冲力作用在物体质心,给定一个向量,描述方向和力的大小。
在其他引擎中,力不受物体质量影响,但虚幻中的力收到物体质量的影响。比如质量太大的物体,若施加的力太小,则物体不会被移动。决定该力受不受到质量影响,和Vel Change的勾选有关。
添加冲量(Add Impulse):
Vel Change:不勾选,受质量影响。勾选,不受质量影响。
在位置添加冲量(Add Impulse at Location):
将从物体的质心到Location构建一个连接杆,然后再Location发力,作用效果如同是用杆撬动物体。
与添加冲量(Add Impulse)不同的是,在位置添加冲量(Add Impulse at Location)可以选择发力的位置(Location)。比如,炮弹打到墙上,如果使用添加冲量(Add Impulse),则力永远都是从质心出发,这显然不符合实际情况。
Bone Name:将力用作在骨骼上
推进力需要持续发力,所以一般我们需要将力放到持续调用的逻辑节点(比如,事件Tick)中才能获得效果。推进力也分为直接发力质心和通过修改发力点构建作用力杠杆发力。
添加作用力(Add Force):
和冲力(冲量,Impulse)一样,添加作用力(Add Force)也有在位置添加作用力(Add Force at Location)。效果和冲力一样,不再赘述。