3

Sceneform を使用して、サウンドを再生してから、2 つの異なるタイプの 2 つのオブジェクトが衝突したときにそれらを破壊しようとしています。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;
    }
}

}

PassiveNode が平面上にあり、ActiveNode がカメラから平面上のポイントに「スロー」される場所。

4

1 に答える 1