Контекст: В настоящее время я работаю над приложением дополненной реальности (AR), использующим OpenGL ES 2.0 и некоторыми очками AR, работающими на Android. Моя цель - отобразить виртуальный курсор на кончике реального объекта: отвертки. Оба очка и места отвертки отслеживаются фиксированной внешней камерой. Левое изображение чуть ниже может дать вам представление о настройке.
Что работает: Пока я могу отображать виртуальный трехмерный объект (например, куб) в заданном месте в пространстве. Например, я могу расположить его на (более или менее 1 см от) конца гусеничной отвертки. Когда я просто поворачиваю голову, виртуальный куб создает впечатление «оставаться на том же месте» в реальном мире, что приятно. Такое поведение - то, что я ожидал, и согласуется с его реальной привязкой.
Проблема: Однако, когда я делаю перевод с головой (и, следовательно, перевод камеры opengl), куб, кажется, имеет странное пространственное смещение, как если бы он был смещен от объекта наконечник (случай 2 на рисунке выше). Этот сдвиг может быть довольно значительным (до 5 или 6 см) и не соответствовать реальному миру. Но если я выровняю объект точно по любой из осей камеры, куб кажется хорошо расположенным на кончике объекта, что меня смущает.
Вопрос: Это просто странный визуальный эффект перспективы? Как это может работать с вращением головы, но не с перемещением головы? Я что-то упустил из-за перспективного проецирования в OpenGL ES?
Детали реализации Фиксированная внешняя камера является источником мировых координат. Это очень точно, и дает мне как мировое положение и вращение каждого объекта (включая очки и отвертку). Чтобы быть более точным, он непрерывно отправляет эти данные через Bluetooth в мою программу Android, чтобы убедиться, что то, что видит пользователь, актуально.
В случае 1 это работает как брелок: камера правильно определяет, что отвертка находится в положении (0, 0, 1 метр), и при любом вращении, например, я отображаю куб с центром вокруг этой позиции, и он появляется правильно размещен. Но после перемещения головы (случай 2) отвертка все еще обнаруживается в правильном положении (в конце концов, она не двигалась), но куб смещается так, что мне это не имеет смысла.
Если бы это было небольшое смещение, я бы отнес это к накоплению небольших ошибок, но здесь это кажется большим объяснением. В зависимости от перевода головы, который я делаю, куб получает различное смещение, и в целом создается впечатление, что в мире нет единой фиксированной позиции.
Я использую перспективную проекцию с полем зрения и соотношением сторон очков AR. Положение камеры opengl устанавливается на положение очков AR, а значения Look-at вычисляются в соответствии с направлением, в котором голова находится в данный момент.
Если я изменяю FOV, я теряю ожидаемое поведение в отношении поворота головы и правильного позиционирования. Наконец, я использую очки в качестве стерео дисплея.