android - Sceneform 与相机的碰撞

标签 android collision-detection arcore

我正在扩展我非常有限的 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);
        ...
} 

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

我正在考虑诸如修复摄像头前停用的节点之类的事情。

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

提前致谢:)

更新:它真的很笨拙而且性能很重,但你实际上可以在节点内的 onUpdate 中比较相机和节点的世界空间位置,你可能需要管理一些公差和其他平滑交互的事情。

最佳答案

做同样事情的一个想法是使用光线转换来击中物体,如果它们很近就做点什么。你可以在 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());
} 

关于android - Sceneform 与相机的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324954/

相关文章:

android - 在 Android 的 ARCore 上播放的视频变暗

java - Sceneform:将 WebRTC 媒体流渲染到 ExternalTexture

Java游戏-如何阻止玩家越过障碍物

android - 如何使用ndk-build构建不同文件夹下的源文件?

java - Android自动SQL插入

php - Android 位图图像未使用 PHP API 保存到 MySQL

rotation - 如何旋转圆来响应碰撞?

c++ - C++中的平铺运动

android - ARCore 如何发布通过 acquireCameraImage 获取的图像

Android:从应用程序类启动新 Activity