UE4中的物理查询和物理模拟

物理查询(碰撞检测)主要是场景进行相关的碰撞检测,返回查询结果,通过PhysX的接口raycast,sweep与overlap实现。
物理模拟相当于把物体的移动托管给物理系统,不需要任何的接口调用,通过PxScene::simulate对场景进行模拟。
在物理引擎中,物理查询与物理模拟是两套完全独立的体系。

UE4中的物理查询

物理查询即提供给应用程序一套接口,可以得到当前查询图元与场景的交互关系。游戏中与物理相关的交互绝大部分可由物理查询完成,如实体类子弹、射线类子弹的命中检测,角色移动与阻挡等等。

UE4中常用的物理查询主要有三种:
1.Raycasts,零大小的射线检测,即有向线段;
2.Sweeps,非零大小的检测,即扫掠体;
3.Overlaps,即空间相交检测。

物理查询流程一般为:输入查询请求(查询起点、查询终点、查询类型)→遍历场景空间结构划分(AABBTree)→粗略的找到一组可能的碰撞体→Pre-filtering(如频道剔除)→结构内部剔除(对复杂碰撞体时损耗很高)→Post-filtering(某些结果是否被丢弃)→返回查询结果(是否查到交互Shape,位置以及法线信息)。

PhyX提供的掩码机制,通过设置Shape上的掩码结构和传入的物理查询参数,完成特定的检测结果控制。UE4中的频道概念就是基于此来设计的。在UE4中可以设置物体的碰撞相关信息,如下图所示:
在这里插入图片描述
Collision Presets为碰撞预设,UE4为开发者做了几套预设的碰撞相关设置,如果需要某个物体拥有独特的碰撞特性,可以选择Custom来自定义与碰撞相关的设置。

Collision Enabled为碰撞类型,共有四种:NoCollision(无碰撞)、QueryOnly(仅查询,即不会发生碰撞,但任何重叠等事件都会触发)、PhysicsOnly(仅物理,不会触发任何事件)、Collision Enabled(查询且物理)。如果需要触发Overlap等事件的话,需要额外勾选上方的Generate Overlap Events选项。

Object Type为频道类型,每个物体或组件都有自己的频道类型,用于区分不同类型之间的频道反馈。例如在PVE射击游戏中,如果想实现子弹只会打击到怪物,但不会击中队友的效果,可以为怪物单独设立一种频道类型,子弹可以设置为与该类型发生Block,但与玩家的Pawn类型Ignore,这样子弹在撞到怪物时会被阻挡并触发重叠事件,而与玩家Pawn碰撞时会直接忽略,从而穿过玩家,也不会触发任何事件。

Collision Responses为频道反馈,用来判断当前物体与不同通道之间的阻挡关系,共有Ignore、Overlap、Block三种。

UE4中的物理模拟

物理模拟是计算机科学中的一个领域,目的是利用计算机再现物理现象。通常,这些模拟将数值方法应用于现有的理论,以获得尽可能接近于我们在现实世界中观察到的结果。在物理模拟中,完全由物理世界控制对象的移动,逻辑层只控制各种物理参数的设置与力的操作。

如果要开启物理模拟,首先要将上述的Collision Enabled设置为PhysicsOnly或Collision Enabled,然后在Physics一栏中勾选“Simulate Physics”,即可开启物理模拟,如下图所示:
在这里插入图片描述
开启后,可以通过设置Linear Damping(线速度阻尼)和Angular Damping(角速度阻尼)来模拟阻力,Constrains提供约束控制,以及其他的物理模拟相关设置。

打开物理模拟后,可以使用Add Force和Add Impulse节点来对物体施加力和冲量,需要注意的是,Add Force是一个持续性的效果,需要在Tick函数内持续增加,例如推箱子行为。而Add Impulse是一个瞬时效果,可以直接改变刚体的运动状态,如被炸弹炸飞等。

在实际应用物理相关的效果时,应当优先考虑使用物理查询,当物理查询不能实现想要的效果时再考虑物理模拟,因为物理模拟托管给了计算机,各种行为表现难以控制,可能会出现各种各样的bug,且自己能够修改的属性也比较少,物理查询则相对可控。

猜你喜欢

转载自blog.csdn.net/weixin_47260762/article/details/127158053
今日推荐