타겟을 따르는 하위 공간 추가

적용 가능한 XR 기기
이 가이드는 이러한 유형의 XR 기기를 위한 환경을 빌드하는 데 도움이 됩니다.
XR 헤드셋
유선 XR 글라스

표준 Subspace는 시스템에 의해 결정된 고정된 위치에 유지되지만, 앱의 공간 UI가 사용자와 함께 동적으로 이동하거나 환경 또는 실제 세계의 특정 위치에 연결된 상태로 유지되도록 할 수 있습니다. FollowTarget를 Subspace의 follow 매개변수에 전달하여 헤드 잠금 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>

이제 권한을 요청합니다. 자세한 내용은 권한 원칙 및 워크플로를 참고하여 사용자에게 최상의 환경을 제공하는지 확인하세요. 예를 들어 앱에 필요한 런타임 권한을 사용자가 이미 부여했는지, 이 권한을 요청하기 전에 앱에서 사용자에게 근거를 표시해야 하는지 확인합니다.

세션 구성

다음으로, DeviceTrackingMode.SPATIAL를 설정하여 XR용 Jetpack Compose를 사용할 때 생성되는 앱의 세션을 구성합니다.

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-fighting) 다음 방법을 사용하여 레이아웃 볼륨을 명시적으로 관리하세요.

  1. 오프셋 사용: SubspaceModifier.offset를 사용하여 주변 UI(예: HUD)를 Z축에서 더 가깝게 또는 더 멀리 밀거나 사용자의 시야 가장자리로 이동합니다.
  2. 크기 제한: requiredSizeIn와 같은 수정자를 적용하여 공간의 경계 상자를 제한합니다.

좌표 공간, 레이아웃 제약 조건, 사용 가능한 모든 추적 구성에 관한 자세한 내용은 Subspace 참고 문서를 확인하세요.