Algorithm 仅限整数运算的三维三角形碰撞检测

Algorithm 仅限整数运算的三维三角形碰撞检测,algorithm,language-agnostic,computational-geometry,Algorithm,Language Agnostic,Computational Geometry,我只需要使用整数数学进行3D三角形碰撞检测。不幸的是,我不能使用64位整数(仅32位),并且我的顶点值可以大于24位值。这使得溢出成为一个棘手的问题——否则我可能只使用定点操作 好消息是我不需要完美的精确度——毕竟,我们使用的是整数。此外,它不需要连续的碰撞检测——速度为零。但我可能会测试大三角形与小三角形的碰撞,所以法线的粗略近似可能会导致严重的相对误差 三角形本身表示为32位整数向量的三元组 有没有办法做到这一点?这可以通过计算四面体的有符号体积来实现。我在MSE的帖子中描述了这个想法:“

我只需要使用整数数学进行3D三角形碰撞检测。不幸的是,我不能使用64位整数(仅32位),并且我的顶点值可以大于24位值。这使得溢出成为一个棘手的问题——否则我可能只使用定点操作

好消息是我不需要完美的精确度——毕竟,我们使用的是整数。此外,它不需要连续的碰撞检测——速度为零。但我可能会测试大三角形与小三角形的碰撞,所以法线的粗略近似可能会导致严重的相对误差

三角形本身表示为32位整数向量的三元组


有没有办法做到这一点?

这可以通过计算四面体的有符号体积来实现。我在MSE的帖子中描述了这个想法:“

然后,您的问题被简化为确保立方体积计算
不会溢出。您可以检测溢出,并仅在必要时使用浮点计算。

如果有疑问,可以使用递归细分三角形的轴平行边界框测试(您可能会执行该测试)如何?(通过取边的中点,可以将三角形拆分为四个子三角形)

根据最大值±x±y、±x±y±z等(总共26个方向)的评估,将使用附加平面实现更紧密的边界


只有整数的加法和减半。

交叉发布到。不幸的是,我不能依赖浮点,即使是一个失败的例子。这不仅仅是性能的问题,而是跨平台可重复性的问题。正因为如此,计算线段和三角形之间的交集也很重要——如何使用整数数学而不溢出似乎并不简单。如果没有更直接的方法,我怀疑我可能需要使用定点表示法或模拟浮点计算来保证可重复性。@Kaganar:我想你需要模拟更多位。没有神奇的解决办法。基本上,你需要能够精确地计算a,b,c,其中a,b,c是坐标。您可能需要编写多个单词加法和乘法函数,本质上是一个有限的bignum包。我想到了一些更具“创造性”的解决方案,例如在收敛方向上动态细分三角形,但在某些情况下收敛太慢,无法合理执行。我想你已经说服我写了我自己的可重复数字处理例程——谢谢@卡加纳:祝你好运!我不羡慕你。不要重新发明轮子:等等。这是一个奇妙的想法,我已经考虑过了——我的主要问题是它如何处理具有小间距的共面三角形。可能会出现干扰边界框的指数级爆炸。有没有一种方法我可能还没有考虑过呢?考虑到即将发生的修剪,我想知道指数爆炸是否真的能表现出来。拆分过程的终止也是一个悬而未决的问题,因为您可能无法仅通过查看边界框来确定三角形是否相交。无论如何,经过足够多的细分后,坐标范围变得越来越小,因此无溢出计算再次变得可行。只是为了好玩,我一瘸一拐地拼凑了一个修剪版本,并在v=2000和s=10的两个三角形上运行它:([0,0,0],[v,v,0],[0,v,v])和([0,s,0],[v,v+s,0],[0,v+s,v])。注意,这是同一个三角形,只有一个向上移动了10个单位。大约花了1000万次电话来确认它们不相交。对于s中每增加一个10,这下降得相当快。s=20导致250万,s=30导致130万,s=40导致150万,依此类推……嗯,有点太多了:(是否每次都拆分两个三角形?