Sceneform Collisions - PullRequest
       7

Sceneform Collisions

0 голосов
/ 28 мая 2018

Я пытаюсь воспроизвести звук, а затем уничтожить два объекта двух разных типов, когда они сталкиваются, используя Sceneform.Я вижу, что у Sceneform есть api коллизии (https://developers.google.com/ar/reference/java/com/google/ar/sceneform/collision/package-summary),, но я не могу понять, как действовать при коллизии. Я попытался расширить форму коллизии, переопределить методы shapeIntersection и установить свойство Collision Shape длякаждый узел, но это, похоже, ничего не делает. Кажется, что нет никакого примера кода, но в документации упоминаются слушатели столкновений. До сих пор я только что проверил способ грубой силы, но я надеялсябыл более эффективный способ.

РЕДАКТИРОВАТЬ: я пытался сделать что-то вроде этого:

public class PassiveNode extends Node{

public PassiveNode() {
    PassiveCollider passiveCollider = new PassiveCollider(this);
    passiveCollider.setSize(new Vector3(1, 1, 1));
    this.setCollisionShape(passiveCollider);
}

public class PassiveCollider extends Box {
    public Node node; // Remeber Node this is attached to
    public PassiveCollider(Node node) {
        this.node = node;
    }
}

}

public class ActiveNode extends Node {

private Node node;
private Node target;
private static final float metersPerSecond = 1F;

public ActiveNode(Node target) {
    node = this;
    this.target = target;
    BallCollision ball = new BallCollision();
    ball.setSize(new Vector3(1, 1, 1));
    this.setCollisionShape(ball);
}

@Override
public void onUpdate(FrameTime frameTime) {
    super.onUpdate(frameTime);
    Vector3 currPos = this.getWorldPosition();
    Vector3 targetPos = target.getWorldPosition();
    Vector3 direction = Vector3.subtract(targetPos, currPos).normalized();
    this.setWorldPosition(Vector3.add(currPos, direction.scaled(metersPerSecond * frameTime.getDeltaSeconds())));
}

private class BallCollision extends Box {

    @Override
    protected boolean boxIntersection(Box box) {
        if (box instanceof PassiveNode.PassiveCollider) {
            //Play Sound
            node.setEnabled(false);
            ((PassiveNode.PassiveCollider) box).node.setEnabled(false);
            return true;
        }
        return false;
    }
}

}

Когда пассивный узел лежит на плоскости, а активный узел «выбрасывается» из камеры в точку на плоскости.

1 Ответ

0 голосов
/ 29 мая 2018

Методы пересечения, которые вы пытаетесь переопределить, выполняют математические расчеты, если две фигуры столкновения пересекаются, я рекомендую не переопределять их.

В настоящее время нет слушателя или метода, который можно переопределить, чтобы определить, когда узлы пересекаются.перекрытия.Однако есть функции, которые можно вызвать для проверки перекрывающихся узлов.

Вы можете использовать Scene.overlapTest или Scene.overlapTestAll , который использует CollisionShape из узла.

По умолчанию, он будет автоматически использовать форму столкновения, основанную на размерах Renderable, присоединенного к Узлу.Вы можете использовать Node.setCollisionShape , чтобы переопределить форму коллизии для узла или установить коллизии на узле, который не имеет Renderable.

Вы можете добиться эффекта, который ищетеделая что-то вроде этого:

private void onUpdate(FrameTime frameTime) {
  ArrayList<Node> overlappedNodes = arSceneView.getScene().overlapTestAll(ballNode);
  for (Node node : overlappedNodes) {
    if (node instanceof PassiveNode) {
      // May want to use a flag to check that the node wasn't overlapping the previous frame.
      // Play sound if overlapping started.
    }
  }
}
...