Стандартный элемент Subspace остается в фиксированном положении, определяемом системой. Однако иногда может потребоваться, чтобы пространственный интерфейс приложения динамически перемещался вместе с пользователем или оставался привязанным к определенному месту в среде или в реальном мире. Вы можете передать FollowTarget в параметр follow метода Subspace, чтобы создать, например, HUD, зафиксированный на голове, или информационные панели, прикрепленные к объектам реального мира.
Добавьте подпространство, которое следует за представлением пользователя
Чтобы добавить подпространство, расположенное относительно зоны обзора пользователя, используйте FollowTarget.view. В зависимости от выбранного режима слежения вы можете непрерывно отслеживать движения головы пользователя или размещать контент статически в зависимости от того, куда он смотрит. Это могут быть, например, HUD, постоянные уведомления или элементы управления быстрыми действиями.
Как объявить и запросить разрешения
Прежде чем запрашивать разрешения, объявите их в манифесте приложения с помощью элемента <uses-permission>.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for head tracking. -->
<uses-permission android:name="android.permission.HEAD_TRACKING"/>
<application ...>
...
</application>
</manifest>
Теперь запросите разрешения. Чтобы узнать больше, ознакомьтесь с принципами и рабочими процессами, связанными с разрешениями. Это поможет вам сделать приложение удобнее для пользователей. Например, вы можете проверить, предоставил ли пользователь динамические разрешения, необходимые для работы приложения, и нужно ли показывать пользователю обоснование перед запросом разрешения.
Настройте сеанс
Теперь настройте сеанс приложения, который создается при использовании Jetpack Compose for XR, задав DeviceTrackingMode.SPATIAL:
val session = checkNotNull(LocalSession.current)
session.configure(
config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
.build()
)
Создайте подпространство
Наконец, вы создадите подпространство, которое нацелено на представление пользователя, вместе с режимом следования:
// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
follow = FollowTarget.view(
// Customizing the soft follow to move slightly faster and tracking all dimensions
mode = FollowMode.soft(
)
),
modifier = modifier,
) {
SpatialPanel {
// SpatialPanel Content
}
}
Режимы следования для подпространств, которые нацелены на представление пользователя
Если вы используете FollowTarget.view в качестве цели, то можете настроить поведение контента, указав FollowMode:
FollowMode.soft– контент постепенно догоняет движения цели, создавая плавный плавающий эффект.FollowMode.snapКонтент размещается перед пользователем один раз в зависимости от его начального положения и затем остается неподвижным.FollowMode.tight– контент сразу же отслеживает взгляд пользователя с минимальной задержкой, оставаясь тесно связанным с его движениями.
Для всех режимов слежения можно выбрать, какие параметры движения будут отслеживаться:
- Ось X
- Ось Y
- Анонс
- Рулон
- Рыскание
RotationOnly– позволяет указать одно значение для отслеживания параметров, связанных с вращением (тангаж, рыскание и крен).
Вы можете выбрать любое сочетание этих параметров или использовать значение по умолчанию TrackedDimensions.All, которое отслеживает их все.
Как добавить подпространство, которое следует за объектом окружающей среды
Чтобы добавить подпространство, которое строго привязывает пространственный контент к физическому объекту в среде пользователя, используйте FollowTarget.anchor(). Используйте этот тип цели, чтобы следовать за обнаруженной плоскостью, якорем или геопространственным местоположением.
Для отслеживания объектов реального мира требуются дополнительные разрешения и настройки сеанса в зависимости от того, за чем вы следите.
Подробные инструкции по работе с возможностями восприятия для функций ARCore, а также по настройке необходимых разрешений и сеанса для использования FollowTarget.anchor() можно найти в документации Jetpack XR SDK по плоскостям, якорям и геопространственным позам.
В следующем примере создается подпространство, которое следует за реальным якорем:
// A subspace locked to a real-world anchor
Subspace(
follow = FollowTarget.anchor(anchor = myAnchor)
) {
// Rotate the panel to ensure it faces the user while remaining anchored
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
// SpatialPanel Content
}
}
Избегайте пространственного перекрытия
Каждое созданное вами подпространство Subspace управляет собственной независимой 3D-сценой и не знает о существовании других подпространств, поэтому оно не может автоматически избегать столкновений.
Чтобы HUD, зафиксированный на голове, не пересекался с закрепленными панелями объектов инфраструктуры (Z-конфликт), управляйте объемами макета с помощью следующих методов:
- Используйте смещения. С помощью
SubspaceModifier.offsetможно приближать или отдалять периферийные элементы интерфейса (например, HUD) по оси Z или сдвигать их к краям поля зрения пользователя. - Ограничение размеров. Применяйте модификаторы, например
requiredSizeIn, чтобы ограничить граничные рамки пробелов.
Дополнительную информацию о координатных пространствах, ограничениях макета и всех доступных конфигурациях отслеживания можно найти в справочной документации по Subspace.