Как плавно переместить узел в ARkit Scene View на основе движения устройства? - PullRequest
3 голосов
/ 15 марта 2020

Свифт-новичок борется с перемещением узла сцены в ARkit в ответ на движение устройства.

Чего я хочу добиться: сначала определить плоскость пола, а затем поместить сферу на пол. Начиная с этой точки, в зависимости от движения устройства, я хочу перемещать сферу вдоль ее осей x и z, чтобы перемещать ее по полу комнаты. (Однажды созданная сфера должна быть в центре экрана устройства и привязана к этому виду)

До сих пор я не мог обнаружить пол и разместить узел без проблем. Я могу использовать движение устройства для получения ориентации устройства (тангажа, крена и рыскания), но как перевести эти значения в значимые позиции x, y, z, с помощью которых я могу обновить свой узел?

Существуют ли какие-либо формулы или методы, которые используются для расчета такой информации или это неправильный подход? Буду признателен за ссылку на некоторую информацию или объяснение того, как go об этом. Также я не уверен, как обеспечить, чтобы узел всегда был в центре экрана устройства.

1 Ответ

0 голосов
/ 14 апреля 2020

Итак, насколько я понял, вы хотите иметь следующий рабочий процесс:

Шаг 1. Вы создаете сферу на плоскости (что уже сделано)

Шаг 2. Перемещение сфера относительно горизонтальной плоскости камеры (то есть вдоль ее осей x и z, чтобы переместить ее вокруг пола комнаты в зависимости от движения устройства)

Предполагая, что Шаг 1 выполнен, что вы может сделать:

  1. Получить положение камеры и сферы

    Сначала его следует вызвать в функции, которая вызывается после создания сферы (будь то tapGestureRecognizer ( ), touchesBegan (), et c.).

    Вы можете сделать это, вызвав position свойство SCNNode для сферы и для положения камеры и / или ориентации, вызвав вызов sceneView.session.currentFrame .camera.transform, который содержит все необходимые параметры о текущем положении камеры

  2. Перемещение сферы при перемещении камеры

    Имея sph Перед тем, как расположить сцену и матрицу преобразования камеры, вы можете найти соотношение расстояний между ними. Здесь вы можете найти хорошее объяснение того, как именно вы можете это сделать

    После того, как вы получите эти вещи, вы должны реализовать правильный лог c в рендерере (_: didUpdate: для:) для получения непрерывной блокировки мяча относительно положения камеры

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

Надеюсь, что это поможет!

...