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

标签 java collision-detection java-2d jts

我试用了 JTS 拓扑套件,它看起来相当不错。 但是,我无法解决两个几何实例之间的碰撞。我想在几何体 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 边界 vector 的法线。

有人可以告诉我如何使用 JTS 实现墙壁滑动吗?

  • 如何沿着运动 vector 进行光线转换(计算两个几何体实例的碰撞位置)?
  • 如何计算碰撞法线?

编辑:Geometry 类提供了可能帮助我“相交”和“相交”的方法。如果参数几何图形与此几何图形相交,“相交”将返回 true。 “intersection”返回一个代表两个几何图形共有的点集的几何图形。也许我可以使用“交集”来找到第一个碰撞点。

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

提前致谢

最佳答案

光线转换意味着您定义一个起点和一个方向,并以无限长度 vector (光线)进行计算。然后计算光线将击中物体的位置。

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

关于你的第二个问题:IIRC碰撞法线是运动 vector 和运动 vector 在碰撞表面上的投影的平均值。每个 vector 的权重取决于运动速度和表面特性,例如弹性。这又是一个相当复杂的话题,我的内存可能会欺骗我(碰撞法线也可能只是撞击点处​​碰撞表面的法线)

让我尝试用一​​些 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)
        \|

请注意,这就是我的想法,这可能会欺骗我,如果有时间,我会查找一些教程/描述。

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

关于java - 解决两个几何实例之间的碰撞(墙壁滑动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32713296/

相关文章:

java - 绘制弧形并对其进行渐变

java - 如何在当前打开的编辑器中将特定字符串替换为另一个字符串?

java - 在 JFreeChart 中获取以下坐标

java - 物体跟踪,避免碰撞以及两个物体的当前速度

java - 在 Java 2D 中裁剪一般路径

java - JPanel 不显示图形

java - Spring mvc Restful - 错误的json回复格式

java - JMeter 测试未运行

ios - 我的代码检测到与 Sprite 的碰撞但没有发生碰撞? - swift

java - 球与球之间的碰撞