0

我正在尝试学习 Godot 3D 中的碰撞,但我在理解 Godot Docs 中的此代码示例时遇到了一些困难: Godot Docs - Advanced Vectors

我怎样才能理解这段代码?具体来说,在读取的部分中if (min_A > max_B or min_B > max_A):,具体发生了什么让引擎确定两个网格没有重叠或碰撞?

我提供链接的网站的代码示例如下:

var overlapping = true

for p in planes_of_A:
var all_out = true
for v in points_of_B:
    if (p.distance_to(v) < 0):
        all_out = false
        break

if (all_out):
    # a separating plane was found
    # do not continue testing
    overlapping = false
    break

if (overlapping):
# only do this check if no separating plane
# was found in planes of A
for p in planes_of_B:
    var all_out = true
    for v in points_of_A:
        if (p.distance_to(v) < 0):
            all_out = false
            break

    if (all_out):
        overlapping = false
        break

if (overlapping):
for ea in edges_of_A:
    for eb in edges_of_B:
        var n = ea.cross(eb)
        if (n.length() == 0):
            continue

        var max_A = -1e20 # tiny number
        var min_A = 1e20 # huge number

        # we are using the dot product directly
        # so we can map a maximum and minimum range
        # for each polygon, then check if they
        # overlap.

        for v in points_of_A:
            var d = n.dot(v)
            max_A = max(max_A, d)
            min_A = min(min_A, d)

        var max_B = -1e20 # tiny number
        var min_B = 1e20 # huge number

        for v in points_of_B:
            var d = n.dot(v)
            max_B = max(max_B, d)
            min_B = min(min_B, d)

        if (min_A > max_B or min_B > max_A):
            # not overlapping!
            overlapping = false
            break

    if (not overlapping):
        break

if (overlapping):
print("Polygons collided!")
4

1 回答 1

0

需要明确的是,这不是 Godot 问题,更多的是通用游戏引擎和矢量数学问题。这是检测碰撞的常用方法,使用叉积和点积来确定一个多边形中的点是否在另一个多边形内。

如果您知道叉积和点积的定义,我鼓励您抓起一张纸,绘制两个任意碰撞的多边形,然后逐步完成这个示例,看看 Godot 到底在做什么来确定碰撞。如果你不知道交叉和点积的定义,KhanAcademy 有一些很好的介绍。

话虽如此,如果您正在尝试开发游戏,则应忽略此示例,因为它是游戏内部物理引擎的一个非常具体的细节,您无需了解即可充分利用物理引擎。跳过代码,打开 Godot,制作一堆碰撞对象,玩弄它们,看看它们的行为,然后如果你想了解碰撞检测的工作原理,可以使用 Godot 的信号在 GDScript 中创建一些简单的碰撞检测示例戈多。

只有当您有兴趣学习如何构建自己的游戏引擎时,此示例才真正重要。如果你是的话,有比 Godot Docs 更好的地方来了解碰撞检测是如何实现的!我推荐Jason Gregory 的Game Engine Architecture (ISBN: 9781568814131)。

于 2019-07-29T19:03:09.403 回答