스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Object Capture를 위한 영역 모드 살펴보기
Object Capture의 영역 모드에서 영역을 캡처하고 재구성할 수 있도록 Object Capture의 기능을 확장하는 등 iOS에서 새로운 3D 캡처 방식을 구현하는 방법을 알아보세요. 재구성을 위한 새로운 macOS 샘플 앱을 사용하여 iOS 캡처의 품질을 최적화하는 방법과 Apple Vision Pro, iPhone, iPad 또는 Mac에서 ‘훑어보기'로 최종 결과물을 확인하는 법도 알아봅니다. 3D 재구성과 관련된 개선 사항을 확인해 보세요. 개발자가 자체 맞춤형 이미지 처리 파이프라인을 만들 수 있도록 하는 새로운 API가 포함되었습니다.
챕터
- 0:00 - Introduction
- 2:41 - iOS API
- 4:24 - macOS sample
- 6:23 - Data Loading API
리소스
관련 비디오
WWDC24
WWDC23
-
다운로드
안녕하세요, Object Capture 팀에서 근무하고 있는 Zach입니다 이번 세션에서는 3D 재구성의 유연성과 품질을 개선하는 여러 개선 사항에 대해 설명해 드리겠습니다 이전에 iOS의 Object Capture를 소개해 드렸습니다 이는 완전히 기기에서 3D 모델을 재구성할 수 있는 Guided Capture UI죠 Object Capture는 모든 각도에서 촬영할 수 있는 공간이 충분히 있는 통제된 실내 환경의 이동 가능한 물체에 대해 가장 효과적입니다 예를 들어 이 꽃병을 옆면으로 돌려 바닥을 스캔하여 캡처하자 근사한 결과가 나왔죠 Object Capture로 완전하고 멋진 객체를 만들 수 있습니다 그러나 바운딩 박스 흐름으로 캡처하기 어려운 객체도 있죠
그래서 영역 모드가 도입됩니다
이제 지면이 고르지 않는 야외에서도 주변을 완전히 돌 수 없는 객체나 2.5D 표면도 쉽게 캡처할 수 있습니다 영역 모드로 만든 모델은 Apple Vision Pro의 3D 환경이나 멋진 프로젝트에서 활용하기 좋습니다 이 기능이 어떻게 작동하는지 살펴보겠습니다 이제 야외에서도 풍부한 텍스처와 3D 형태를 캡처할 수 있죠 먼저 샘플 앱을 열고 영역 모드를 선택합니다 피사체를 조준하고 캡처 시작을 탭하세요 햅틱 탭이 실행된 후 알림음이 재생되며
이미지가 캡처되는 동안 캡처 미리보기에서 펄스가 표시됩니다 주변을 잘 살피면서 캡처한 이미지가 서로 겹치지 않도록 천천히 움직이세요
레티클은 붓처럼 기능하므로 세부 사항을 모두 그리듯이 표면에 따라 레티클을 옮기면 됩니다 너무 가깝거나 멀리 있는 물체를 조준하면 레티클이 사라지죠 최상의 결과를 얻으려면 피사체의 각 표면과 평행하게 캡처하세요
캡처가 끝나면 새로운 카메라 포즈 시각화 기능으로 이미지를 캡처한 위치를 확인하여 현장에서 필요한 데이터를 모두 확보했는지 확인할 수 있죠 마지막으로 프로세스를 선택하여 iPhone에서 3D 모델을 만듭니다
지금 결과도 매우 좋지만 더 좋은 품질을 달성하는 방법을 나중에 알려 드릴게요
이 앱의 소스 코드를 다운로드하여 기능을 직접 사용해 보거나 이를 기반으로 나만의 애플리케이션을 만들 수 있습니다 영역 모드를 사용하면 더욱더 다양한 객체를 만들 수 있으므로 누구나 아름다운 3D 장면을 제작할 수 있죠
샘플 앱으로 Object Capture의 영역 모드 데모를 확인했으니 올해 출시되는 몇 가지 흥미로운 새 기능을 알려 드릴게요 Object Capture를 위해 영역 모드를 통합하는 방법을 먼저 설명할게요 그다음 macOS 샘플 앱으로 품질 재구성을 개선하는 방법을 보여 드리겠습니다 마지막으로 사용 사례에 따라 개선된 유연성을 제공하는 새로운 Data Loading API에 대해 설명할게요 새 iOS API로 시작할게요
우선 Object Capture로 최적의 결과를 얻기 위해 고려할 몇 가지 사항을 알려 드리겠습니다 특정 영역을 캡처할 때는 짙은 그림자 없이 분산광을 얻기 위해 노력하세요 즉, 야외에서는 날씨가 흐리거나 완전히 그늘진 환경이 좋습니다 규칙적인 경로로 천천히 이동하여 특징이 충분히 겹치면서 선명한 이미지가 캡처되도록 하세요 또한 다양한 높이별로 피사체를 캡처하여 피사체를 모든 각도에서 캡처해 보세요 1.8미터보다 큰 영역은 Mac에서 더 높은 디테일 수준으로 처리하지 않으면 메시 및 텍스처 품질이 저하될 수 있죠
Object Capture는 iPad Pro 2021, iPhone 12 Pro 및 이후 모델에서 지원됩니다 이제 앱에서 영역 모드를 구현하는 방법을 알아보겠습니다 작년에는 물체를 감지하고 바운딩 박스를 설정하려면 start 및 startDetecting을 차례로 호출해야 했습니다 바운딩 박스를 설정한 다음 startCapturing을 호출하여 캡처 프로세스를 시작합니다 영역 모드의 경우 새 호출이나 구성을 설정할 필요가 없습니다 훨씬 더 쉽습니다 startDetecting 호출을 건너뛰고 startCapturing으로 바로 진행하세요 이렇게 하면 새 UI가 포함된 영역 모드 경험이 시작됩니다 영역 모드의 감지 단계에서는 바운딩 박스가 없으므로 원활한 전환을 위해 객체 레티클 프레임을 중지하는 것이 좋습니다 이렇게 하면 어떤 모드가 시작되는지 바로 알 수도 있죠 방법을 알아보겠습니다 새로운 hideObjectReticle 한정자를 ObjectCaptureView에 추가하여 시작 버튼 사용 시 영역 모드를 실행하도록 표시합니다 이제 영역 모드에 있음을 UI에서 올바르게 표시하고 있으므로 원활하게 전환했음을 알 수 있습니다
끝났습니다! 이제 Mac용 Object Capture의 새 기능을 살펴볼게요 Mac에서 처리를 진행하면 더 많은 옵션으로 캡처 결과를 최대한 활용하고 높은 품질을 달성할 수 있습니다 새 샘플 앱으로 쉽게 시작할 수 있습니다 여러 3D 모델 유형의 생성 방법을 안내하는 간단한 UI를 갖추었죠 먼저 앞서 캡처한 이미지의 폴더를 선택하겠습니다 폴더의 이름도 지정하고 최종 모델을 저장할 위치를 선택할게요
아래에서 모델을 삼각형 메시로 설정할 수 있죠 올해부터는 쿼드 메시로도 설정할 수 있죠 이 새로운 출력 유형 덕분에 선호하는 도구에서 Object Capture 모델에 대해 추가 정리, 최적화 또는 애니메이션을 진행할 수 있습니다
삼각형 메시와 쿼드 메시를 비교하면 이렇습니다 이러면 더 쉽게 UV를 편집하고 3D 객체에 애니메이션을 적용할 수 있으며, 알고리즘이 아티스트 친화적인 에지 루프를 만들 수 있죠 쿼드 메시 외에도 맞춤 디테일 수준을 최대 16K 텍스처로 설정하는 기능이 도입되었습니다
대형 장면에서는 큰 차이가 나타나며 VFX와 같은 오프라인 렌더링 사용 사례에 적합합니다
16K 텍스처뿐만 아니라 더 많은 이미지가 지원되므로 더 많은 영역을 높은 품질로 처리할 수 있습니다 통합 메모리가 많은 Mac 모델에서는 최대 2,000개의 이미지를 처리할 수 있습니다
환경을 포함하도록 설정한 다음 고품질을 선택할게요
이제 처리를 시작할 수 있습니다
완료했으니 야외에서 캡처한 다른 물체로 해당 단계를 반복할게요 완성된 모델입니다 Apple Vision Pro에서 사용하기 위해 모델을 약간 자르고 수정했습니다 자세한 내용은 Scott이 맡은 ‘공간 컴퓨팅을 위해 3D 애셋 최적화하기’ 세션을 시청하세요
Reality Composer Pro에서 애셋을 더 편집하고 조합했습니다 Apple Vision Pro의 훑어보기에서 확인하니 멋있네요 이 물체를 보니 제가 좋아하는 산책길에 다시 가보고 싶네요
이제 올해 추가된 데이터 로딩 기능을 살펴보겠습니다
캡처를 위해 배경을 통제할 수 없거나 배경이 활발하게 바뀌는 경우 각 이미지에 대해 어떤 픽셀이 전경이며 재구성해야 하는지 어떤 픽셀이 배경이며 재구성하면 안 되는지를 보여 주는 마스크를 제공하면 유용하죠 이 예에서는 손이 움직이며 용과의 일부를 가리고 있으므로 자동 세분화를 진행하면 아티팩트가 발생할 수 있습니다 재구성을 돕는 마스크를 추가하면 이 문제를 해결할 수 있습니다
각 샘플 이미지에 대해 손을 가리기 위한 비트맵 마스크를 만들었다면 재구성에 어떻게 포함시킬 수 있을까요? PhotogrammetrySession은 이미지로부터 모델을 재구성할 때 사용됩니다 세션을 만들 때 사용할 수 있는 입력 소스는 두 가지입니다 이미지가 포함된 폴더 또는 사진 측량 샘플의 시퀀스죠 맞춤형 비트맵의 경우 나만의 시퀀스를 만들고 재구성에 사용할 마스크를 샘플에 추가할 수 있습니다 샘플에는 다양한 속성을 제공할 수 있습니다 가장 중요한 것은 RGB 이미지 데이터지만 메트릭 척도를 복구하기 위한 심도 맵 똑바로 세우기 위한 중력 벡터 또는 추가 정보를 포함하는 메타데이터를 제공할 수 있으며 선택적 객체 마스크도 가능합니다 제가 제공하려는 항목이죠 한편 샘플의 다른 데이터는 계속 유지하고 싶습니다 이전에는 이러한 항목을 모두 수동으로 로드해야 했고 이는 상당히 복잡했죠 이 과정을 간소화하기 위해 로드할 이미지 파일을 가져오고 이미지에서 사용할 수 있는 데이터 속성을 채워 주는 새 로딩 API가 올해 사진 측량 샘플 세션에 대해 도입됩니다 DSLR에서 촬영한 JPEG의 경우 이미지만 로드될 수 있지만 Object Capture UI로 획득한 이미지의 경우 심도 데이터와 중력도 로드됩니다 동기 및 비동기 버전 모두 사용할 수 있죠 사용 사례에서 필요한 경우 비동기 버전을 제공해 드립니다 SwiftUI의 속성을 사용하는 경우처럼요 그러나 사진 측량 세션에서는 동기 버전을 사용해야 합니다 바로 보여 드릴게요
제가 만든 이 간단한 함수에서는 이미지 URL을 가져와 해당 이미지의 데이터를 포함하는 사진 측량 세션을 반환하고 제가 로드하고 샘플에 첨부한 객체 마스크도 반환합니다 여기서 새 API가 호출되는 것을 볼 수 있죠 새 동기 이니셜라이저로 이미지 파일의 로드를 시도합니다 성공하면 이미지에서 발견된 데이터로 채워진 사진 측량 샘플이 생성되죠
이미지 파일별로 제가 미리 만들어 둔 저장된 객체 마스크를 로드할 헬퍼 함수가 있다고 가정해 볼게요 마스크를 로드한 다음 objectMask 속성에 할당합니다
완료되면 샘플을 return으로 처리합니다 마지막으로, 로딩에 문제가 있거나 오류가 발생하면 nil을 반환하도록 합니다 이를 처리하는 방법은 나중에 알려 드릴게요
이제 샘플을 로드하고 샘플에 맞춤형 마스크를 추가했으므로 샘플을 시퀀스에 추가하여 맞춤형 사진 측량 세션을 만들어야 합니다
재구성에 활용할 모든 이미지에 대한 URL이 포함된 배열이 있다고 가정해 보죠 새 loadSampleAndMask 함수를 이 배열에 대해 매핑하여 세션에 대한 입력으로 사용할 lazy 시퀀스를 만들면 됩니다 여기에서 몇 가지 사항에 유의해야 합니다 우선 array에 대해 lazy를 적용하는 것이 중요합니다 이렇게 해야 모든 이미지가 메모리에 동시에 로드되지 않죠 즉, 세션이 시퀀스를 반복하면서 이미지를 한 번에 하나씩 로드하게 됩니다 두 번째로, 여기서는 map 대신 compactMap을 사용합니다 compactMap은 nil인 요소를 모두 무시합니다 파일을 로드할 수 없을 때 이렇게 작동하죠 이제 이 시퀀스를 입력으로 사용하는 세션을 return으로 처리하고 평소처럼 재구성 요청을 실행하면 됩니다 다 됐네요! 최종 재구성이 마음에 듭니다 객체를 가리는 손에 의해 아티팩트가 발생하지도 않았습니다 이전에는 심도 맵과 기타 데이터를 로드하기 위해 수백 줄의 복잡한 코드가 필요했지만 PhotogrammetrySample의 새 이니셜라이저를 사용하면 단 몇 줄의 코드만으로 데이터를 로드할 수 있습니다 기존 데이터 속성을 로드하는 기능과 더불어 ObjectCaptureSession의 캡처 UI로 저장된 데이터를 로드하는 새 읽기 전용 속성도 몇 가지 제공됩니다 이는 속성 UI나 자체 맞춤형 재구성 파이프라인에서 유용할 수 있습니다 문서를 통해 각 속성에 대해 자세히 알아볼 수 있으나 한 가지 중요한 추가 사항에 집중하겠습니다 샷에 대한 카메라 데이터입니다 이 데이터를 사용하여 자체 백엔드 재구성 파이프라인을 생성하거나 데이터 캡처에 대해 개선된 시각화를 제공하려는 경우 ObjectCaptureSession으로 캡처된 이미지에서는 샘플별로 사용할 수 있는 샷에 대해 카메라가 변환됩니다 가능한 경우 맞춤형 파이프라인에서 필요할 수 있는 내부 행렬과 보정 데이터도 제공됩니다 데이터 로딩 API를 사용하면 새 시각화와 맞춤형 파이프라인을 다양한 방식으로 구현할 수 있고 더 유연하게 사진 측량 세션을 만들 수 있습니다
Object Capture에 대한 설명을 마치겠습니다 iOS로 영역을 캡처하는 방법과 Mac에서 사용할 수 있는 모든 옵션으로 처리하는 방법을 배우고 Apple Vision Pro에서 결과를 확인했죠 Object Capture와 3D 모델 최적화에 대해 자세히 알아보려면 화면에 나열된 세션을 확인해 보세요 여러분의 멋진 작품을 기대하겠습니다
-
-
8:19 - Data Loading API - load Sample and Mask
func loadSampleAndMask(file: URL) -> PhotogrammetrySample? { do { var sample = try PhotogrammetrySample(contentsOf: file) sample.objectMask = try loadObjectMask(for: file) return sample } catch { return nil } }
-
9:15 - Data Loading API - create custom photogrammetry Session
func createCustomPhotogrammetrySession(for images: [URL]) -> PhotogrammetrySession { let inputSequence = images.lazy.compactMap { file in return loadSampleAndMask(file: file) } return PhotogrammetrySession(input: inputSequence) }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.