检测正方形的哪一边与碰撞检测相冲突



我使用Corona SDK来检测碰撞。使用以下代码检测碰撞是在正方形的左侧还是在右侧没有问题:

if (event.other.x < displayObj.x)

碰撞码:

function box:collision(event)
  if event.phase == "ended" then 
    if event.other.id and event.other.id == "c" then 
      --need to detect top collision 
      test = 1 
    end

如何检测正方形的顶部是否与什么东西相撞?

你可以使用线性代数!向量和点积对于求出你想要的东西非常有用。你可以找到更深入的信息,如果你谷歌:Half-space test dot product

假设你有一个名为A的盒子和碰撞点B,位置为(A.x,A.y)(B.x,B.y),盒子的前进方向由(A.dirX, A.dirY)决定,你可以确定点B在盒子a方向的前面还是后面,如下所示:

  1. 获取从位置a到位置B的矢量并将其归一化:

    vectorToBNormalized = normalize((B.x,B.y)-(A.x,A.y))

  2. 使用vectorToBNormalizedA的前向向量的点积来确定B是否在前面或后面

    result = dot(vectorToBNormalized, normalize(A.dirX, A.dirY))

如果结果小于0,则:B落后于A;如果结果大于0,则:B在a前面

要找出盒子B是在盒子A的左边还是右边,重复这个过程,但是对盒子A使用一个面向右的向量而不是一个面向前的向量。例如,如果up是由(0, 1)定义的,那么right就是(1, 0)

这样你就可以确定碰撞点是在后方/前方,还是左/右。

最新更新