我目前正在尝试实现一个简单的连续碰撞检测系统。我想知道,对于移动的AABB,在与凸多面体相交之前是否可以计算它可以在任意方向d
上平移的距离。这是2D的简单说明:
我想要的是绿线的长度(橙色AABB是初始位置,红色AABB是两个对撞机相交的位置)。
这也等同于尝试在方向d
上从原点发出Minkowski差A⊕-B,其中A是我的静态凸多面体,而B是我的移动AABB:
但是计算minkowski差似乎确实消耗了性能,因此我想知道是否存在一种快速的算法。
在谷歌搜索时,我看到了一种称为GJK的算法,但它似乎只返回总的最小距离,而不是方向距离。
在此先感谢您的回答!
PS:请原谅我英语不好,我完全缺乏使用油漆的艺术才能。
答案 0 :(得分:1)
您好,是的,这种算法已经存在,而且速度惊人。 它使用了minkowski差的想法,但是不需要完全计算它,您只需要从minkowski差中得出几点即可。这个想法是使用支持功能来计算形状在方向上的最远点。对于凸多面体,此函数易于实现,但是如果您能够描述非多面体(但仍是凸面)形状,则也可以使用此算法。 该算法基本上使用GJK来计算您可以在不相交A-B形状的情况下将原点移动多远。这样做直到原点足够接近A-B,这意味着A和B几乎重叠,它停止了。 这是完整算法的链接:https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwjx38Cx0u7jAhXG4IUKHQHGD4YQFjAAegQIABAC&url=http%3A%2F%2Fdtecta.com%2Fpapers%2Fjgt04raycast.pdf&usg=AOvVaw0OE9mgYb4NPQwAMqzLntRX
由于浮动错误,实现起来可能很棘手,但速度很快。