相机的场景碰撞

时间:2018-07-13 12:19:00

标签: android collision-detection arcore

我正在扩展我非常有限的ARCore知识。

我的问题与this question类似(但不同)


我想弄清楚我的设备相机节点是否与其他节点相交/重叠,但是到目前为止我还没有碰到任何运气

我正在尝试类似的操作(相机是另一个节点):

error_reporting(E_ALL ^ E_NOTICE);

首先,这有意义吗?

我可以使用以下命令检测场景中的所有节点冲突:

  scene.setOnUpdateListener(frameTime -> {
        Node x = scene.overlapTest(scene.getCamera());
        if (x != null) {
            Log.i(TAG, "setUpArComponents: CAMERA HIT DETECTED at: " + x.getName());
            logNodeStatus(x);
        }
    });

假定“相机”节点没有可渲染的对象(因此没有默认的碰撞形状),我尝试设置自己的碰撞形状,但这实际上捕获了我试图执行的所有轻敲事件,因此我想出了我一定做错了。

我正在考虑诸如在相机前面固定一个停用的节点之类的事情。

我可能要求太多的ARCore,但是有人找到了一种方法来检测“用户”(即摄像机节点)与另一个节点之间的冲突吗?还是应该通过室内定位来进行“碰撞检测”?

预先感谢:)

更新:这确实很hacky,性能很沉重,但是您实际上可以从节点内部for (Node node : nodes) { ... ArrayList<Node> results = scene.overlapTestAll(node); ... } 内比较摄像机和节点的世界空间位置,您可能必须管理一些公差和其他事项才能平滑互动。

1 个答案:

答案 0 :(得分:3)

执行相同操作的一个想法是使用射线投射击中对象,如果它们靠近则执行某些操作。您可以在onUpdateListener中使用类似的方法:

Camera camera = arSceneView.getScene().getCamera();
Ray ray = new Ray(camera.getWorldPosition(), camera.getForward());
HitTestResult result = arSceneView.getScene().hitTest(ray);
if (result.getNode() != null && result.getDistance() <= SOME_THRESHOLD) {
  // Hit something
  doSomething (result.getNode());
}