我想做一些 2D 刚体(多边形)物理,我找到了一个复杂的方程来计算碰撞响应。但是,在此之前,我需要一种很好的方法来找到该响应程序的“输入”。
我认为这样的输入应该是碰撞点的坐标,并且在这一点上与碰撞边缘垂直。有许多算法可以进行碰撞检测。例如,我可以测试多边形 A 的某个顶点是否在多边形 B 内,但它不会给我一个边缘的法线。然后我可以在循环中测试边缘的交点 - 但这是最简单的方法还是有更简单的方法?
我想做一些 2D 刚体(多边形)物理,我找到了一个复杂的方程来计算碰撞响应。但是,在此之前,我需要一种很好的方法来找到该响应程序的“输入”。
我认为这样的输入应该是碰撞点的坐标,并且在这一点上与碰撞边缘垂直。有许多算法可以进行碰撞检测。例如,我可以测试多边形 A 的某个顶点是否在多边形 B 内,但它不会给我一个边缘的法线。然后我可以在循环中测试边缘的交点 - 但这是最简单的方法还是有更简单的方法?
Normal to the edge
取决于polygon only
. 这不是碰撞数据。
根据程序中多边形的定义方式,您可以从中获取法线。
假设它由顶点数组定义。
一条边取两个连续的点,定义一条直线(边),边的向量为:
EdgeVectorX = SecondPointX - FirstPointX
EdgeVectorY = SecondPointY - FirstPointY
对此的正常 vetor 您可以将 X 更改为 Y 并使其中一个为负数:
NormalX = -EdgeVectorY
NormalY = EdgeVectorX
要使其成为长度为 1 的向量,请将 NormalX 和 NormalY 除以向量的长度:
Length = SquareRoot(NormalX*NormalX + NormalY*NormalY)
关于检查顶点是否在某个多边形内,请务必测试内部是否没有任何其他顶点。如果不止一个点,您必须将实际位置与前一个位置进行插值,以找到单个顶点碰撞的确切时刻。(唯一的例外是边缘到边缘平行碰撞的幸运情况)。您使用的时间步长越大,错误就越大。
荒谬的错误是当时间步长足够大以使多边形相互穿过而不会检测到碰撞时。