공간 기능 확인

공간 기능은 사용자가 앱 또는 시스템과 상호작용할 때 변경될 수 있으며 앱 자체에서 변경할 수도 있습니다(예: 홈 스페이스 또는 전체 스페이스로 이동). 문제를 방지하려면 앱에서 공간 기능을 확인하여 현재 환경에서 지원되는 API를 결정해야 합니다.

XR용 Jetpack Compose를 사용하여 공간 기능 확인

XR용 Jetpack Compose는 공간 기능을 확인하기 위한 컴포지션 로컬을 만듭니다. 이를 사용하여 공간 UI, 공간 음향, 환경, 패스스루 또는 3D 콘텐츠가 사용 설정되어 있는지 확인합니다.

LocalSpatialCapabilities.current를 사용하여 현재 다음과 같은 공간 기능을 사용할 수 있는지 확인할 수 있습니다.

  • isSpatialUiEnabled: 애플리케이션이 공간 UI 요소 (예: SpatialPanel)를 만들 수 있는지 여부를 나타냅니다.
  • isContent3dEnabled: 애플리케이션에서 3D 객체를 만들 수 있는지 나타냅니다.
  • isAppEnvironmentEnabled: 애플리케이션이 환경을 설정할 수 있는지 여부를 나타냅니다.
  • isPassthroughControlEnabled: 애플리케이션이 패스스루 상태를 제어할 수 있는지 여부를 나타냅니다.
  • isSpatialAudioEnabled: 애플리케이션에서 공간 오디오를 사용할 수 있는지 나타냅니다.

다음 예는 공간 UI가 사용 설정되어 있는지 확인하는 방법을 보여줍니다.

if (LocalSpatialCapabilities.current.isSpatialUiEnabled) {
    Subspace {
        SpatialPanel(
            modifier = SubspaceModifier
                .width(1488.dp)
                .fillMaxHeight()
        ) {
            AppContent()
        }
    }
} else {
    AppContent()
}

SceneCore를 사용하여 공간 기능 확인

SceneCore 라이브러리를 사용하려면 세션을 만들어야 합니다. 세션이 생성되면 세션에서 getSpatialCapabilities를 호출하여 현재 사용 가능한 공간 기능을 쿼리합니다.

공간 기능이 변경될 때 알림을 보내는 콜백 addSpatialCapabilitiesChangedListener를 구독할 수도 있습니다.

val xrSession = Session.create(this)

// Example 1: check if enabling passthrough mode is allowed
if (xrSession.getSpatialCapabilities().hasCapability(
       SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL)) {
   xrSession.spatialEnvironment.setPassthroughOpacityPreference(0f)
}
// Example 2: Multiple capability flags can be checked simultaneously:
if (xrSession.getSpatialCapabilities().hasCapability(
       SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL and
               SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)) {
   // ...
}

// Example 3: Create a spatialized panel if/when spatialization UI becomes available
xrSession.addSpatialCapabilitiesChangedListener((capabilities) -> {
  if (capabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_UI)){
Subspace{
   SpatialPanel(...)
      }
   }
});

참고 항목