3

我正在尝试播放声音,然后在使用 Sceneform 碰撞时破坏两种不同类型的两个对象。我看到 Sceneform 有一个碰撞 API(https://developers.google.com/ar/reference/java/com/google/ar/sceneform/collision/package-summary),但我不知道该怎么做在碰撞中。我尝试过扩展碰撞形状,覆盖 shapeIntersection 方法,并为每个节点设置碰撞形状属性,但这似乎没有任何作用。似乎没有任何示例代码,但文档提到了碰撞侦听器。到目前为止,我一直在进行蛮力检查,但我希望有一种更有效的方法。

编辑:我一直在尝试做这样的事情:

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

2

您尝试覆盖的相交方法进行数学计算以计算两个碰撞形状是否相交,我建议不要覆盖它们。

目前,没有可以覆盖的侦听器或方法来检测节点何时重叠。但是,您可以调用一些函数来测试重叠节点。

您可以使用Scene.overlapTestScene.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.
    }
  }
}
于 2018-05-29T17:17:35.107 回答