Я растягиваю свои очень ограниченные знания 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 внутри узла, вам, вероятно, придется управлять некоторыми допусками и другими вещами, чтобы сгладить взаимодействия.
Одна из идей сделать то же самое - использовать raycast, чтобы поразить объекты, и, если они находятся близко, что-то сделать. Вы можете использовать что-то подобное в 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());
}
Это как раз то, что мне пригодилось. Лично я постоянно использую переменную-член для представления, которая инициализируется в onCreate () действия и передает параметр методу. Не думаю, что есть разница в производительности.
Это работает потрясающе и на много дешевле, чем мой overlapTestAll. Кроме того, вы передаете
arSceneViewв узел при его создании? У меня он отлично работает сNode#getScene(), поэтому мне интересно, выгодно ли это или просто то, что у вас было