我有2个六面体。唯一的保证是它们每个都有8个vertex3f(带有x,y和z分量的顶点)。鉴于此,我怎样才能知道这些是否发生碰撞?
答案 0 :(得分:5)
在我试图回答问题并删除我的帖子后,我删除了你的上一个问题后,我犹豫不决。请不要再这样做了。无论如何:
不一定是最佳的,但显然是正确的,基于constructive solid geometry:
听起来有点像工作,但没有什么复杂的。只有点积,交叉积(获得初始表示)和投影。
答案 1 :(得分:3)
我似乎太愚蠢了。
考虑一下。如果实体1的任何边缘与实体2的任何面相交,则会发生碰撞。这并不是很全面,因为有一种情况完全包含在另一种中,你可以通过确定其中一种是否包含在另一种中来进行测试。
检查边缘面交叉是这样的。
L
。[0,L]
为单位,并且必须位于平面中的图形内。最后一部分有点难,但有a well known general solution。这会奏效。为了口才,我更喜欢R..'s solution。如果你需要速度......好吧,你只需要尝试它们就可以看到。
答案 2 :(得分:1)
假设您的六面体之一H1
具有顶点(x_1, y_1, z_1), (x_2, y_2, z_2), ...
。找出每个坐标的最大值和最小值:x_min = min(x_1, x_2, ...)
,x_max = max(x_1, x_2,...)
,依此类推。对其他六面体H2
执行相同的操作。
如果间隔[x_min(H1), x_max(H1)]
和间隔[x_min(H2), x_max(H2)]
不相交(即x_max(H1) < x_min(H2)
或x_max(H2) < x_min(H1)
),则六面体不可能发生碰撞。对y
和z
坐标重复此操作。定性地说,这就像在x轴上观察每个六面体的阴影一样。如果它们不重叠,则多面体不会发生碰撞。
如果任何间隔重叠,则必须继续进行更精确的碰撞检测。这将更加棘手。明显的蛮力方法是检查一个边缘的任何一个边缘是否与另一个面相交,但我想你可以做得更好。
检查边缘是否与面相交的蛮力方法......首先,您会找到边缘定义的线与面定义的平面的交点(例如,请参阅wikipedia) 。然后你必须检查那个点是否实际上在边缘和面部。边缘很简单 - 只需看看坐标是否位于定义边缘的两个顶点的坐标之间。面部比较棘手,特别是不能保证凸起。在一般情况下,您只需要看到它所在的每个边缘定义的半平面的哪一侧。如果它在所有人的内半平面上,它就在脸部内部。遗憾的是,我现在没有时间打字,但我打赌谷歌搜索可以帮助你。但当然,这都是蛮力,可能有更好的方法。 (而且dmckee指出了一个不能处理的特殊情况)