UE4物理模块(三)---碰撞查询(上)
在前一文中介绍了如何在UE4中创建简单碰撞或者直接使用其mesh表示的复杂碰撞:
Jerry:UE4物理模块(二)---建立物体碰撞zhuanlan.zhihu.com
那么在拿到碰撞之后,就可以进行物理运算,主要是碰撞查询和物理仿真,这里先介绍更为常见的碰撞查询。
最为直观的碰撞查询就是人物的移动物理了,你所控制的人物不掉落地板之外或者碰到障碍物就被阻挡,这其实是碰撞查询在背后起作用,如下动图:

我们也可以让人物直接穿过盒子,如下:

人物的移动物理本身是一块非常多的内容,我在文末会给出一些不错的分析文章,在这里只要知道移动距离是根据初中物理所学s = v*t得到的,v是当前人物的移动速度,而t是移动时长,在游戏里面t是很小的时间片。游戏中并不会有真正的“连续”移动,当t足够小的时候,每次移动量也很小,将人物SetActorLocation到这个小移动量表示的世界坐标里,就可以得到看似连续的移动效果,本质是极小量的瞬移。
在每次计算移动位移时,都会进行碰撞查询,具体是用人物的胶囊体向速度方向进行扫略,它返回的结果是一个比例,如果比例是1.0,那么就可以执行完整的瞬移,而如果比例是0.5,就只能执行一半长度的瞬移,如果是0,就不进行任何移动。那么为何第一张动图被阻挡不能执行完整瞬移,第二张动图就偏偏可以呢?
这与“两方”的碰撞设置有关,碰撞是两个物件碰撞盒相交才会发生的事情,所以这里首先强调两方。碰撞响应总共有三个选项:Ignore, Overlap, Block。顾名思义,Ignore忽略碰撞,Block就是阻挡,而Overlap与Ignore类似,不会产生阻挡,但会产生重合的事件通知。两两组合就有下面的情况(图来自于https://www.unrealengine.com/zh-CN/blog/collision-filtering,也是一篇不错的碰撞查询入门文章):

其实只要记住两点:
(1)只有两个对象互相Block时,才会真正的被阻挡,其他情况都不会;
(2)只要有一方Ignore,就不会产生Overlap的重合事件;
在编辑器里,选中这个白盒子,在这里配置碰撞信息(Collison Preset,碰撞预设):

默认是Default,切换成其他的碰撞预设都能看到具体的碰撞响应,但大多都不可编辑(只读),如下图:

只有切成Custom...才可编辑:

我们来分别说下这些配置:
CollisionEnabled决定了碰撞的用途,如下:

NoCollision:如果是这个,那么其他碰撞设置都会被忽略不计,因为不再考虑碰撞了;
Query Only:仅用于查询,不会考虑物理仿真;
Physics Only:仅用于物理仿真,不考虑查询;
Collision Enabled (Query and Physics):同时用于查询与仿真;
人物的移动物理属于查询,我们选择Query Only就行。
ObjectType决定了物体本身是什么碰撞类型,可选类型如下(也可以在ProjectSettings里面添加,后面会谈到):

WorldStatic:静态几何物件,如山石,树干等;
WorldDynamic:动态几何物件,如房门,地面可拾取物等;
Pawn:人物或类人的东西,如玩家,野怪;
PhysicsBody:物理体;
Vehicle:载具,如摩托车,飞机等;
Destructible:可破坏物件,如栅栏,窗户等;
ObjectType配置的自由度很高,你也可以把石头配置成载具的ObjectType,只是这样在处理其他物件对它的响应时要绕得过来,一般不会做这种坑人坑己的事情。
碰撞响应决定了该对象对其他碰撞类型的响应,如下图:

仔细看可以发现碰撞响应还会细分成Trace Response与Object Response,个人理解其实差别不大,主要是通道过滤比较方便,直观理解射线检测类的配置成Trace Response,对象移动类的配置成Object Response就可以了。ObjectResponses列举出来的情况正是之前我们谈到的ObjectType的枚举,上图应解释成:白盒子对这几种碰撞类型的对象都是阻挡响应。
我们以第三人称人物为例,他本身碰撞类型是Pawn,如下:


注意我们看的是ObjectType,而不是上面的CollisionPresets。对人物而言,它对WorldStatic的响应是Block:

对于白盒子而言,它自身碰撞类型正是WorldStatic,而对Pawn的响应是Block,如下:

两两的碰撞响应都是Block,所以会发生阻挡。而如果将箱子对于人物的响应换成Ignore,如下:

则人物可以穿过箱子(大家试试看~)。
综上,每个物件的碰撞信息分成两块可配置:
其一,自身的碰撞类型ObjectType;
其二,这个物件对于其他碰撞类型对象的响应;
如果A的ObjectType是AO,B的ObjectType是BO,假定A配置成了Block BO,同时B配置成了Block AO,那么就会形成阻挡响应,彼此不能通过对方。
下面说下如何自定义碰撞类型,在菜单栏里面选择ProjectSettings,如下:

然后在左侧导航这里选择Engine->Collision,如下:

右侧可以新建自定义的ObjectChannels,TraceChannels以及Presets,前面提到过ObjectChannels与TraceChannels的区别主要在于通道的过滤,ObjectChannels还会创建一个同名的ObjectType。
对于ObjectChannels的碰撞响应过滤,我们使用蓝图中这个结点SingleSphereTraceForObjects(C++里面也有对应的函数),如下:

注意到ObjectTypes这里选择要过滤的通道,上图表示只有ObjectType为Pawn或者是PhysicsBody的对象才会被碰撞检测到,其他类型的对象则被忽略。
对于TraceChannels的碰撞,使用的是SingleSphereTraceByChannel这个结点,如下:

注意这里的通道过滤项是TraceChannel,上图表示只有配置成Block Weapon这个Channel 的对象才会被检测到(体现在蓝图右侧OutHit输出结果上)。
此外,还有一些直观的理解,当你考虑的是对象移动时发生的碰撞,就用ObjectChannel(一开始UE的叫法是MovementChannels),如Pawn,StaticMesh;若考虑是射线检测时发生的碰撞,就用TraceChannel,如Weapon, Visibility。
举个例子,我们在ObjectChannel里面新加一个名为Pickup(表示地上的可拾取物)的碰撞Channel,如下:

将默认的碰撞响应配置成了Block,以使pickup默认会被其他碰撞类型阻挡(如果不想让人行走时被pickup拦下,可以在去修正某个Pickup对ObjectType为Pawn的响应。
在TraceChannel里面新加一个名为Weapon(表示枪的射线检测)的碰撞Channel,如下:

并将默认响应配置成了Block,即对默认对象类型来说枪射线会被阻挡。
回到编辑器场景窗口,并选中白盒子,查下其碰撞信息,如下:

可以看到TraceResponses和ObjectResponses这里已经多了之前添加的项目了。而且在ObjectType这里可以看到同名的ObjectResponses,如下:

还有一个Presets的自定义没说,回到Project setting这里:

所谓Presets就是碰撞预设,它是将一些常用的碰撞响应配置记录下来,这样以后新添一个对象时,就不用自己选择Custom,然后逐一勾选对不同ObjectType的响应了。比如这里我们配置一下Pickup的响应如下:

这样就可以看到PickupPreset最下面一行多了新加项(这里UE有一个UI上面的BUG,右侧的滚动条在第一次打开ProjectSetting是不会显示,也就无法向下滚动,这时只要再单击下Preset就可以了)。

这样我们就可以一键配置想要的碰撞信息了:

这里稍稍提到了LineTrace的蓝图配置,打算再分出一章详细说下蓝图里面的各种Trace,也是属于碰撞查询这个门类,就放到碰撞查询(下)里面说,参见:
Jerry:UE4物理模块(三)---碰撞查询(下)zhuanlan.zhihu.com
补一下UE移动这块非常好的文章:
Jerish:《Exploring in UE4》移动组件详解[原理分析]zhuanlan.zhihu.com
李雪峰:UE4的移动碰撞zhuanlan.zhihu.com
UE4物理模块(三)---碰撞查询(上)的更多相关文章
- UE4物理模块(三)---碰撞查询(下)SAP/MBP/BVH算法简介
在上一文中介绍了碰撞查询的配置方法: Jerry:UE4物理模块(三)---碰撞查询(上)zhuanlan.zhihu.com 本篇介绍下UE4的各种零大小的射线检测,以及非零大小(带体积)的射线检 ...
- UE4物理模块(二)---建立物体碰撞
在前文中介绍了什么是物理以及如何在UE4和PhysX中进行可视化调试: Jerry:UE4物理模块(一)---概述与可视化调试zhuanlan.zhihu.com 这里调试只谈到了碰撞盒(后续还会有 ...
- UE4物理模块(一)---概述与可视化调试
UE4.21前的版本采用的是NVIDIA的PhysX做为其默认的物理引擎,用于计算3D世界的碰撞查询与物理模拟.自4.21版本开始改物理调用接口,但这并不是闲来重构代码,果然在2019GDC大会上放出 ...
- ArcGIS中的三种查询
ArcGIS runtime SDK for WPF/Silverlight中的三种常用的查询:QueryTask.FindTask.IdentifyTask都是继承自ESRI.ArcGIS.Clie ...
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- Mysql技术内幕-笔记-第三章 查询处理
第三章 查询处理 逻辑查询处理:(8) SELECT (9) DISTINCT <select_list> (1) FROM <left_table> (3) <join ...
- QGis(三)查询矢量图层的要素属性字段值(转载)
QGis(三)查询矢量图层的要素属性字段值 https://github.com/gwaldron/osgearth/issues/489 当加载一个矢量图层后,如果要查看要素的属性字段值,则需要实现 ...
- select子句和三种子查询
一.select子句 五种子句 Where.group by.having.order by.limit Where.group by.having.order by.limit运用的这个顺序不能变 ...
- [UE4]Static Mesh的碰撞体
一.可以在3D建模的时候添加碰撞体,导入到UE4的时候,碰撞体也会跟着导入进来. 二.也可以在UE4中自行添加碰撞体 三.在UE4中添加编辑碰撞体 四.选择碰撞体可以移动.缩放.旋转碰撞体,如果模型比 ...
随机推荐
- 表单控件绑定v-model
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- js 实现页面局部(或图片)放大功能(vue)
方法: adjustStart1 (e) { e.preventDefault() let event = e.touches if (event.length === 2) { this.style ...
- java基础之二维数组-杨辉三角
首先呢你要知道什么是杨辉三角? 答:杨辉三角,是二项式系数在三角形中的一种几何排列. 简单的说一下就是两个未知数和的幂次方运算后的系数问题,比如(x+y)的平方=x的平方+2xy+y的平方,这样系数就 ...
- python3-常用模块之random
random 1.取随机小数 : 数学计算# print(random.random()) # 取0-1之间的小数# print(random.uniform(1,2)) # 取1-2之间的小数 2. ...
- C++和C#之间的数据类型对应关系
最近接触WINAPI比较多,一直要楂数据类型间的对应关系,所姒就转载一下~ # Windows Data Type .NET Data Type # BOOL, BOOLEAN Boolean or ...
- NopCommerce3.9安装
除非另外说明,否则本分类所有博文的NopCommerce都基于3.9版本. 用vs2015打开,其他版本的vs没试过. 首先打开解决方案,然后设置Nop.web为启动项目. 启动项目,项目即可自动编译 ...
- python基础-递归
1.递归调用:在一个函数调用的过程中,直接或间接又调用了自身,就是递归调用 2.递归必备的两个阶段:1.递推 2.回溯 总结:#总结递归的使用: 1. 必须有一个明确的结束条件2. 每次进入更深一层 ...
- CodeChef TRIPS-Children Trips 树上分块
参考文献国家集训队2015论文<浅谈分块在一类在线问题的应用>-邹逍遥 题目链接 题目大意 一棵n个节点的树,树的每条边长度为1或2,每次询问x,y,z. 要求输出从x开始走,每次只能走到 ...
- 比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】
Online Judge:NOIP2016十连测第一场 T2 Label:暴力,Bitset 题目描述 在美丽的比特镇一共有n个景区,编号依次为1到n,它们之间通过若干条双向道路连接. Byteasa ...
- Mobox 知识管理平台助推市长质量奖
Mobox 知识管理平台助推市长质量奖 引言: 在过去的十多年中,国际上在管理领域出现两股浪潮:一是许多国家和地区采取设立政府质量奖的方式,来改善企业管理绩效,提升区域整体竞争力:二是这些国家和地区的 ...