使用顶点坐标进行三维Java碰撞检测

时间:2015-10-18 12:30:40

标签: java

所以我设置了所有可能会产生碰撞检测的东西,但是我对于如何碰撞碰撞感到很茫然。

所以从我的对象中我得到了一些我可以使用的变量但是对于一个简单的BoundingBox我可能只需要这些:

System.out.println("width: " + width);
System.out.println("height: " + height);
System.out.println("depth: " + depth);
System.out.println("center[" + xPos+ "/" +yPos+ "/" +zPos+"]");

所以我想要的是一些允许我在两个BoundingBox相互交互的情况下使用ckeck的代码,它不应该太难以为此提出代码但是我真的很难用这个代码,所以我将不胜感激任何帮助!

我将有两个提到属性的aabb:

private void AABB_1()
}
// (width,height,depth,xPos,yPos,zPos)
}

private void AABB_2()
}
// (width,height,depth,xPos,yPos,zPos)
}

在BoundingBox方法中,我想检查两个aabb的交互,并将布尔值设置为false或true:

public void BoundingBox()
{
    AABB_1();
    AABB_2();

    boolean intersection;

// check if AABB_1 and AABB_2 intersect each other
// If yes set intersection = true
// If no set intersection = false     
} 

这里的BoundingBox方法将是碰撞检测,但正如我所说,我不知道我会如何ckeck for intersection,有没有人有想法?

2 个答案:

答案 0 :(得分:0)

首先考虑1D:

//(minX---maxX)
//Non overlap cases:
//a: |----|       
//b:       |----|

//a:       |----|
//b: |----|

public static void intersectOnX(a,b){
  if (b.minX > a.maxX || a.minX > b.maxX)
    return false;//no intersect
  else
    return true;//intersect
}

对每个额外的维度重复此操作:

public static void intersect(a,b){
  if (!intersectOnX(a,b))
    return false;//no intersect

  if (!intersectOnY(a,b))
    return false;//no intersect

  if (!intersectOnZ(a,b))
    return false;//no intersect

  return true;//intersect!
}

答案 1 :(得分:0)

鉴于您有一个带有中心和三个扩展的框,您还可以编写一个Box方法

boolean overlaps( Box other ){
    return
        Math.abs(xPos - other.xPos) <= (width + other.width)/2
        &&
        Math.abs(yPos - other.yPos) <= (depth + other.depth)/2
        &&
        Math.abs(zPos - other.zPos) <= (height + other.height)/2;
}

(检查x,y,z和宽度,深度,高度是否相关。)

如果您只有一些存储这些6 + 6值的变量,您可以将表达式写为例如。

Number x1, y1, z1, w1, d1, h1;
Number x2, y2, z2, w2, d2, h2;

boolean overlaps =
    Math.abs(x1 - x2) <= (w1 + w2)/2
    &&
    Math.abs(y1 - y2) <= (d1 + d2)/2
    &&
    Math.abs(z1 - z2) <= (h1 + h2)/2;