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

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

Какие существуют обходные пути?

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

Приветствуются любые идеи или обходные пути.


person Murlidhar Fichadia    schedule 06.11.2018    source источник


Ответы (4)


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

Чтобы получить правильную глубину, вам нужно будет либо удерживать камеру на заданном заранее заданном расстоянии, либо добавить возможность перемещать объект вперед и назад. Как упоминал @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,1 м назад или вперед на 0,1 м.

person Mick    schedule 06.11.2018
comment
Спасибо за этот ответ. Я так люблю тебя за это - person Gulnaz Ghanchi; 18.12.2020

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

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

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

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

person Andy Fedoroff    schedule 07.11.2018

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

person Ali Kanat    schedule 06.11.2018

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

session.createAnchor(camera.getPose());

or

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

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

person Varun Bachalli    schedule 07.09.2020