2

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

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

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

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

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

4

2 回答 2

9

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

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

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

于 2009-08-25T03:29:20.637 回答
2

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

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

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

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

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

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

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

于 2009-08-23T12:06:18.377 回答