我正在扩展我非常有限的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);
...
}
内比较摄像机和节点的世界空间位置,您可能必须管理一些公差和其他事项才能平滑互动。
答案 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());
}