所以,我想找出一个函数,可以让您确定两个任意旋转和大小的立方体是否相交。
如果立方体的旋转不是任意的(而是锁定到特定的轴),则相交很简单;您可以通过检查它们的边界来检查它们是否在所有三个维度上相交,以查看它们在所有三个维度上是否相交或在彼此之内。如果它们交叉或仅在两个之内,则它们不相交。此方法可用于确定任意立方体是否甚至是交集的候选者,使用它们的最高/最低 x、y 和 z 创建外部边界。
这是第一步。理论上,从这些信息中我们可以分辨出它们各自位于哪一侧,这意味着我们可以从交叉点中消除一些四边形(边)。但是,我不能假设我们拥有该信息,因为立方体的旋转可能会使简单地确定变得困难。
我的想法是获取每对四边形,找到它们平面的交点,然后确定该线是否与每对边的至少一条边相交。如果任意一对边有一条交线与其任意边相交,则四边形相交。如果不相交,则两个立方体不相交。
然后,我们可以通过平面相交线与其边缘相交的位置来确定第二个立方体上相交的深度。
然而,这只是推测。有没有更好、更有效的方法来确定这两个立方体的交集?我可以想到许多不同的方法来做到这一点,而且我还可以看出它们在所需的计算量方面可能非常不同。
我目前正在使用 Java 工作,但 C/C++ 解决方案也很酷(我可以移植它们);甚至是伪代码,因为这可能是一个大问题。
要在三个维度中找到两个任意立方体的交点(接触)点,您必须分两个阶段进行:
- 检测碰撞。这本身通常是两个阶段,但为了简单起见,我们将其称为“碰撞检测”。
该算法可以是 SAT(分离轴定理),也可以是多胞体展开/缩减的某种变体。再次,为了简单起见,我们假设您将使用 SAT。
我不会详细解释,因为其他人已经做过很多次了,而且比我做得更好。由此得出的“结论”是,碰撞检测并不是为了告诉您where发生碰撞;只是它已经发生了。
- 检测到交叉点后,您需要计算接触点。这是通过多边形裁剪算法完成的。在这种情况下,我们使用https://en.wikipedia.org/wiki/Sutherland%E2%80%93 霍奇曼算法 https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm
有更简单、更好的方法可以做到这一点,但 SAT 在 3d 中很容易掌握,SH 剪辑也很容易让您了解,因此对您来说这是一个很好的起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)