【问题标题】:Sceneform Collisions With CameraSceneform 与相机的碰撞
【发布时间】:2018-07-13 12:18:59
【问题描述】:

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

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


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

我正在尝试这样的事情(相机是另一个节点):

  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 的要求太多了,但有没有人找到一种方法来检测“用户”(即相机节点)和另一个节点之间的冲突?还是应该通过室内定位来进行这种“碰撞检测”?

提前致谢:)

更新:它真的很hacky并且性能很重,但是您实际上可以从节点内的onUpdate 内比较相机和节点的世界空间位置,您可能需要管理一些容差和其他事情来平滑交互.

【问题讨论】:

    标签: android collision-detection arcore


    【解决方案1】:

    做同样事情的一个想法是使用光线投射来击中物体,如果它们靠近,就做一些事情。你可以在 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() 对我很有用,所以我想知道这是有利的还是你所拥有的
    • 这正是我得心应手的。就个人而言,我来回使用在活动的 onCreate() 中初始化的视图的成员变量并将参数传递给方法。我认为没有任何性能差异。
    猜你喜欢
    • 2019-04-30
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多