Руководство разработчика Instant Placement для Unity

Узнайте, как использовать Instant Placement API в своих приложениях.

Предпосылки

Прежде чем продолжить, убедитесь, что вы понимаете основные концепции AR и как настроить сеанс ARCore .

В этом руководстве предполагается, что вы уже установили и настроили Unity. Если нет, ознакомьтесь с инструкциями по установке и настройке Unity Quickstart для Android .

Настройте новый сеанс с мгновенным размещением

Настройте свое приложение, создав новую конфигурацию сеанса и настроив режим мгновенного размещения.

  1. В Unity создайте новую конфигурацию сеанса для приложения ARCore ( Assets > Create > GoogleARCore > SessionConfig ).
  2. В конфигурации сеанса выберите Instant Placement Mode .

    Значение по умолчанию для Instant Placement ModeDisabled . Instant Placement в настоящее время поддерживает только режим Local Y Up .

  3. Выберите устройство ARCore в иерархии проекта.

  4. Дважды щелкните поле Session Config и выберите SessionConfig созданный ранее.

Разместите объект

В новом сеансе ARCore выполните проверку попадания с помощью Frame.RaycastInstantPlacement . Затем создайте новый Anchor , используя позу InstantPlacementPoint из Trackable результата попадания.

var hitList = new List<TrackableHit>();
TrackableHit hitRaycast;
bool hitResult = Frame.RaycastInstantPlacement(
  position.x, position.y, approximateDistance, out hitRaycast);

if (hitResult) {
  // Place a pin object at the hit.
  var pinObject = Instantiate(PinPrefab, hitRaycast.Pose.position, hitRaycast.Pose.rotation);

  // Cast the trackable to an InstantPlacementPoint if you want to
  // retrieve the real time pose and tracking method. Otherwise, you
  // can use it like any other Trackable.
  InstantPlacementPoint instantPlacementPoint = hitRaycast.Trackable as InstantPlacementPoint;

  // Create an Anchor using the InstantPlacementPoint.
  Anchor anchor = instantPlacementPoint.CreateAnchor(hitRaycast.Pose);

  // Automatically sync the virtual object’s pose with the Anchor’s
  // pose in each frame.
  pinObject.transform.parent = anchor.transform;
}

Мгновенное размещение поддерживает отслеживание пространства экрана , автоматически переключаясь на полное отслеживание, как только точка мгновенного размещения привязана к реальному миру. Получить текущую позу с помощью InstantPlacementPoint.Pose . Получите текущий метод отслеживания с помощью InstantPlacementPoint.TrackingMethod .

Хотя ARCore может выполнять тесты мгновенного размещения на поверхности с любой ориентацией, результаты попадания всегда будут возвращать позу с +Y вверх, против направления силы тяжести. На горизонтальных поверхностях тесты на попадание возвращают точные координаты гораздо быстрее.

Отслеживание метода отслеживания точки мгновенного размещения

Если ARCore имеет точную 3D-позу, InstantPlacementPointTrackingMethod будет FullTracking . В противном случае он начнется с ScreenspaceWithApproximateDistance и перейдет к FullTracking , как только ARCore получит точную 3D-позу. Метод отслеживания не вернется к ScreenspaceWithApproximateDistance после того, как его метод отслеживания будет FullTracking .

Плавный переход метода отслеживания

Поза автоматически корректируется, когда метод отслеживания InstantPlacementPoint изменяется с приблизительного расстояния на полное отслеживание. Когда это происходит, объект прыгает.

Когда метод отслеживания меняется с ScreenspaceWithApproximateDistance в одном кадре на FullTracking в следующем кадре, поза будет переходить из исходного местоположения на основе предоставленного приблизительного расстояния в новое местоположение на точном расстоянии.

Это мгновенное изменение позы изменит видимый масштаб любых объектов, привязанных к InstantPlacementPoint . То есть объект внезапно будет казаться больше или меньше, чем он был в предыдущем кадре.

В следующем коде показано, как избежать визуального скачка путем интерполяции позы с течением времени, от последнего кадра, сообщающего ScreenspaceWithApproximateDistance , до новой позы из кадра, сообщающего FullTracking .

Чтобы избежать внезапного видимого изменения позы, интерполируйте текущую позу виртуального объекта и InstantPlacementPoint.Pose .

// Interpolate the pose for a specific duration. Start from the first frame that
// the tracking method changes. End after the transitionTime has
// passed transitionDuration.
if (previousTrackingMethod ==
  InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance &&
  instantPlacementPoint.TrackingMethod ==
  InstantPlacementPointTrackingMethod.FullTracking) {
    startTransition = true;
    previousTrackingMethod = InstantPlacementPointTrackingMethod.FullTracking;
}

if (startTransition) {
  transitionTime += Time.deltaTime;
  float ratio = Mathf.Min(transitionTime, transitionDuration) / transitionDuration;

  // Use a custom function to interpolate two poses based on the ratio. Here,
  // LerpPose(Pose, Pose, float) is a generic interpolation function containing
  // a current value, a target value, and an interpolation ratio.
  var newPose = LerpPose(
    new Pose(pinObject.transform.position, pinObject.transform.rotation),
    instantPlacementPoint.Pose, ratio);
    pinObject.transform.position = newPose.position;
    pinObject.transform.rotation = newPose.rotation;

  if (transitionTime >= transitionDuration) {
    startTransition = false;

    // Set the parent transform to be the Anchor created on the
    // InstantPlacementPoint, so that it will automatically update the pose
    // in future frames.
    Anchor anchor = instantPlacementPoint.CreateAnchor(Pose.identity);
    pinObject.transform.parent = anchor.transform;
  }
}