스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
매력적인 공간 비디오 및 사진 경험 빌드하기
공간 비디오 및 사진을 앱으로 가져오는 방법을 알아보세요. 스테레오스코프 미디어의 여러 유형을 살펴보고, iPhone 15 Pro에서 iOS 앱의 공간 비디오를 캡처하는 방법을 알아보세요. 새로운 QuickLook Preview Application API 등 visionOS에서 공간 미디어를 감지하고 표시하는 다양한 방법을 확인해 보세요. 사진 또는 비디오에 공간 컴퓨팅을 적용하는 메타데이터 및 스테레오 개념에 대해서도 자세히 알아보세요.
챕터
- 0:00 - Introduction
- 1:07 - Types of stereoscopic experiences
- 4:13 - Tour of the new APIs
- 13:14 - Deep dive into spatial media formats
리소스
- AVCam
- Converting side-by-side 3D video to multiview HEVC and spatial video
- Creating spatial photos and videos with spatial metadata
- Forum: Spatial Computing
- Writing spatial photos
관련 비디오
WWDC24
- 공간 웹을 위해 최적화하기
- 맞춤형 환경에서 더욱 몰입감 넘치는 미디어 시청 경험 만들기
- iOS 또는 iPadOS 게임을 visionOS로 가져오기
- visionOS용 훑어보기의 새로운 기능
WWDC23
-
다운로드
안녕하세요, 저는 Vedant입니다 Vision Pro 엔지니어죠 이 세션에서는 공간 사진과 공간 비디오로 매력적인 경험을 만드는 방법을 설명해 드리겠습니다 공간 사진 및 비디오가 발표된 지 1년이 되었고 이 새로운 매체는 시각적 스토리텔링에 완전히 새로운 차원을 열어주었습니다 사람들은 이를 통해 가족과의 개인적인 순간을 다시 경험하고 전 세계의 이야기를 공유하고 물 속과 하늘 위를 여행하는 등 다양한 용도로 사용하고 있죠
그리고 이제 머신 러닝을 통해 모든 사진을 공간 사진으로 변환할 수 있게 되어 옛 추억을 새로운 방식으로 재현할 수 있게 되었습니다
오늘은 앱에 공간 미디어 경험을 추가하는 방법을 보여드리겠습니다! 먼저, 사용 가능한 다양한 유형의 입체 영상 경험을 살펴보고 공간 미디어 경험의 특별한 점을 알아보겠습니다 그런 다음 새로운 공간 미디어 API와 이를 통해 구현할 수 있는 기능을 살펴봅니다 마지막으로 맞춤형 공간 미디어 제작을 원하는 파워 유저를 위해 공간 미디어 포맷에 대해 자세히 알아보겠습니다 먼저 스테레오 비디오의 여러 종류를 살펴보겠습니다 입체 영상은 Vision Pro용 동영상을 강화하는 멋진 방법으로 Apple에서는 이를 지원하는 여러 포맷을 제공합니다 먼저 3D 비디오가 있습니다 AppleTV 및 Disney+ 앱에서 제공되는 3D 영화와 같은 것인데요 평면 화면에서 렌더링되지만 콘텐츠가 입체적이기 때문에 깊이감이 있고 동영상 속 움직임이 튀어나오거나 들어가는 것처럼 보일 수 있습니다
그리고 Vision Pro 및 iPhone 15 Pro에서 캡처할 수 있는 공간 비디오가 있습니다 윈도우를 통해 렌더링되며 가장자리에 희미한 빛과 맞춤형 재생 컨트롤이 있습니다 이렇게 하면 깊이감이 향상되고 불편함을 유발하는 몇 가지 일반적인 원인이 완화됩니다 공간 동영상은 포인트 앤 슛 형식으로 훌륭하게 작동합니다 누구나 편안하고 매력적인 콘텐츠를 iPhone 같은 기기로 촬영할 수 있습니다 3D 영화 제작 규칙에 대한 전문가가 아니더라도 가능합니다 전문가급 고사양 콘텐츠의 경우 공간 오디오가 적용되고 180도 8K 해상도로 촬영한 Apple Immersive Video가 있습니다 visionOS 2.0부터는 작은 플로팅 윈도우에서 콘텐츠를 렌더링하는 공간 비디오와 같은 미리보기 프레젠테이션이 제공됩니다 이를 통해 사용자는 다른 앱과 상호 작용하면서 스테레오로 동영상을 시청할 수 있습니다
이 경험들은 그 자체로도 훌륭해 보이지만 다른 앱이 배경이 되고 콘텐츠에 집중할 수 있는 완전 몰입 환경에서 더욱 빛납니다 앱마다 완전 몰입 환경에서 보이는 방식이 다릅니다 3D 비디오는 환경에 도킹되는데 화면이 뒤로 이동하고 확대되는 방식입니다 2D와 3D 모두에서 제가 가장 좋아하는 영화 감상법입니다
앱에 도킹을 추가하는 방법에 대한 자세한 내용은 관련 내용을 다룬 비디오 ‘맞춤형 앱 환경에서 비디오 재생 및 몰입감 향상하기’에서 확인하세요
공간 비디오는 실제 사물의 크기에 맞게 콘텐츠의 크기가 조정되는 몰입형 프레젠테이션으로 확장됩니다 프레임 가장자리가 사라지고 콘텐츠가 실제 세계와 매끄럽게 어우러지면서 보기만 하는 것이 아니라 콘텐츠 안에 존재하는 것처럼 느껴집니다
오른쪽 상단에 있는 Immersive 버튼을 탭하여 공간 동영상에 완전히 몰입할 수 있으며
하단의 나가기 버튼으로 동영상을 축소할 수도 있습니다
이렇게 하면 공유 공간에서 다른 앱과 멀티태스킹할 수 있는 윈도우 프레젠테이션으로 돌아갈 수 있습니다
Apple Immersive Video의 경우 비디오가 기본 환경으로 확장되고 비디오 화면이 시청자를 감싸며 패스스루가 완전히 비활성화되어 더욱 실감나는 감상이 가능합니다 이는 전문적이고 창의적인 스토리텔링의 새로운 가능성을 열어줍니다 시청자가 이야기 속으로 들어가 현실과 같은 생생한 경험을 하게 되죠
3D 비디오, 공간 비디오 Apple Immersive Video는 함께 풍부한 입체 콘텐츠 생태계를 만들어내며 다양한 상황에 어울리게 합니다 이것들은 visionOS가 제공하는 스테레오 미디어 경험 중 일부에 불과합니다 공간 사진이라는 것도 있는데 공간 비디오와 동일한 포털과 몰입형 프레젠테이션을 사용하는 사진입니다 맞춤형 비디오 경험은 API와 AVFoundation RealityKit으로 구축이 가능하며 또한 사진과 동영상이 입체 콘텐츠가 되어 향상되는 것처럼 실시간 3D 콘텐츠도 특히 상호작용하는 콘텐츠일 때 입체적으로 멋지게 보일 수 있습니다 이러한 콘텐츠를 만들어내는 방법은 ‘iOS 또는 iPadOS 게임을 visionOS로 가져오기’ 동영상 세션에서 확인하세요
공간 미디어가 무엇인지 알았으니 앱에 추가하는 방법을 살펴봅시다 이 섹션에서는 새로운 영역의 API 세 가지를 살펴보겠습니다 공간 비디오 촬영하기 파일이 공간인지 감지하고 로드하기 그리고 visionOS에서 표시하기 위한 다양한 옵션입니다 이 섹션을 살펴보시면 공간 미디어를 위한 새 프레임워크가 없다는 것을 알 수 있습니다 여러분이 이미 알고 있고 사용하는 기존 Apple 프레임워크에 모두 통합되어 있기 때문입니다 AVFoundation, PhotoKit, QuickLook, WebKit 등에요 몇 줄의 코드만 추가하면 다른 유형의 미디어와 동일한 방식으로 앱에 공간 미디어를 추가할 수 있습니다 먼저 공간 비디오가 녹화되는 방법을 살펴보겠습니다
iPhone 15 Pro에서는 와이드 카메라와 울트라 와이드 카메라를 대각선이 아니라 나란히 배치할 수 있도록 변경되었습니다 즉, 휴대폰을 가로 방향으로 잡으면 두 카메라가 사람의 눈과 같은 방향인 수평 기준선에 나란히 놓이게 됩니다 이를 통해 카메라 앱에서 공간 비디오 촬영이 가능합니다 이 API가 공개되어 모든 앱에서 공간 비디오 녹화가 가능해졌습니다 방법을 알아보겠습니다 일반 2D 비디오를 녹화하는 코드를 작성한 다음 공간 경험을 위해 확장해 보겠습니다
AVCapture에서는 이러한 데이터 흐름을 사용할 것입니다 먼저 deviceInput이 필요합니다 카메라와 같은 CaptureDevice의 입력을 나타냅니다 다음으로 MovieFileOutput이 필요한데 출력을 관리하고 디스크에 기록합니다 입력과 출력은 AVCapture Connection으로 연결되며 AVCaptureSession은 이러한 컴포넌트 사이의 데이터 흐름을 조정합니다
이를 코드로 작성해 보겠습니다 먼저 AVCaptureSession을 만들고 AVCaptureDevice를 만들어 일단 기본값인 systemPreferredCamera로 설정합니다
그 다음 세션에 입력을 추가합니다
세션에 출력을 추가합니다
구성을 커밋하고 실행을 시작합니다 Camera Capture API를 사용해 보신 적이 있다면 이 흐름이 아주 익숙하실 것입니다 아직 경험이 없으시다면 developer.apple.com에서 AVCam 샘플 코드 프로젝트를 확인해 보세요
이제 이 코드를 확장하여 공간 비디오를 녹화해 보겠습니다 세 가지 작업만 하면 됩니다 출력에서 AVCaptureDevice를 변경하고 지원되는 비디오 포맷을 선택한 다음 공간 비디오 녹화를 활성화합니다 먼저 AVCaptureDevice를 변경합니다 builtInDualWideCamera를 사용하는데 공간 비디오를 사용하려면 와이드 및 울트라 와이드 카메라가 동시에 스트리밍되어야 하기 때문입니다
다음으로 공간 비디오를 지원하는 비디오 포맷을 선택합니다 videoDevice의 형식을 반복하여 isSpatialVideoCaptureSupported가 true인지 확인합니다 해당되는 포맷을 찾으면 이를 videoDevice의 activeFormat으로 설정합니다 videoDevice를 적절하게 잠그고 잠금 해제해 봅시다 오류 처리도 추가해 보겠습니다 기준을 충족하는 공간 형식을 찾지 못하면 false를 반환합니다
마지막으로 공간 비디오 캡처가 지원되는지 확인하고 지원되는 경우 isSpatialVideoCaptureEnabled를 true로 설정하겠습니다 이 방법은 iPhone 15 Pro에서만 작동하며 다른 기기에서는 isSpatialVideoCaptureSupported가 false를 반환합니다 이 경우 해당 오류를 적절히 처리해야 합니다
됐습니다! 이 세 가지 작은 변경만으로 공간 비디오 녹화 준비가 끝났습니다! 모든 복잡한 작업들 동기화, 카메라 보정 인코딩, 메타데이터 작성이 모두 추상화됩니다 디스크에 완전한 형태의 공간 비디오 파일을 movieFileOutput에서 가져오기만 하면 됩니다 정말 간단하지만 더 나은 품질의 비디오 녹화를 위해 두 가지를 더 추가할 수 있습니다 개선된 동영상 안정화와 멋진 미리보기입니다 방법을 알아보겠습니다
최상의 안정화 품질을 위해서 preferredVideoStabilizationMode를 cinematicExtendedEnhanced로 설정합니다 더 긴 전방 탐색 윈도우를 사용하고 더 많은 프레임을 잘라내어 더 부드러운 비디오를 만들 수 있습니다 부드러운 비디오는 늘 바람직하지만 화면 크기를 다른 기기보다 훨씬 크게 만들 수 있기 때문에 visionOS에서는 특히 중요합니다
다른 비디오 형식과 마찬가지로 AVCaptureVideoPreviewLayer API를 사용해 동영상 미리보기 피드를 가져올 수 있습니다 하지만 iPhone 디스플레이는 단안형이기 때문에 공간 미리보기를 제공할 수 없습니다 따라서 기기 방향에 관계없이 항상 와이드 카메라가 표시됩니다
여기서 중요한 점은 공간 비디오에 사용되는 와이드, 울트라 와이드 카메라는 실제로는 서로 다른 종류의 카메라라는 점입니다! 와이드는 일반적인 사진 촬영에 가장 적합한 iPhone 카메라이며 울트라 와이드는 극적인 광각 촬영, 클로즈업 초점에 최적화되어 있습니다 두 카메라는 각각 집광 능력과 최소 초점 거리도 다릅니다 공간 촬영 시에는 대부분의 경우 이러한 차이가 크게 눈에 띄지 않습니다 이러한 차이를 보정하기 위해 사용하는 컴퓨터 사진 기술 덕분이죠 그러나 공간 비디오를 저조도에서 촬영하는 경우 각 카메라의 노이즈 레벨이 다를 수 있으며 Vision Pro에서 비디오를 볼 때 불편함을 유발할 수 있습니다 카메라 최소 초점 거리보다 가까운 피사체를 촬영하는 경우에도 초점 불일치가 발생하여 불편할 수 있습니다 iPhone 미리보기는 단안형이라 이러한 문제를 Vision Pro에서 비디오를 볼 때까지 알아차리지 못할 수 있습니다 그때가 되면 촬영하려는 순간이 이미 지나서 다시 녹화하기에는 너무 늦었을 수 있습니다 이 문제를 해결하기 위해 새로운 spatialCaptureDiscomfortReasons 변수를 AVCaptureDevice에 만들었습니다 키 값 관찰을 사용하여 앱에서 이를 관찰하고 .subjectTooClose 또는 .notEnoughLight 조건이 감지되면 적절한 안내 UI를 렌더링할 수 있습니다
보시면 iPhone 카메라 앱에서 피사체에 너무 가까워지면 경고를 표시하고 뒤로 가면 경고를 해제합니다 여러분의 앱에도 이와 유사한 안내 UI를 표시하는 것이 좋습니다 이제 공간 비디오를 녹화했으니 재생하는 방법을 살펴봅시다 첫 단계는 애셋이 공간 비디오임을 감지하고 로드하는 것입니다 여러 방법이 있는데 PhotosPicker, PhotoKit AVAssetPlaybackAssistant를 사용합니다
PhotosPicker API는 사용자가 사진 보관함에서 애셋 선택에 도움이 되는 보기를 제공합니다 이제 공간 애셋에 대한 필터링도 지원합니다 일치하는 매개변수에 spatialMedia를 지정하면 사용자의 보관함을 필터링하여 공간 사진과 비디오만 보여 줍니다
사용자 입력이 필요하지 않다면 PhotoKit을 사용해 사용자의 사진 보관함에서 모든 공간 애셋을 프로그래밍 방식으로 가져옵니다 데이터 검색 조건을 구성할 때 spatialMedia를 PHAssetMediaSubtype으로 설정하기만 하면 됩니다
공간 사진만 반환하거나 공간 비디오만 반환하도록 조건을 수정할 수도 있습니다
동영상의 경우 AVAssetPlaybackAssistant도 사용 가능합니다 playbackConfigurationOptions를 쿼리하여 로컬 애셋이 공간 관련인지도 확인 가능합니다 여러분의 앱이 사진 보관함 외부의 소스에서 비디오를 로드한다면 유용합니다
이제 공간 콘텐츠를 로드할 수 있으니 보여주기를 해보겠습니다 마찬가지로 이 작업에도 여러 옵션이 있습니다
QuickLook 프레임워크의 PreviewApplication API는 사진과 비디오를 지원하고 Javascript에서는 Element FullScreen API가 웹에서 공간 사진 로딩을 지원하며 AVKit에서 공간 동영상을 지원하는 AVPlayerViewController가 있습니다
QuickLook은 visionOS에서 파일을 빠르게 여는 시스템 표준 방식입니다 새로운 PreviewApplication API로 이제 여러분의 앱 내부에서 자체 콘텐츠를 호스팅하는 QuickLook 장면을 생성할 수 있습니다 공간 사진과 비디오를 모두 지원하며 사진 앱과 마찬가지로 전체 공간 프레젠테이션을 사용합니다 PreviewApplication API에 대한 자세한 내용은 관련 내용을 다룬 비디오 ‘공간 컴퓨팅을 위한 훑어보기의 새로운 기능’에서 확인하세요
JavaScript의 Element FullScreen API로는 Safari의 웹 페이지에서 공간 사진을 열 수 있습니다 PreviewApplication와 마찬가지로 새로운 장면에서 사진이 열리며 전체 공간 프레젠테이션이 함께 제공됩니다 FullScreen API에 대해 자세히 알아보려면 ‘공간 웹을 위해 최적화하기’ 비디오를 시청하세요 마지막으로 AVPlayerViewController는 모든 유형의 동영상을 재생할 수 있는 크로스 플랫폼 API입니다 2D 및 3D 비디오를 모두 지원하여 두 가지 유형의 콘텐츠를 일관된 프레젠테이션 스타일로 보여주려는 경우 훌륭한 옵션입니다 또한 공간 비디오를 위한 HTTP Live Streaming도 지원합니다
공간 비디오에 AVPlayerViewController를 사용할 때 몇 가지 유의 사항이 있습니다 비디오는 전체 화면으로 전환될 때만 3D로 표시됩니다 인라인 프레젠테이션에서는 2D로 표시됩니다 콘텐츠를 전체 화면으로 표시하려면 AVPlayerViewController의 크기를 WindowScene 프레임에 맞게 조정하면 됩니다
한 가지 주의할 점은 AVPlayerViewController는 전체 화면에서도 공간 비디오가 아닌 3D 비디오 프레젠테이션을 사용합니다 공간 비디오는 MVHEVC를 기반으로 구축되었으므로 3D 비디오로도 유효하며 AVPlayerViewController도 동영상을 이렇게 다룹니다 앱에 전체 공간 프레젠테이션이 필요한 경우 PreviewApplication을 사용하세요
마지막으로, 앱을 디자인할 때 동영상 위에 직접 배치되는 UI의 양을 최소화하세요 UI가 깔끔하면 콘텐츠에 집중할 수 있고 깊이 충돌의 위험도 최소화됩니다 지금까지 공간 미디어를 녹화, 감지, 로드, 표시하는 다양한 방법을 살펴봤습니다 앱 개발자가 앱에서 공간 미디어 사용을 시작할 때 방금 살펴본 API만 있으면 됩니다
하지만 맞춤형 공간 미디어를 제작하고자 하는 분들을 위해 더 자세히 알아 보겠습니다
파일 형식으로서의 공간 비디오는 추가 공간 메타데이터가 포함된 스테레오 MV-HEVC 비디오입니다
공간 사진은 스테레오 HEIC로 일부 공간 메타데이터와 함께 스테레오 그룹에 두 이미지가 있습니다 이러한 파일을 읽고 쓰는 방법을 이해할 수 있도록 developer.apple.com에 샘플 코드 프로젝트 두 개와 문서가 준비되어 있습니다 두 파일 형식에 공통으로 적용되는 공간 메타데이터에 대해 자세히 살펴보겠습니다 공간 메타데이터는 몇 가지 요소로 구성됩니다 하나는 투영으로 이는 월드의 오브젝트와 이미지의 픽셀 간의 관계를 정의합니다 공간 사진과 비디오는 항상 직선 투영을 사용합니다 그리고 기준선과 시야가 있는데 이는 공간 애셋을 캡처하는 카메라의 물리적 특성을 설명합니다 그리고 시차 조정은 윈도우가 있는 프레젠테이션에서 3D 효과를 제어합니다 또한 왼쪽 및 오른쪽 이미지를 만드는 방법에 대한 몇 가지 지침도 있습니다 이들은 이미지에 픽셀로 저장되는 이미지 특성이므로 명시적으로 메타데이터 필드가 아니며 공간 파일인지 확인할 때 적용되지 않습니다 그러나 최적의 감상 환경을 위해 이를 이해하고 알맞게 설정하는 것은 여전히 중요합니다
최적의 이미지 특성을 위해 왼쪽과 오른쪽 이미지가 스테레오로 보정되고 광축이 정렬되어야 하며 수직 시차가 없어야 합니다 새로운 기술 용어가 잔뜩 등장했네요! 잘 이해할 수 있도록 예를 들어보겠습니다
벌새 Howie를 소개합니다 공간 사진 촬영의 모델이 되어 줄 거예요 Howie를 촬영하기 위해 카메라 두 대를 스테레오 쌍으로 수평으로 정렬해 배치했습니다
두 카메라가 동기화된 사진을 촬영해 스테레오 쌍의 왼쪽과 오른쪽 이미지를 형성합니다 핀홀 카메라이기 때문에 이미지가 직선이므로 월드의 직선이 이미지에도 똑바로 나타납니다
첫 번째 메타데이터 필드는 축간 거리라고도 하는 기준선으로 두 카메라의 중심 사이의 수평 거리를 정의합니다 기준선을 설정하는 최적의 거리는 사용 사례에 따라 다릅니다 약 64mm의 값은 사람의 눈과 가장 가까운 이미지를 생성하는데 사람의 눈이 그 정도 간격으로 떨어져 있기 때문입니다 이보다 작은 값은 클로즈업 장면 촬영 시 유용할 수 있으며 정말 큰 기준선은 멀리 있는 피사체의 깊이를 포착하는 스테레오 풍경 사진에서 사용합니다 넓은 기준선의 단점은 과장된 깊이로 인한 미니어처화 효과입니다 이 예시에서는 64mm 기준선을 사용하겠습니다
다음 메타데이터인 시야는 각각의 카메라가 촬영한 각도 단위의 수평 각도입니다 일반적으로 시야가 높을수록 장면의 더 많은 부분을 볼 수 있어 몰입감이 높아집니다 하지만 고정 센서의 경우 시야각이 높을수록 같은 수의 픽셀에 더 많은 콘텐츠가 분산되므로 각도 해상도가 낮아집니다 또한 우리의 경우 투영이 직선형이기 때문에 90도보다 큰 시야각은 비효율적입니다 각도 샘플링 밀도가 특히 가장자리에서 비효율적이므로 권장하지 않습니다 이 예시에서는 시야각으로 60도를 사용하겠습니다
이제 모든 이미지 특성을 확인해 보겠습니다 첫 번째 지침의 내용은 이미지가 스테레오 정렬되어야 한다는 것인데 이는 두 카메라의 광축이 보이는 것과 같이 평행하다는 것을 의미합니다 그리고 두 이미지가 같은 평면에 있어야 합니다 여기에 표시된 것처럼 카메라의 광축이 평행하지 않으면 이미지가 다른 평면에 있게 되어 스테레오 정렬되지 않습니다 이러한 경우 이미지 왜곡을 제거하기 위해 스테레오 직선화라고 하는 이미지 처리 기술을 사용합니다
다음으로 이미지 중심이 광학 중심과 정렬되었는지 확인합니다 이는 각 이미지의 중심 픽셀이 광축에 정렬되어 있음을 의미합니다 핀홀 카메라의 경우 기본적으로 이렇게 정렬되지만 실수로 이 정렬을 깨뜨리게 되는 몇 가지 경우가 있습니다 이를 확인하기 위해 이미지를 자세히 살펴봅시다
이 스테레오 이미지 쌍은 이미지 중심이 광축에 정렬되어 있습니다 하지만 이 이미지를 자르면 중심 픽셀이 변경됩니다 새로운 중심 픽셀이 더 이상 광축에 정렬되지 않으므로 이 잘린 스테레오 쌍은 최적이 아닙니다 마찬가지로 이미지를 좌우로 이동하면 중심 픽셀도 변경되어 이 지침을 위반하게 됩니다 이러한 종류의 수평 이동 적용은 3D 영화 제작에서 일반적 관행으로 예술적인 효과를 얻을 수 있습니다 하지만 공간 미디어에서는 권장하지 않는 방법입니다 이러한 효과를 얻기 위한 불균형 조정 메타데이터가 있는데 나중에 다시 설명하겠습니다 먼저 수직 시차가 없는지 확인해 보겠습니다 이를 수행하는 가장 쉬운 방법은 왼쪽과 오른쪽 이미지를 가져와 두 이미지에 공통으로 나타나는 특징점을 식별하는 것입니다 여기, 새의 부리에 그 사이에 선을 그립니다 이 선이 완벽하게 수평이면 이미지가 수직 시차 없이 올바르게 정렬된 것입니다
다음은 카메라가 잘못 정렬된 다른 스테레오 쌍입니다
특징점을 표시하고 연결하여 수직 시차가 있는지 확인할 수 있습니다 여기에서는 특징점 사이의 선이 완벽하게 수평이 아닙니다 이는 이미지에 수직 시차가 있으며 Vision Pro에서 보기가 불편할 수 있다는 것을 의미합니다
지금까지 한 작업을 검토해 보면 왼쪽 및 오른쪽 프레임이 직선이고, 스테레오 정렬되었으며 광축이 정렬되어 있고 수직 시차가 없는지 확인했습니다 기준선과 시야도 파악했습니다
이제 이 콘텐츠가 어떻게 렌더링되는지 보겠습니다 마법 같은 일이 벌어지고 이 모든 세심한 카메라 보정이 마침내 결실을 맺게 됩니다 제공된 정보를 바탕으로 렌더러는 월드의 오브젝트가 카메라로 캡처된 방식을 정의하는 카메라 모델을 구성할 수 있습니다
그런 다음 해당 광선을 역으로 추적해 올바른 크기와 거리로 두 개의 이미지를 렌더링합니다
Vision Pro에서 보면 하나의 이미지가 시청자의 각 눈에 표시됩니다 시각 시스템은 이 두 이미지를 3D 장면으로 융합하여 3D 오브젝트를 인식합니다 파일이 정확한 메타데이터로 올바르게 구성되고 모든 이미지 특성 가이드라인이 충족되면 눈으로 보는 인식된 이미지가 카메라가 본 실제 오브젝트와 정확히 일치합니다 마치 그 때로 순간 이동하여 카메라를 눈으로 삼아 보는 것 같은 효과를 얻을 수 있습니다 이것이 바로 1인칭 시점에서 ‘순간을 되살리는’ 마법 같은 느낌을 만들어내는 것입니다
공간 사진도 공유 공간에서 마찬가지로 강력할 수 있습니다 이 모드에서는 visionOS가 이미지를 윈도우에 표시하여 장면의 크기를 줄이는 동시에 입체적으로 렌더링합니다 여기서 목표는 완벽하게 사실적인 표현이 아니라 예술적, 정서적으로 공감할 수 있는 3D 효과를 제공하는 것입니다 사람들이 윈도우에서 콘텐츠를 편안하게 볼 수 있도록 만드는 공간 메타데이터의 마지막 부분인 시차 조정을 소개합니다 입체 사진에 익숙한 분이라면 시차 조정은 렌더러에게 제로 패럴랙스 평면을 어디 배치할지 알려 주는 힌트입니다 경우에 따라 이는 컨버전스 조정 또는 수평 이미지 변환이라고도 합니다
실제로는 이미지 너비의 백분율로 인코딩된 수평 오프셋을 나타냅니다 음수 값은 왼쪽 프레임을 오른쪽으로 오른쪽 프레임을 왼쪽으로 밀어냅니다 양수 값은 이 반대의 방향으로 밀어냅니다
이미지가 수평으로 이동하면 우리의 뇌가 인식하는 3D 장면의 깊이도 Z축을 따라 이동합니다 따라서 음수 값은 콘텐츠를 시청자에게 더 가깝게 보이게 하고 양수 값은 콘텐츠를 더 멀리 밀어냅니다 이 값을 설정할 때는 주의하세요 음수 값이 너무 크면 깊이 충돌이 발생할 수 있고 양수 값이 너무 크면 특히 배경에 있는 오브젝트에 대해 시선이 분산되게 만들어 불편함을 느끼게 될 수 있습니다 이 장면에서는 벌새를 창문 앞쪽 바로 너머에 배치하는 값을 선택하겠습니다 몇 퍼센트 포인트만 이동해도 이미지 인식이 크게 달라질 수 있으므로 Vision Pro에서 테스트해 보고 값을 선택하여 시차를 조정해야 합니다 이제 수평 시차 조정을 추가할 수 있고 공간 애셋 구성에 필요한 모든 입력이 완료되었습니다 이제 적절한 파일 형식으로 패키징하는 작업만 남았습니다 비디오에는 스테레오 MV-HEVC 사진에는 스테레오 HEIC를 사용합니다
이제 최종 결과물이 Apple Vision Pro에서 올바르게 렌더링되며 멋지게 보입니다 윈도우 상태 프레젠테이션과 완전 몰입 모드 모두에서요
마무리해 보겠습니다 이 세션에서는 visionOS의 다양한 스테레오 미디어 유형에 대해 알아보았습니다 3D 비디오, Apple Immersive Videos 공간 사진 및 비디오를 배우고 앱에서 공간 사진과 비디오를 캡처하고, 감지하고 표시하는 방법을 살펴보았습니다 나만의 공간 미디어를 만들 때 정확한 메타데이터와 완벽하게 정렬된 이미지로 Vision Pro에서 멋진 경험을 제공하는 방법도 알아보았습니다
저는 여기까지입니다! 공간 미디어를 활용하여 놀랍고 새로운 경험들을 만들어 보시기 바랍니다
-
-
6:19 - Spatial video capture on iPhone 15 Pro
class CaptureManager { var session: AVCaptureSession! var input: AVCaptureDeviceInput! var output: AVCaptureMovieFileOutput! func setupSession() throws -> Bool { session = AVCaptureSession() session.beginConfiguration() guard let videoDevice = AVCaptureDevice.default( .builtInDualWideCamera, for: .video, position: .back ) else { return false } var foundSpatialFormat = false for format in videoDevice.formats { if format.isSpatialVideoCaptureSupported { try videoDevice.lockForConfiguration() videoDevice.activeFormat = format videoDevice.unlockForConfiguration() foundSpatialFormat = true break } } guard foundSpatialFormat else { return false } let videoDeviceInput = try AVCaptureDeviceInput(device: videoDevice) guard session.canAddInput(videoDeviceInput) else { return false } session.addInput(videoDeviceInput) input = videoDeviceInput let movieFileOutput = AVCaptureMovieFileOutput() guard session.canAddOutput(movieFileOutput) else { return false } session.addOutput(movieFileOutput) output = movieFileOutput guard let connection = output.connection(with: .video) else { return false } guard connection.isVideoStabilizationSupported else { return false } connection.preferredVideoStabilizationMode = .cinematicExtendedEnhanced guard movieFileOutput.isSpatialVideoCaptureSupported else { return false } movieFileOutput.isSpatialVideoCaptureEnabled = true session.commitConfiguration() session.startRunning() return true } }
-
9:13 - Observing spatial capture discomfort reasons
let observation = videoDevice.observe(\.spatialCaptureDiscomfortReasons) { (device, change) in guard let newValue = change.newValue else { return } if newValue.contains(.subjectTooClose) { // Guide user to move back } if newValue.contains(.notEnoughLight) { // Guide user to find a brighter environment } }
-
9:58 - PhotosPicker
import SwiftUI import PhotosUI struct PickerView: View { @State var selectedItem: PhotosPickerItem? var body: some View { PhotosPicker(selection: $selectedItem, matching: .spatialMedia) { Text("Choose a spatial photo or video") } } }
-
10:14 - PhotoKit - all spatial assets
import Photos func fetchSpatialAssets() { let fetchOptions = PHFetchOptions() fetchOptions.predicate = NSPredicate( format: "(mediaSubtypes & %d) != 0", argumentArray: [PHAssetMediaSubtype.spatialMedia.rawValue] ) fetchResult = PHAsset.fetchAssets(with: fetchOptions) }
-
10:36 - AVAssetPlaybackAssistant
import AVFoundation extension AVURLAsset { func isSpatialVideo() async -> Bool { let assistant = AVAssetPlaybackAssistant(asset: self) let options = await assistant.playbackConfigurationOptions return options.contains(.spatialVideo) } }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.