[玩转UE4动画系统>基础篇] 之 什么是射线检测

1

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-3 12:07:53 | 显示全部楼层
欢迎关注《玩转UE4动画系统》系列教程
作者|开发游戏的老王


在现实世界中,一个物体能做什么不能做什么都要受到诸如牛顿定律等客观规律的制约,如果不是特意采取一些障眼法,我们看到的一切肯定都是“自然而然”的(它们都符合客观定律所以一定是自然的),但是在游戏这个虚拟世界里,并不存在这些客观规律,一切效果都是游戏开发者用各种各样的技术模拟出来的“假象”。所以,想让这些“假象”看起来“自然”,开发者也一定要模拟出一些“客观规律”来约束它们。
模拟这些物理中的客观规律,很多时候我们会交给物理引擎去处理,简单地设定刚体,包围盒以及一些参数,物理引擎就会帮我们“营造”出一个物理世界了。但有时,我们需要更加准确地判定一个环境的性质,比如前方的障碍物有多高,我们的角色是否可以爬上去,并且我们还想根据障碍物的高度决定角色爬上去时采用的动画姿势。这时,我们就需要一些更高级的方法了。其中,最常用也是最灵活的方法就是射线检测

射线检测简单地说就是允许我们指定起点A和终点B,引擎会发射一条由A到B的射线,射线会与AB之间的对象发生碰撞,并把位置、法线等信息返回给我们。有点像蝙蝠通过超声波来躲避障碍的感觉。



UE4中提供了非常丰富的射线检测函数库,在蓝图中搜索trace,我们可以看到一些列和它相关的节点(函数),这些都是用于射线检测的函数



射线类型

不要被这么多函数吓到,实际上它们都可以归结于如下形式:
(前缀:Multi) + 射线形状 + [后缀:ForObjects|ByChannel|ByProfile]

  • 射线形状: 我们可以把射线想象为赛亚人发出的冲击波,它们有可能是一条激光,一个球形,一个立方体或者一个胶囊体等等。
下面这个就是一个球形的射线的例子:前后端都是球形,中间是这个球形扫过的轨迹。


三种后缀提供了设置被检测对象响应射线的三种筛选方式:

  • 后缀:ForObjects意味着这个射线的检测对象为一个类及其子类对象,比如我们想用这条射线探测各种各样的宝箱;
  • 后缀:ByChannel是对被检测对象分类的另一种方法,我们可以在Project Settings/Collision/Trace Channels 中添加Channel,并且把一个射线指定到某一Channel,然后在各种物体设置对这个Channel射线的响应方式:忽略(Ignore)、重叠(Overlap)抑或是阻挡(Block)。
注:忽略(Ignore)意味着物体不与该频道射线碰撞;阻挡(Block)意味着物体会与该频道射线碰撞,并且射线与物体碰撞后的部分失效(不会再与其他物体碰撞);重叠(Overlap)会与该频道射线碰撞,并且射线与物体碰撞后的部分也不会失效(这个选项常与Multi类的射线函数配合使用,见下文)





  • 后缀:ByProfile,前两种后缀都是从被检测对象的角度来定义射线的,有时候,比如我们有一个角色,并且已经设置完这个角色和各种环境对象的响应方式,我们想定义一个射线让它的响应方式完全照搬于角色,这时,我们就可以在Project Settings/Collision/Preset 中添加一个Profile预设,并把这个预设设为和角色相应属性相同就可以了。





  • 前缀:最后来说一说前缀Multi。如果使用没有Multi前缀检测方法,那么射线碰到一个目标对象就会失效;而如果使用带Multi前缀检测方法,并且将目标对象对射线的响应设为重叠(Overlap),那么射线碰到一个目标对象后不会失效,常用于检测一串目标对象。
使用无Multi前缀检测方法或响应方式未设置为重叠的例子:


使用有Multi前缀检测方法且响应方式设置为重叠的例子:



射线的Debug表示

射线未失效部分默认显示为红色,失效部分默认显示为绿色。如果碰撞后射线失效,则碰撞点默认显示为红色方块,如果碰撞后射线未失效,则碰撞点默认显示为绿色方块。



射线函数的参数与返回值

参数

我们以SphereTraceByChannel为例,解释一下射线函数的参数与返回值




  • Start和End:  分别为射线的起点和终点。
  • 射线形状: 描述射线形状的参数,不同形状的射线此处略有不同,本例中是球形半径Radius。
  • 后缀: 根据射线函数的后缀类型不同,这里分别是选择Trace Channel、Object Types以及Profile Name。
  • Trace Complex: 每个碰撞体都有两个版本的包围盒,此处选择碰撞包围盒类型是Simple还是Complex。





  • Actors To Ignore:额外需要排除在碰撞对象之外的对象数组。
  • Ignore Self: 是否排除和自身的碰撞(默认为true)
其它参数均是和Debug相关参数,大家可以自己实验一下。
返回值


  • Return Value: 布尔类型,是否发生了碰撞。
  • Out Hit: 结构体类型的碰撞结果,展开以后如下:



比较常用的是: Out Hit Distance射线起点到碰撞点的距离;Out Hit Location碰撞点的世界坐标;Out Hit Normal 碰撞点的法线。
小结

以上就是UE4中关于射线检测的简要介绍,在实际应用中,我们不仅可以直接使用上述射线函数,还可以把它们组合起来,从而进行更复杂的环境判断。
回复

举报 使用道具

0

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-3 12:08:27 | 显示全部楼层
呐,这就叫专业[酷]
回复

举报 使用道具

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-3 12:09:26 | 显示全部楼层
太爱王老师了,真的很缺这样细致系统的讲解,图文结合,比那些付费教程讲的好多了!希望能继续更新!!
回复

举报 使用道具

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