如何显示两个物体是否在3D空间中移动

时间:2013-05-27 19:10:35

标签: math 3d game-engine game-physics

我正在开发另一款3D游戏引擎,并有以下问题。为了提高性能,我想检查两个物体是否靠近或彼此远离。只有当它们彼此接近时才会发生碰撞检测。

此时代码使用两个对象的位置计算当前距离。然后围绕速度矢量移动两个位置并计算预期距离。等

public class Model{

    public boolean isApproaching(Model model) {
        float [] otherPosition = model.getPosition();
        float [] otherVelocity = model.getVelocity();
        double currentDistance = Math.pow(this.position[0] - otherPosition[0], 2)
                                + Math.pow(this.position[1] - otherPosition[1], 2)
                                + Math.pow(this.position[2] - otherPosition[2], 2);
        double expectedDistance = Math.pow(this.position[0] + this.velocityVector[0]/1000 - otherPosition[0] - otherVelocity[0]/1000, 2)
                                + Math.pow(this.position[1] + this.velocityVector[1]/1000 - otherPosition[1] - otherVelocity[1]/1000, 2)
                                + Math.pow(this.position[2] + this.velocityVector[2]/1000 - otherPosition[2] - otherVelocity[2]/1000, 2);
        if(currentDistance < expectedDistance)
            return false;
        return true;
    }

}

正如您在图片中看到的那样,它不适用于快速移动的物体。有没有什么好方法可以证明两点是否相互走向?

enter image description here

2 个答案:

答案 0 :(得分:1)

考虑到两条直线轨迹,它们是最接近的唯一时间,这可能是过去的。如果它在过去那么意味着物体彼此远离,但如果它在未来意味着它们正在靠近在一起。但即使是它们也在一起移动,我猜想知道你需要多长时间的信息,这样你就可以安排什么时候担心它。这种方法应该适用于慢速移动和快速移动的物体。

答案 1 :(得分:1)

您似乎使用/1000与任何其他值的某些未说明的原因可能会否定以下内容。

通过更改此比例因子,您可以使用快速对象更好地检测。除isApproaching()代替/(1000*N)外,执行相同的/1000计算。然后,你会知道他们是否接近,N次灵敏度会提高N倍。