虚幻4 碰撞过滤
原创翻译,转载请注明出处。(http://blog.csdn.net/sinat_24229853/article/details/51090259)
英文原文:https://www.unrealengine.com/blog/collision-filtering?lang=zh-CN
选择什么样的碰撞显然是很重要的。但它可能会很棘手,而且我们在开发虚幻4的过程中已经花了相当长的时间讨论。我们的系统能够一眼看上去有点复杂,但它是很强大和一致的,所以我想给一点背景知识关于怎样完毕它。
我们会谈论碰撞的不同反应,我们怎样使用通道来过滤碰撞,和勾勒出简单和复杂碰撞体之间的不同。
堵塞(Blocking)、重叠(Overlapping)和忽略(Ignoring)
首先你要知道的是。当你谈论一些事应该发生碰撞,你必须选择能否够穿透(penetrate)它。
一面砖墙会堵塞一个玩家,但一个触发器(trigger)会使它们重叠,同意它们重叠。它们都会产生一个事件(在UE4中的术语分别为击中(Hit)或重叠(Overlap)),只是这是一个重要的区别。而其他对象能够忽略互相碰撞。这给了我们三种不同的碰撞类型。
追踪通道和对象通道
下一个大问题碰撞过滤的核心:“该选择谁?”是物体决定了什么类型的查询来碰撞?还是查询决定了查找什么类型的对象?在不同的情况下,它们都是合理的,所以UE4都支持!
想象一下我们在我们的游戏中定义了两个“追踪通道”。一个是“可见性”,一个是“武器”查询。一面砖墙是用来堵塞它们。一个灌木堵塞“可见性”可是不堵塞“武器”,一个防弹玻璃堵塞“武器”可是不堵塞“可见性”。当你做这样的查询。你指定了单个追踪通道。
假设我们对此改变了,因此游戏代码必须知道什么对象类型用来查询,我们游戏可能须要大量的不同类型来处理全部这些场景!它也同意我们之后在内容做“现场修复”,而不是改动调用代码本身和破坏其他的东西。
然而有一些情况下。你想做只基于它们类型的对象查询,这就是我们用的对象通道。一个样例是一个爆炸发生。你想高速查找在一定半径内的“Pawn”或“PhysicsBody”类型的全部对象。
当你做这样的类型的查询时,你能够指定多对象通道。
UE4有一些“内置”追踪通道(可见性,摄像机)和对象通道(世界静态、世界动态、Pawn、PhysicsBody、Vehicle、可破坏),可是你能够简单地通过编辑->项目设置->碰撞加入你自己的通道。虽然你被限制在32个通道总数内。
运动对象间的碰撞
当你想处理移动对象的时候,事情变得有一点复杂。由于这里有许多种组合。在UE4。每一个对象知道它自己的对象通道。加入一个列表关于怎样响应其他对象通道。当两个物体相交。我们着眼于他们怎样互相响应,和採取最小堵塞(least blocking)交互,例如以下图所看到的:
所以想象以下的场景:
如今这个角色向前移动。
首先它会与灌木丛(Shrub)重叠。玩家是Pawn类型,而且灌木丛想要与它重叠。Shrub是世界静态(WorldStatic)类型,而且玩家想要堵塞它。检查上面那个表格。终于的结果是重叠!相同的,砖墙和玩家都想堵塞对方。所以玩家走过灌木丛(产生重叠事件)和它会被墙截停(产生击中事件)。
假设你有两个玩家。而且一个想变成“幽灵”,你能够让它到Pawn的响应频道从Block改为Ignore。然后他会穿透其他玩家。
碰撞预设
虽然这个系统给了大量控制关于你的场景中的对象怎样与其他对象碰撞,实际上大多数对象在使用共同的配置。为了让事情更简单,UE4有一个“碰撞预设”系统。每一个预设包括了一个对象类型,和在你的游戏中的对于每一个追踪和对象通道的一个响应。
当你选择场景中的一个对象,你会看到一个简单的下拉菜单,同意你选择一个预设:
UE4有几种内置通道(比如不可见墙,物理Actor等等),而且你能够在项目设置创建自己的通道。假设你不想使用预设,你能够选择“自己定义…”然后你能够改动每一个响应。像我们例如以下谈论的:
简单和复杂碰撞
最后一件事要理解的是:UE4中的每一个对象都有“复杂”和“简单”碰撞表示。复杂的碰撞指使用实际的渲染几何体碰撞。
这对于武器追踪来说是最实用的东西。你能够射击你能看得到的东西。虽然你不总是想要碰撞这个,而且每一个网格也能够有简单碰撞表现。其由球体、盒子、胶囊体和凸外壳集合组成。当你运行碰撞查询,你告诉UE4你想要碰撞的几何体。比如,角色移动,使用简单几何体碰撞。来避免在细节上的卡住。
编辑器那里有一个方便的查看模式,让你看见作为一个角色会碰撞的东西:
总结
这里已经是全部内容。碰撞过滤是一个令人沉醉的世界!我希望它有助于了解一些我们试图解决和怎样利用它来用到你自己的游戏中。有不论什么疑问或评论?我们总是在论坛或者你能够在推特联系我@EpicJamesG。
*我们实际上在第一个堵塞碰撞发生后停止继续查找碰撞。这是一个很好的性能优化——想象开了一枪范围可达1km的子弹打中了距离你1m的墙,我们省去了999米的工作!