解决两个几何实例之间的碰撞(墙滑动)

时间:2015-09-22 09:27:57

标签: java collision-detection java-2d jts

我玩JTS拓扑套件看起来相当不错。 但是,我无法解决两个Geometry实例之间的冲突。我想在几何A和B之间执行一个墙滑动(见下面的截图)。 enter image description here

我尝试实施此评论中发布的解决方案(解决方案2): https://gamedev.stackexchange.com/questions/104099/how-to-go-about-an-intermediate-collision-resolution-system/104105#104105

然而,我无法计算光线投射,甚至无法计算A碰撞的B边界向量的法线。

有人会给我一个如何使用JTS实现墙滑动的起点吗?

  • 如何沿运动矢量进行光线投射(计算两个几何实例的碰撞位置)?
  • 如何计算碰撞正常?

编辑:Geometry类提供的方法可以帮助我“交叉”和“交叉”。如果参数几何图形与此几何图形相互作用,则“intersects”将返回true。 “intersection”返回一个Geometry,表示两个Geometries共有的点集。也许我可以用“十字路口”找到第一个碰撞点。

有人用JTS做过这个吗?也许该套件已经提供了执行此任务的算法。

提前致谢

1 个答案:

答案 0 :(得分:1)

光线投射意味着您定义起点和方向,并以无限长度矢量(光线)计算。然后计算光线撞击物体的位置。

在您的情况下,光线方向将是您的运动矢量,起点将取决于几何体/边界形状的形状。如果是边界框,您可以从每个角落投射多条光线,并检查哪个角落首先击中障碍物。当然,如果盒子碰到障碍物的角落等,这将无法正常工作。但这可能提供一个起点。请注意,有效且正确的碰撞检测是一个非常复杂的主题。

至于你的第二个问题:IIRC,碰撞法线是运动矢量的平均值和运动矢量在碰撞表面上的投影。每个载体的重量取决于移动速度和表面性质,例如,反弹力。同样相当复杂的话题和我的记忆可能会让我觉得这里(碰撞正常也可能只是撞击点处​​碰撞表面的法线)

让我试着用一些ascii图来说明第二点:

O - moving object
 \ - motion vector
  \ 
   \    / - collision normal
    \  /
  ___\/__.___________ - collision surface ("average" of motion vector and vector between impact point and the "dot" projected onto the surface)
      \  |
       \ | - project motion vector from "inside" onto the collision surface (up in this case)
        \|

请注意,我的脑袋可能会欺骗我,如果我有时间的话,我会查阅一些教程/说明。

可能有助于您入门的一些链接: