【问题标题】:Collision detection between two objects in javajava中两个对象之间的碰撞检测
【发布时间】:2019-01-17 05:55:18
【问题描述】:

我真的很难检测 Car 类的两个 Car 对象之间的碰撞。代码很长,所以很难包含所有内容。我已经包含了我的碰撞方法。如果您能发现任何逻辑错误,我认为这是我的问题,那就太好了。如果您需要更多上下文,我曾问过一个较早的类似问题,其中包含更多代码 here,但我仍然没有解决方案..

我想要它做的是在两辆车接触时告诉我。它所做的只是在发生碰撞时打印“无碰撞”。

碰撞方法(环境类内部)-

public boolean collision() {

    double MIN_DIS = 0.1;
    for (Car a : cars) {
        for (Car b : cars) {
            if (!(a.equals(b)) && (Math.abs(a.getPosition() - b.getPosition()) < MIN_DIS)) {
                return true;
            }
        }
    }
    return false;
}

调用方法(在我添加汽车的主要内部)-

    if(e.collision() == true) {
        System.out.println("collision");
    } else {
        System.out.println("no collision");
    } 

Equals 方法(我决定暂时使用 !(a == b))-

public boolean equals(Object obj) {
    if (obj instanceof Car){
        Car car = (Car) obj;
        return car.getPosition() == this.position && car.getLane() == this.lane && car.getColor().equals(this.color) && car.getSpeed() == this.speed; 
    }
    return false;
}

【问题讨论】:

  • getPosition 返回什么?双人间?
  • Car 只是一个点吗?您确定它们实际上正在碰撞,它们在哪里/在您预期碰撞时它们的位置是什么?添加大量日志记录。
  • @StalemateOfTuning 是的,它返回一个双倍
  • 另外,您是否在Car 中实现了自己的equals?只是想缩小范围
  • 汽车的长度可能是 40,但我没有看到任何地方都包含在碰撞逻辑中。看起来位置需要在任何长度单位的 0.1 内完全相等。

标签: java for-loop math methods collision-detection


【解决方案1】:

您可能想要更改检测“范围”。如果您查看检测汽车的方式,您只是在寻找精灵/矢量所在的坐标,如果有多个像素,它们将相对难以碰撞.尝试从Car Bwidth/length 中找到Car A 的位置。

【讨论】:

  • 我提高了检测范围,我的车长是 40,所以我认为可以做到。所有汽车的长度相同,但它只会在 49+ 时返回碰撞,但即使没有碰撞
  • 我强烈建议您将向量居中,然后像您一样获得该位置 (car.getPosition()),并将该位置作为变量,您可以找到高度范围 (position +/- car.height) 和宽度范围(position +/- (car.width/2))
【解决方案2】:

我认为相等的方法是不正确的。它会导致一些碰撞检测问题。 我们不能假设两个具有相同属性的 Car 是同一个对象。 例如:

e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));
e.add(new Car(  0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));

在这种情况下,会发生碰撞,但永远不会检测到,因为通过实现的 equals 方法,这两个对象是相同的。

在诸如游戏引擎或建模系统这样的上下文中,使用 ID 区分世界中的每个对象很有用,因为每个实例都是唯一的。

此外,正如@Jason 所说,要正确捕获碰撞,您必须计算对象的长度或宽度。

【讨论】:

  • 我添加了equals方法
  • 如果你的环境中有两辆汽车具有相同的(位置、车道、速度、颜色),我想你不能认为这辆车是一样的。这可能是一些碰撞检测问题的原因。正如@Jordan 所说,您必须考虑碰撞汽车所占据的整个区域
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多