Выполните raycast или проверку попадания, чтобы определить правильное размещение 3D-объекта в вашей сцене. Правильное размещение гарантирует, что контент AR будет отображаться в соответствующем (кажущемся) размере.
Типы результатов обращений
Проверка попадания может дать четыре различных типа результатов попадания, как показано в следующей таблице.
| Тип результата обращения | Описание | Ориентация | Вариант использования | Вызовы методов |
|---|---|---|---|---|
| Глубина | Использует информацию о глубине всей сцены для определения правильной глубины и ориентации точки. | Перпендикулярно 3D-поверхности | Разместите виртуальный объект на произвольной поверхности (не только на полу и стенах) | Чтобы это работало, необходимо включить Depth .ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth) |
| Самолет | Касается горизонтальных и/или вертикальных поверхностей, чтобы определить правильную глубину и ориентацию точки. | Перпендикулярно 3D-поверхности | Поместите объект на плоскость (пол или стену), используя полную геометрию плоскости. Срочно нужен правильный масштаб. Резервный вариант для проверки глубины | ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon) |
| Характерная точка | Полагается на визуальные особенности вокруг точки касания пользователя для определения правильного положения и ориентации точки. | Перпендикулярно 3D-поверхности | Разместите объект на произвольной поверхности (не только на полу и стенах) | ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint) |
| Постоянный Raycast (мгновенное размещение) | Использует пространство экрана для размещения контента. Первоначально используется предполагаемая глубина, предоставленная приложением. Работает мгновенно, но поза и фактическая глубина изменятся, как только ARCore сможет определить фактическую геометрию сцены. | +Y направлен вверх, против силы тяжести | Разместите объект на плоскости (поле или стене), используя полную геометрию плоскости, где быстрое размещение имеет решающее значение, и опыт может допускать неизвестную начальную глубину и масштаб. | ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance) |
Выполните стандартный рейкаст
Вызовите ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) , чтобы выполнить рассылку лучей (проверку попадания). ARRaycastManager поддерживает все TrackableType .
var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
return;
// Raycast against planes and feature points.
const TrackableType trackableTypes =
TrackableType.FeaturePoint |
TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
// Raycast hits are sorted by distance, so the first one will be the closest hit.
var hit = hits[0];
// Do something with hit.
}
Провести raycast, используя произвольный луч и направление
Рейкасты обычно рассматриваются как лучи от устройства или камеры устройства, но вы можете использовать Raycast(Ray, List<ARRaycastHit>, TrackableType) для проведения рейкаста с использованием произвольного луча в координатах мирового пространства вместо точки экранного пространства.
Создайте привязку, используя ARRaycastHit
Получив попадание raycast, используйте GameObject.AddComponent<ARAnchor> , чтобы создать Anchor и добавить его в качестве компонента в свой GameObject , используя попадание raycast в качестве входных данных. Компонент ARAnchor будет постоянно обновлять Transform игрового объекта, так что игровой объект остается прикрепленным к базовому Trackable для результата попадания.
Постоянные лучи (мгновенное размещение)
Постоянные raycasts используют местоположение экрана и предполагаемое расстояние до поверхности в качестве входных данных для создания нового ARRaycast для размещения AR-контента в вашей сцене. В ARCore это называется Instant Placement .
Вызовите ARRaycastManager.AddRaycast() , чтобы создать ARRaycast , который продолжает автоматически обновляться до тех пор, пока вы не вызовете ARRaycastManager.RemoveRaycast() или не отключите ARRaycastManager .
Первоначально расстояние ARRaycast будет расстоянием, указанным в вызове AddRaycast() . Как только ARCore нанес на карту локальную геометрию и нашел пересекающую плоскость, расстояние обновляется до фактического расстояния. Изменение расстояния может повлиять на видимый «размер» или воспринимаемый масштаб объекта.