-
Spatial Preview 프레임워크 알아보기
새로운 Spatial Preview 프레임워크를 사용하여 Mac의 콘텐츠를 visionOS로 직접 가져오는 방법을 확인해 보세요. 두 플랫폼 전반에서 실시간 동기화 및 양방향 편집을 통해 동적 워크플로를 구축하는 방법을 알아보세요. Mac 앱의 공간적 기능을 향상할 수 있는 SpatialPreview API, 기기 탐색, 2D 및 3D 세션 통합, 새로운 훑어보기 기능에 대해 알아보세요.
챕터
- 0:00 - Introduction
- 2:37 - Learn about Spatial Preview
- 3:30 - Document Preview
- 6:36 - USD Preview
- 9:16 - Editing Features
- 13:28 - Next steps
리소스
관련 비디오
WWDC26
WWDC22
-
비디오 검색…
-
-
3:58 - Document Preview Session with Device Picker
// Send and update documents using the Spatial Preview framework import SwiftUI import SpatialPreview let deviceObserver = ConnectedSpatialEndpointObserver() let previewSession = DocumentPreviewSession(name: "Immersive.aivu", contentType: .aivu) func startPreview(contentURL: URL, endpoint: SpatialPreviewEndpoint) async throws { let endpoint = try await deviceObserver.endpoint try await previewSession.start(endpoint: endpoint) try await previewSession.updateContents(url: contentURL) } @State var showDevicePicker: Bool = false var body: some View { ... .sheet(isPresented: $showDevicePicker) { SpatialPreviewDevicePicker(isPresented: $showDevicePicker) { endpoint in showDevicePicker = false Task { try await startPreview(filename: filename, endpoint: endpoint) } } } } -
5:20 - Update Document Contents
// Send and update documents using the Spatial Preview framework import SwiftUI import SpatialPreview ForEach(contentURLs, id: \.self) { url in Button { Task { try await previewSession?.updateContents(url: url) } } } .task(id: previewSession.map { ObjectIdentifier($0) }) { for await state in Observations({ session.state }) { if state.isInvalidated { previewSession = nil break } } } try await previewSession?.close() -
7:36 - Edit USD Live
// Edit USD live using USDKit and Spatial Preview import SpatialPreview import USDKit let deviceObserver = ConnectedSpatialEndpointObserver() var usdSession: USDPreviewSession? func shareStage(to endpoint: SpatialPreviewEndpoint) async throws -> USDPreviewSession { let endpoint = try await deviceObserver.endpoint let stageURL = Bundle.main.url(forResource: "sampleScene", withExtension: "usdz") let stage = try USDStage.open(stageURL) usdSession = USDPreviewSession(stage: stage) try await usdSession?.start(endpoint: endpoint) } -
8:56 - Opt out of optimization
// Optimization import SpatialPreview let endpoint = try await deviceObserver.endpoint do { try await usdSession.start(endpoint: endpoint, parameters: .unmodified) } catch USDPreviewSession.Error.assetUnshareable { // Handle Asset Unshareable error } -
10:10 - USD Layout Variants
// LayoutVariants.usda #usda 1.0 over "furniture" ( variantSets = "Layout" variants = { string Layout = "LayoutA" } ) { variantSet "Layout" = { "LayoutA" { // Default furniture position and rotation } "LayoutB" { // Moves furniture prims to a different position and rotation } ... } } -
10:17 - Edit USD live using USDKit and Spatial Preview
// Edit USD live using USDKit and Spatial Preview import SpatialPreview import USDKit func applyLayoutVariant(named layoutVariantName: String) throws { let prim = stage.prim(at: SdfPath("/root/furniture")) try prim.variantSets?.setSelection("Layout", variantName: layoutVariantName) } -
10:49 - USD Stage Observations
// Edit USD live using Spatial Preview import SpatialPreview import USDKit let observerToken: ObservationToken observerToken = stage.addObserver(for: UsdStage.ObjectsDidChange.self) { notice in for path in notice.resyncedPaths { let prim = notice.stage.prim(at: path) guard prim.isValid else { continue } if prim.isAnnotation { // Handle annotation change break } } } -
11:13 - Annotation Spec
// Annotation spec example AppleTextAnnotation { // The textual representation of this annotation string text // The identifier for this specific author uniform string author // An identifier that is unique to your data tracking system uniform string identifier } /__documentAnnotationGroup__ -
11:33 - Metadata for Object Manipulation
// Metadata required for object manipulation in Quick Look customData = { dictionary apple = { bool spatialEditable = 1 } } -
12:16 - Session Options and Events
// Spatial Preview session options and events import SpatialPreview import USDKit session.start(endpoint: endpoint, options: [.annotations, .perObjectManipulation, .export]) func listenForEvents(session: USDPreviewSession) async { for await event in session.events { if case .timeChanged(let time) = event { playbackModel.timeCode = time } else if case .playbackStateChanged(let isPlaying) = event { playbackModel.playbackStateChanged(isPlaying) } } } -
12:38 - Observe Session Progress
// Observe Spatial Preview session progress import SpatialPreview import USDKit @State private var sessionProgress: Double = 0 var body: some View { ... .task(id: usdSession.map { ObjectIdentifier($0) }) { guard let session = usdSession else { return } for await fraction in Observations({ session.progress.fractionCompleted }) { sessionProgress = fraction } } .overlay(alignment: .bottom) { ProgressView(value: sessionProgress) .padding() } }
-
-
- 0:00 - Introduction
The Spatial Preview framework, which lets developers extend content from Mac into visionOS using Mac Virtual Display. Previews what the session covers: an overview of the framework, document preview, and USD preview for live 3D workflows.
- 2:37 - Learn about Spatial Preview
Explores the core components of the Spatial Preview framework: selecting a spatial endpoint, creating a preview session, and launching Quick Look on visionOS. Covers the two session types—Document Preview Session and USD Preview Session—and explains that no visionOS code is required.
- 3:30 - Document Preview
Walks through using DocumentPreviewSession to send files like Apple Immersive Video frames from a Mac app to visionOS. Covers obtaining a Mac Virtual Display endpoint with ConnectedSpatialEndpointObserver, starting a session, providing content URLs, integrating SpatialPreviewDevicePicker in SwiftUI, and using updateContents to build a gallery experience that reuses the same scene.
- 6:36 - USD Preview
Shows how to share and live-edit USD content from a Mac app on visionOS using USDPreviewSession with a USDKit stage. Covers selecting a device, opening a USD stage, starting the session, and handling unshareable assets via the optimization parameter.
- 9:16 - Editing Features
Covers the rich set of Quick Look editing features available through USD Preview: USD layout variants, annotation authoring with AppleTextAnnotation, object manipulation with spatialEditable metadata, and session options including playback events and progress monitoring via ProgressReporter.
- 13:28 - Next steps
Summarizes how to get started with Spatial Preview using USDKit Swift APIs and bridging for existing USD apps. Encourages developers to explore Document Preview Session, USD Preview Session, live editing, SharePlay collaboration, and the full suite of asset review tools.