当前位置:  开发笔记 > 编程语言 > 正文

三维点三角碰撞检测

如何解决《三维点三角碰撞检测》经验,为你挑选了1个好方法。

如何在以下物理模拟中更正浮点错误:

原点(x,y,z),

施加力后所需的点(x',y',z').

共享边缘BC的两个三角形(A,B,C)和(B,C,D)

我正在使用这种方法进行碰撞检测:

For each Triangle
    If the original point is in front of the current triangle, and the desired point is behind the desired triangle:
        Calculate the intersection point of the ray (original-desired) and the plane (triangle's normal).
        If the intersection point is inside the triangle edges (!)
            Respond to the collision.
        End If
    End If
Next Triangle

我遇到的问题是,有时候该点落入浮点数学的灰色区域,它靠近BC线,以至于它不能与任何一个三角形碰撞,即使从技术上来说它应该总是与其中一个碰撞.他们有共同的优势.当发生这种情况时,该点在两个边共享三角形之间正好通过.我用(!)标记了一行代码,因为我相信这是我应该做出改变的地方.

在非常有限的情况下工作的一个想法是跳过边缘测试.有效地将三角形转换为平面.这只适用于我的网格是凸包的情况,但我计划创建凸形.

我专门使用点积和三角法线进行所有前后测试.



1> Gareth Rees..:

当使用边和顶点针对某些几何体拍摄单个光线时,这是一个不可避免的问题.令人惊讶的是,物理模拟似乎寻找最小的数值误差!

其他受访者提出的一些解释和解决方案将不起作用.特别是:

数值不准确确实会导致射线"穿过间隙".问题是我们在测试线BC之前将光线与平面ABC(比如说得到点P)相交.然后我们在测试线BC之前将光线与平面BCD(得到点Q,例如)相交.P和Q都用最接近的浮点近似表示; 没有理由期望这些完全躺在它们应该躺在的平面上,所以你可以将BC放在BC的左边和Q放在BC的右边.

使用低于或等于的测试将无济于事; 这是射线和飞机交叉点的不准确之处.

平方根不是问题; 你可以使用点积和浮点除法进行所有必要的计算.

这是一些真正的解决方案:

对于凸网格,您可以测试所有平面并忽略边和顶点,正如您所说(从而完全避免了问题).

不要依次将光线与每个三角形相交.相反,使用标量三重产品.(当考虑每个三角形时,此方法对光线和边缘BC进行完全相同的计算序列,确保两个三角形之间的任何数值不准确性至少一致.)

对于非凸网格,请为边和顶点指定一些宽度.也就是说,在网格中的每个顶点放置一个小球体,并沿网格的每个边缘放置一个细圆柱体.将光线与这些球体和圆柱体以及三角形相交.这些额外的几何图形阻止光线穿过网格的边缘和顶点.

让我强烈推荐Christer Ericson 的" 实时碰撞检测 "一书.第446-448页讨论了这个确切的问题,并对第184-188页上的光线与三角形相交的标量三重积方法进行了解释.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有