【发布时间】:2013-07-07 15:23:21
【问题描述】:
所以,我想找出一个函数,让您确定两个任意旋转和大小的立方体是否相交。
如果立方体的旋转不是任意的(而是锁定在特定的轴上),则相交很简单;您可以通过检查它们的边界来检查它们是否在所有三个维度上相交,以查看它们在所有三个维度上是否交叉或在彼此内。如果它们交叉或仅在两个之内,则它们不会相交。此方法可用于确定任意立方体是否是交叉的候选对象,使用它们的最高/最低 x、y 和 z 来创建外部边界。
这是第一步。理论上,从这些信息中,我们可以分辨出它们彼此位于哪个“边”上,这意味着我们可以从交叉点中消除一些四边形(边)。但是,我不能假设我们有这些信息,因为立方体的旋转可能很难简单地确定。
我的想法是取每一对四边形,找到它们平面的交点,然后确定这条线是否与每对边的至少一条边相交。如果任何一对边有一条与它们的任何边相交的交线,则四边形相交。如果没有相交,则两个立方体不相交。
然后,我们可以通过平面相交线与其边相交的位置来确定第二个立方体上相交的深度。
不过,这只是推测。有没有更好、更有效的方法来确定这两个立方体的交集?我可以想到许多不同的方法来做到这一点,而且我还可以看出它们在所需的计算量方面可能会有很大的不同。
我目前正在使用 Java,但 C/C++ 解决方案也很酷(我可以移植它们);甚至是伪代码,因为这可能是一个大问题。
【问题讨论】:
-
Separating Axis Theorm 不是在 3D 中像在 2D 中一样工作吗?
-
我认为可能。我没有想到这一点;我已经使用“3D 作为三组 2D”的版本。这可能比我想象的要简单!
-
我打赌这对你有用。我很确定我在研究 2d 多边形交叉点时读过它
-
似乎您会将 SAT 应用于每个面的法线对另一个立方体。如果任何测试失败,立方体不会相交。对于某些形状,我必须加倍,因为四边形是“弯曲的”(即三角形不齐平)。对于任何常规立方体/矩形棱镜对,看起来最多 16 次测试。
-
听起来是对的。这是一个问题吗?如果是这样,您可以研究空间分区以减少需要检查的对。另外我不知道您的意图,但是立方体正在快速旋转或动画中的时间步长很好,请注意如果没有更高级的解决方案,您可能会错过交叉路口。
标签: java 3d geometry intersection