Sceneform 与相机的碰撞
Sceneform Collisions With Camera
我正在扩展我非常有限的 ARCore 知识。
我的问题与
相似(但不同)
我想看看我的设备 相机节点 intersects/overlaps 是否与我的其他节点一起使用,但到目前为止我一直没有运气
我正在尝试这样的事情(相机是另一个节点):
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 的要求太多了,但是有没有人找到一种方法来检测 "user"(即相机节点)和另一个节点之间的碰撞?或者我应该 "collision detection" 通过室内定位来做这个吗?
提前致谢:)
更新:它真的很笨拙而且性能很重,但你实际上可以比较相机和节点的世界 space 从节点内的 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());
}
我正在扩展我非常有限的 ARCore 知识。
我的问题与
我想看看我的设备 相机节点 intersects/overlaps 是否与我的其他节点一起使用,但到目前为止我一直没有运气
我正在尝试这样的事情(相机是另一个节点):
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 的要求太多了,但是有没有人找到一种方法来检测 "user"(即相机节点)和另一个节点之间的碰撞?或者我应该 "collision detection" 通过室内定位来做这个吗?
提前致谢:)
更新:它真的很笨拙而且性能很重,但你实际上可以比较相机和节点的世界 space 从节点内的 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());
}