ARCore - Как разместить / создать объекты на поверхностях, таких как стены, без каких-либо характерных точек?

Например: меня интересует размещение 2D-изображений на вертикальной плоскости (например, белые или однотонные стены без характерных точек).

Каковы различные обходные пути?

Мне известно, что ARCore поддерживает размещение объектов относительно других объектов. Как я могу расширить это, чтобы выполнить мое требование размещения объектов относительно других объектов, где характерные точки не обнаружены?

Любые идеи или обходной путь высоко ценится.

3 ответа

Вы можете установить Якорь относительно положения камеры - т.е. направить камеру на стену, к которой вы хотите прикрепить.

Чтобы получить правильную глубину, вам нужно будет либо держать камеру на заданном заранее установленном расстоянии, либо добавить возможность перемещать объект вперед и назад. Как упомянул @Ali, у вас будет дрейф, но сейчас это обычное дело.

Код ниже добавит якорь в середине вида камеры:

          //Add an Anchor and a renderable in front of the camera       
          Session session = arFragment.getArSceneView().getSession();
          float[] pos = { 0,0,-1 };
          float[] rotation = {0,0,0,1};
          Anchor anchor =  session.createAnchor(new Pose(pos, rotation));
          anchorNode = new AnchorNode(anchor);
          anchorNode.setRenderable(andyRenderable);
          anchorNode.setParent(arFragment.getArSceneView().getScene());

Смотрите здесь для дальнейшего обсуждения:

Подход работает, и вы можете установить глубину, как вы хотите.

Если вы также хотите переместить рендеринг вперед и назад, то могут быть более эффективные способы сделать это, но наиболее надежный подход, который я нашел, следуя совету по отдельному обсуждению на GitHub, заключался в удалении якоря и создании нового в заданная позиция позади или перед новой позицией - т.е. есть кнопка, которая позволяет пользователю переместить рендеринг назад на 0,1M или вперед на 0,1M.

Согласно ARCore-2020, размещение якоря в том месте, где в данный момент находится камера, может быть выполнено с помощью

session.createAnchor(camera.getPose());

или же

session.createAnchor(camera.getDisplayOrientedPose());  

Потому что размещение якоря в

float[] pos = {0,0,-1};
float[] rotation = {0,0,0,1};
session.createAnchor(new Pose(pos, rotation));

создает привязку в глобальном источнике (где начался ваш сеанс).

Если ваш результат попадания не может дать вам отслеживаемый объект, такой как плоскость или точка, вы не сможете создать якорь на безликой стене.

Если ваше приложение разработано для конкретного варианта использования, вы можете сделать некоторые предположения о среде и сформулировать некоторую векторную связь между привязкой, которая находится в выделенной области, и желаемой привязкой в ​​области без функций.

Например. Если вы хотите разместить анкер на стене, у которой нет никаких особенностей. (При условии, что камера всегда находится в состоянии слежения).

Сначала я бы поставил якорь на любые 3 стены a, b, c, где, как я знаю, определенно есть характерная точка, которую можно отслеживать.

Создайте самолет, используя эти 3 точки, математические расчеты для которых можно найти здесь.

https://sites.math.washington.edu/%7Eking/coursedir/m445w04/notes/vector/equations.html

Теперь, чтобы получить уравнение линии вдоль направления, в котором смотрит камера ->

если поза камеры = X = {x,y,z} и Q = {qx,qy,qz,qw}, Тогда уравнение линии = {x,y,z} + LAMBDA (Q.{0,0,-1})

где LAMBDA - случайная величина вдоль линии. и Q.{0,0,-1} означает вращение {0,0,-1} с кватернионом Q

Итак, теперь, если вы хотите разместить анкер на стене. Вы найдете точку пересечения между линией камеры и плоскостью стены.

Существует как минимум 5 разных способов размещения 3D-объектов на вашей сцене. Но любая трехмерная геометрия не может существовать без Anchor - локальная система координат объекта находится в его точке поворота.

Для размещения объекта могут быть использованы следующие подходы:

  • Если обнаружение самолета включено, ARCore может автоматически добавить Anchor на текущую сессию.
  • При нажатии на экран позволяет проецировать точку на воображаемую плоскость, размещая привязку.
  • Преобразование камеры ARCore (ее расположение и ориентация) можно использовать для размещения якоря.
  • Особые точки (точки на полях с высокой контрастностью) могут дать вам место для привязки.
  • Кластеры характерных точек позволяют сохранить карту окружающей среды реального мира для последующего ее получения.

Как вы видете Feature points опция не всегда используется. Будьте изобретательны и используйте все эффективные методы для размещения 3D в вашей сцене.

Вы можете прикрепить объект к любому Trackable, а затем попросить пользователя двигаться до стены. Вы вычисляете расстояние, и затем вы каким-то образом получаете восприятие глубины этой стены от этой отслеживаемой. Конечно, вы увидите некоторые дрейфы, но это происходит с ARCore все время.

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