Я создаю приложение для навигации внутри помещений для упражнений с использованием ARCore и Unity.
Приложение очень похоже на приложение по этому адресу Приложение для навигации с использованием ARCore
Основное отличие состоит в том, что камера следует за указателем сверху, а указатель является стрелкой.Есть также еще один объект (красный куб), который показывает ориентацию телефона.
Я успешно получил поворот позы с телефона и использовал его на красном кубе с:
myRedCube.transform.rotation = Frame.Pose.rotation;
Теперь мне нужно поворачивать стрелку только на плоскости xz в соответствии с движением телефона, чтобы пользователь мог видеть, куда он идет (когда камера смотрит на указатель сверху).Если я установил фиксированный угол, он будет работать отлично, но если я использую угол от ARCore, вращение будет не таким, как я ожидал.
Я попытался извлечь угол y из угла Frame.Pose.Вращение и используется с:
arrow.transform.rotation = Quaternion.Euler(0,myYAngle,0);
, но вращение не правильное.
Другой тест, который я сделал, использует ориентированный вектор, переданный LookRotation:
Vector3 tempVector = Quaternion.AngleAxis(myYAngle, Vector3.up) * Vector3.forward;
arrow.transform.rotation = Quaternion.LookRotation(tempVector);
И в этом случае стрелка не учитывает вращение на плоскости xz.В этих двух примерах myYAngle получено из свойства Frame.Pose.rotation.eulerAngles.
Возможно, мне не хватает чего-то между извлечением кватерниона и применением нового вращения.
Возможнокто-нибудь объяснит мне, как манипулировать кватернионом вращения из Frame.Pose, чтобы получить желаемый эффект?Другие предлагаемые методы приветствуются.Я использую Samsung Galaxy S9 для тестирования приложения.