Кажется, HitResult дает нам только пересечение с поверхностью (плоскостью) или облаком точек. Как я могу получить точку в воздухе одним кликом и, таким образом, поместить объект в воздух?
Как поднять предмет в воздух?
Ответы (2)
Это действительно зависит от того, что вы подразумеваете под «в воздухе». Я вижу две возможности:
"Над обнаруженной поверхностью" Выполните обычный тест удара по плоскости и сместите возвращаемую позу на некоторое расстояние по Y, чтобы получить местоположение зависания. Например:
Pose.makeTranslation(0, 0.5f, 0).compose(hitResult.getHitPose())
возвращает позу, которая находится на 50 см выше места попадания. Создайте якорь из этого, и все готово. Вы также можете просто создать привязку в месте попадания и скомпоновать с перемещением по оси y каждый кадр, чтобы обеспечить анимацию высоты наведения.
"Плавание перед текущим положением устройства" Для этого вы, вероятно, захотите составить перевод справа от позы камеры:
frame.getPose().compose(Pose.makeTranslation(0, 0, -1.0f)).extractTranslation()
дает вам позу только для перевода, которая находится на расстоянии 1 м от центра дисплея. Если вы хотите быть перед определенным местом на экране, я добавил некоторый код в этот ответ, чтобы экран указывал на мир преобразование лучей.
Извините, если вы работаете в Unity/Unreal, в вашем вопросе не указано, поэтому я предположил Java.
Причина, по которой вы так часто видите, что результат попадания интерпретируется пользователем как желаемая позиция, заключается в том, что на самом деле не существует решения в закрытой форме для такого взаимодействия с пользователем. Какое из бесконечных возможных положений вдоль луча, начинающегося от камеры, направленной в сторону сцены, было желательно Пользователю? 2D-координаты по щелчку по-прежнему оставляют третье измерение неопределенным.
Как вы сказали "середина воздуха", почему бы не взять центр между положением камеры и результатом попадания? Вы можете извлечь текущую позицию, используя pose.getTranslation
https://developers.google.com/ar/reference/java/com/google/ar/core/Pose.html#getTranslation(float[],%20int)