Как поднять предмет в воздух?

Кажется, HitResult дает нам только пересечение с поверхностью (плоскостью) или облаком точек. Как я могу получить точку в воздухе одним кликом и, таким образом, поместить объект в воздух?


person redpearl    schedule 01.09.2017    source источник


Ответы (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.

person Ian M    schedule 03.09.2017
comment
Да, я использую Java, и то, что я имею в виду под «в воздухе», на самом деле является вашей второй интерпретацией с screenPointToWorldRay. Я думаю, что ARCore должна включить эту функцию в свой API, потому что это будет очень распространенное требование, которое может понадобиться пользователям. - person redpearl; 05.09.2017
comment
Просто чтобы было ясно, какую функцию вы имеете в виду, которая должна быть в API? Приведенный выше фрагмент достаточно прост, и я думаю, что он просто загромождает все. Метод, указанный в другом ответе, однако я согласен, вероятно, должен быть включен (но никаких обещаний). - person Ian M; 05.09.2017
comment
Да, я имею в виду screenPointToWorldRay в другом ответе, который должен быть включен в API. - person redpearl; 07.09.2017

Причина, по которой вы так часто видите, что результат попадания интерпретируется пользователем как желаемая позиция, заключается в том, что на самом деле не существует решения в закрытой форме для такого взаимодействия с пользователем. Какое из бесконечных возможных положений вдоль луча, начинающегося от камеры, направленной в сторону сцены, было желательно Пользователю? 2D-координаты по щелчку по-прежнему оставляют третье измерение неопределенным.

Как вы сказали "середина воздуха", почему бы не взять центр между положением камеры и результатом попадания? Вы можете извлечь текущую позицию, используя pose.getTranslation https://developers.google.com/ar/reference/java/com/google/ar/core/Pose.html#getTranslation(float[],%20int)

person PhilLab    schedule 02.09.2017