공간 기능은 사용자가 앱 또는 시스템과 상호작용할 때 변경될 수 있으며 앱 자체에서 변경할 수도 있습니다(예: 홈 스페이스 또는 전체 스페이스로 이동). 문제를 방지하려면 앱에서 공간 기능을 확인하여 현재 환경에서 지원되는 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
를 호출하여 현재 사용 가능한 공간 기능을 쿼리합니다.
SPATIAL_CAPABILITY_3D_CONTENT
: 활동에서 3D 콘텐츠를 만들 수 있습니다.SPATIAL_CAPABILITY_APP_ENVIRONMENT
: 활동이 자체 환경을 설정할 수 있습니다.SPATIAL_CAPABILITY_EMBED_ACTIVITY
: 활동이 다른 활동을 공간적으로 삽입할 수 있습니다.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
: 활동에서 패스스루를 사용 설정하거나 중지할 수 있습니다.SPATIAL_CAPABILITY_SPATIAL_AUDIO
: 활동에서 공간 오디오를 사용할 수 있습니다.SPATIAL_CAPABILITY_UI
: 활동이 자체적으로 공간화할 수 있습니다(예: 공간 패널 추가).
공간 기능이 변경될 때 알림을 보내는 콜백 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(...)
}
}
});