与摄像机相交的Sceneform碰撞

3

我正在努力扩展我的ARCore知识。

我的问题类似于(但不同于)这个问题


我想确定我的设备相机节点是否与其他节点相交/重叠,但到目前为止我没有什么好运气。

我尝试像这样做(相机是另一个节点):

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

首先,这是否有意义?
我可以使用以下方法检测场景中所有节点的碰撞:
for (Node node : nodes) {
        ...
        ArrayList<Node> results = scene.overlapTestAll(node);
        ...
} 

假设相机节点没有可渲染项(即没有默认的碰撞形状),我尝试设置自己的碰撞形状,但这实际上捕捉了我想要执行的所有点击事件,所以我觉得我可能做错了。我考虑的是将一个已停用的节点固定在相机前面。也许我对ARCore要求过高,但有人发现了检测“用户”(即相机节点)和另一个节点之间碰撞的方法吗?或者我应该通过室内定位来进行“碰撞检测”?提前感谢:)更新:这真的很麻烦且性能负担很重,但你实际上可以在节点内部的onUpdate中比较相机和节点的世界空间位置,你可能需要处理一些容差和其他事情来平滑交互。
1个回答

4

实现相同功能的一个想法是使用光线投射来检测物体是否接近并执行操作。您可以在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());
} 

这个功能非常出色,而且比我的overlapTestAll便宜得多。另外,在创建节点时,您是否将“arSceneView”传递到节点中?对我来说,使用“Node#getScene()”效果很好,所以我想知道这是否有优势或者只是您的做法。 - Saik Caskey
这只是我手头现成的。就个人而言,我在使用成员变量来初始化活动的onCreate()视图和传递参数给方法之间反复考虑。我认为这两种方法在性能上没有任何区别。 - Clayton Wilkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接