Answers:
距离场(或距离变换或距离图)是一种网格结构,其中网格中的每个像元代表从该像元到具有某些其他属性的像元的最短距离。通常,“其他属性”是单元格的边界类型,例如玩家无法通过的墙或网格的表面。
距离字段具有很多适用性。您可以想象,例如,如何将它们用于实现运动指导(通过创建到危险或理想物体的距离图并加权它们的运动决策)。
但是,您专门询问了碰撞。使用距离场在两个运动物体之间执行碰撞检测可能会很快变得效率低下,因为随着距离场的扩大,重建距离场可能会变得非常缓慢(特别是在3D中,尽管改善生成时间的方法是一个研究领域)。
因此,距离场碰撞主要用于检测动态对象与静态对象的碰撞。最常见的是,我已经看到这样做是为了检测场景中布料(或其他可变形)对象与其他固定对象的碰撞。
粗略地说,这是通过对静态对象使用带符号的距离字段来实现的,其中一个符号(通常为负)表示网格内的一个单元,而另一个符号(显然通常为正)表示网格外的一个单元。可以将布料网格的粒子转换为静态网格物体的局部空间,并且可以根据距离场检查给定布料模拟步骤中粒子的“之前”和“之后”位置,以确定符号是否已更改(以及因此发生了碰撞)。例如,这是2003年有关布料模拟的论文中讨论的方法。
请注意,我不建议使用距离字段作为唯一的碰撞检测方法。他们擅长的领域可以相当高效,但并不是所有方面都擅长。实现有效冲突检测的最佳方法通常是分层使用多种方法,并且在遍历层次结构时会提高精度。
什么是距离场?
在几何图形和计算机图形学中以及还用于图像处理中,距离场(简单而言)是每个单元(图像处理中的像素)上的标签,具有最近的多边形对象或具有特殊属性的像素在图像处理中的距离。
换句话说,它是每个单元格的标签,该标签的值是具有由地图定义的特殊属性的最近对象的值。对象因应用程序而异。
上图包含边界像素的距离图。注意每个像素如何包含到最近边界像素的距离。该距离是使用曼哈顿距离计算的。
有多种计算距离的方法,典型的方法包括:
它在碰撞检测中如何应用?
通过为场景中的对象维护距离图,您可以根据该距离检查两个对象是否发生碰撞。不幸的是,维护这样的地图是昂贵的。这通常用于自相交的对象,例如布料模拟,由于对象的性质,可以更有效地维护和更新距离图。