【问题标题】:Detect Collision point between a mesh and a sphere?检测网格和球体之间的碰撞点?
【发布时间】:2009-08-23 10:47:15
【问题描述】:

我正在使用OgreMOC 编写物理模拟。

我有一个球体,我从相机的位置拍摄,它使用相机的前向矢量沿相机面对的方向行进。

我想知道如何检测我的球体和另一个网格之间的碰撞点

如何使用 MOC 或 OGRE 检查两个网格之间的碰撞点?

更新:应该在前面提到过。我无法使用第 3 方物理库,因为我需要自己开发它(uni 项目)。

【问题讨论】:

    标签: physics collision-detection ogre3d


    【解决方案1】:

    这里公认的解决方案完全不起作用。如果网格密度通常足够高以至于网格上没有两个点的距离比碰撞球的直径更远,它甚至会起作用。想象一个小球体在 huuuge 立方体网格的随机矢量上短距离发射。立方体网格只有 8 个顶点。立方体实际击中这 8 个顶点之一的几率是多少?

    这确实需要通过每个多边形碰撞来完成。您需要能够检查多边形和球体的交集(如果您想避免像 reinier 提到的隧道效应,还需要检查圆柱体)。有很多在线和书籍形式的资源,但http://www.realtimerendering.com/intersections.html 可能是一个有用的起点。

    关于优化的cmets很好。早期的机会(可能是针对网格的边界球或轴对齐的边界体积进行快速检查)是必不可少的。即使您确定自己位于包围体中,从潜在候选者列表中剔除不太可能的多边形(太远、朝向错误的方向等)可能也是一个好主意。

    【讨论】:

    • 感谢您指出这一点。我完全错过了那个案子。但是对于网格和球体大小相似或球体更大的解决方案,他可以正常工作吗?
    • @Toad 对于该解决方案,与边界球体的交集可以工作。
    【解决方案2】:

    我认为最好的办法是使用专门的物理库。

    就是这么说的。如果我考虑这个问题,我会怀疑它并不难:

    球体有一个中点和一个半径。对于网格中的每个点,请执行以下操作:

    1. 检查点是否在球体内。
    2. 如果它确实检查它是否比先前找到的点更靠近中心(如果有)
    3. 如果确实如此...将此点存储为碰撞点

    当然,这个程序会相当慢。 加快速度的几件事:

    1. 对于第一个微不足道的拒绝,首先查看网格的边界球是否发生碰撞
    2. 检查距离时不要计算平方根...改用平方长度。(快得多)
    3. 不是比较网格的每个点,而是对网格使用维度空间划分算法 (quadtree / BSP) 来快速排除点组

    啊...只有当球体行进速度不太快(相对于网格)时,此例程才有效。如果它的速度非常快,并且您每秒对其采样 X 次,那么球体很可能会直接穿过网格而不会发生每次碰撞。为了克服这个问题,您必须使用“扫描体积”,这基本上使您的球体变成了一个管子。使数学变得复杂。

    【讨论】:

    • 如果您的网格相对于您的球体较大,您可能会在连接边与球体相交的球体外部获得 2 个点。当然,如果您不能在您的上下文中得到这个,那么您可以只进行球内点测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多