我正在开发另一款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;
}
}
正如您在图片中看到的那样,它不适用于快速移动的物体。有没有什么好方法可以证明两点是否相互走向?
答案 0 :(得分:1)
考虑到两条直线轨迹,它们是最接近的唯一时间,这可能是过去的。如果它在过去那么意味着物体彼此远离,但如果它在未来意味着它们正在靠近在一起。但即使是它们也在一起移动,我猜想知道你需要多长时间的信息,这样你就可以安排什么时候担心它。这种方法应该适用于慢速移动和快速移动的物体。
答案 1 :(得分:1)
您似乎使用/1000
与任何其他值的某些未说明的原因可能会否定以下内容。
通过更改此比例因子,您可以使用快速对象更好地检测。除isApproaching()
代替/(1000*N)
外,执行相同的/1000
计算。然后,你会知道他们是否接近,N次灵敏度会提高N倍。