Привязка контента к реальным местам

Поддерживаемые XR-устройства
Это руководство поможет вам создавать продукты для таких XR-устройств.
Проводные XR-очки

Геопространственные якоря – это тип якорей, которые позволяют размещать 3D-контент с географическими координатами с помощью Geospatial API.

Для определения положения геопространственных якорей используются широта и долгота. Широта и долгота определяются спецификацией WGS84. Это те же координаты, которые показываются в обычной системе GPS.

Как определить широту и долготу места

Если вы хотите указать конкретное место, определите его широту и долготу с помощью Google Карт.

  1. Откройте Google Карты на компьютере.
  2. Выберите Слои > Ещё.

    Кнопка "Слои" в Google Картах

    Кнопка "Ещё" на Google Картах

  3. Измените тип карты на Спутник и снимите флажок Просмотр глобуса в левом нижнем углу экрана.

    Типы карт в Google Картах

    Это позволяет получить двухмерное изображение и избежать возможных ошибок, связанных с трехмерным изображением под углом.

  4. Нажмите правой кнопкой мыши на местоположение на карте и выберите широту и долготу, чтобы скопировать их в буфер обмена.

Преобразование позиции в области пользователя в геопространственную привязку

Если вы можете посетить объект инфраструктуры, то можете определить его широту, долготу и высоту, преобразовав локальное положение устройства в геопространственное.

Как разместить контент в геопространственном якоре

Для геопространственных привязок требуется значение высоты относительно эллипсоида WGS84, рельефа или крыши.

  • Для значений высоты относительно эллипсоида WGS84 используйте Geospatial.createAnchor:

    val createAnchorResult = geospatial.createAnchor(
        latitude,
        longitude,
        altitude,
        Quaternion.Identity,
    )

  • Чтобы задать высоту относительно рельефа или крыши, используйте Geospatial.createAnchorOnSurface, а также GeospatialSurface.TERRAIN и GeospatialSurface.ROOFTOP соответственно, чтобы указать, как должна интерпретироваться итоговая высота:

    val createAnchorResult = geospatial.createAnchorOnSurface(
        latitude,
        longitude,
        altitude,
        Quaternion.Identity,
        GeospatialSurface.TERRAIN,
    )

    Если вы используете GeospatialSurface.ROOFTOP, то по умолчанию высота будет соответствовать высоте местности, если объект не размещен на здании.

Затем проверьте результат вызова:

when (createAnchorResult) {
    is AnchorCreateSuccess -> {
        // Use anchorCreateResult.anchor to render content at the result.
    }

    else -> {
        // Anchor create failed.
        // See AnchorCreateResult for possible failure reasons.
    }
}

Наконец, используйте якорь, чтобы разместить 3D-контент:

Compose XR

Subspace(FollowTarget.anchor(anchorCreateResult.anchor)) {
    SpatialPanel {
        GeospatialContent()
    }
}

SceneCore

val anchorSpace = AnchorSpace.create(session, anchorCreateResult.anchor)
val contentEntity = createGeospatialContentEntity(context, session)
anchorSpace.addChild(contentEntity)