Столкновения сцены с камерой

Я растягиваю свои очень ограниченные знания 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 внутри узла, вам, вероятно, придется управлять некоторыми допусками и другими вещами, чтобы сгладить взаимодействия.

3
0
713
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одна из идей сделать то же самое - использовать 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());
} 

Это работает потрясающе и на много дешевле, чем мой overlapTestAll. Кроме того, вы передаете arSceneView в узел при его создании? У меня он отлично работает с Node#getScene(), поэтому мне интересно, выгодно ли это или просто то, что у вас было

Saik Caskey 16.07.2018 13:42

Это как раз то, что мне пригодилось. Лично я постоянно использую переменную-член для представления, которая инициализируется в onCreate () действия и передает параметр методу. Не думаю, что есть разница в производительности.

Clayton Wilkinson 16.07.2018 18:24

Другие вопросы по теме