检测网格和球体之间的碰撞点?

时间:2009-08-23 10:47:16

标签: physics collision-detection ogre3d

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

我有一个从相机位置拍摄的球体,它使用相机的前向矢量沿着相机朝向的方向移动。

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

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

更新:本来应该提到这个。我无法使用第三方物理库,因为我需要自己开发(uni项目)。

2 个答案:

答案 0 :(得分:8)

此处公认的解决方案不起作用。如果网格密度通常足够高,使得网格上没有两个点比碰撞球体的直径更远,那么它甚至可以工作。想象一下在huuuge立方体网格上随机向量上的短距离发射的小球体。立方体网格只有8个顶点。多维数据集实际上会击中这8个顶点之一的几率是多少?

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

关于优化的评论很好。早期机会(可能是对网格的边界球或轴对齐的边界体积进行快速检查)是必不可少的。即使你已经确定自己在一个边界体积内,也许能够从潜在候选者列表中清除不太可能的多边形(太远,面向错误的方向等)可能是个好主意。

答案 1 :(得分:2)

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

那就是说。如果我想到这个问题,我会怀疑它并不那么难:

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

  1. 检查点是否位于球体内。
  2. 如果检查它是否比先前找到的点(如果有的话)更接近中心
  3. 如果确实...将此点存储为碰撞点
  4. 当然,这个例程会相当慢。 加快它的一些事情:

    1. 对于第一个微不足道的拒绝,首先看看网格的边界球是否碰撞
    2. 在检查距离时不要计算平方根...而是使用平方长度。(快得多)
    3. 不是比较网格的每个点,而是使用维度空间划分算法(四叉树/ BSP)来快速排除网格点
    4. 啊......这个例程只有在球体移动得太快(相对于网格物体)时才有效。如果它会非常快地行进,并且你每秒采样X次,那么球体可能会在没有碰撞的情况下直接穿过网格。为了克服这个问题,你必须使用“扫掠体积”,它基本上可以使你的球体成为一个管子。使数学成倍增长。