iOS 17부터 사용할 수 있는 RealityKit 기반의 새로운 기술인 ObjectCapture의
고도화된 기능들이 이번 WWDC24의 하나의 세션으로 소개 되었습니다.
이 세션을 바탕으로 정리한 내용을 공유하고자 합니다.
Object Capture를 위한 영역 모드 살펴보기 - WWDC24 - 비디오 - Apple Developer
Object Capture의 영역 모드에서 영역을 캡처하고 재구성할 수 있도록 Object Capture의 기능을 확장하는 등 iOS에서 새로운 3D 캡처 방식을 구현하는 방법을 알아보세요. 재구성을 위한 새로운 macOS 샘플
developer.apple.com
ObjectCaptureView의 새로운 기능
기존의 ObjectCaptureView는 물체를 Detecting 한 후,
Bounding box의 형태로 캡쳐하고자 하는 오브젝트의 영역을 지정해야했습니다.
하지만, 이번에 새롭게 추가된 영역 모드(Area mode)를 통해 앞서 말한 Detecting 과정을 없애고,
바로 Capturing을 시작할 수 있게 되었습니다.
영역 모드는 기존에 주로 3D 오브젝트를 캡처하던 ObjectCaptureView가
고르지 않은 지형, 2.5D의 표면 등 더 다양한 Object들을 쉽게 캡처할 수 있게 도와줍니다.
이 때, 6피트보다 큰 영역을 캡처하게 되면 텍스처 품질의 저하를 유발한다고 합니다.
새롭게 추가된 영역모드를 사용해보기 위해선 위 링크에서 Sample Code를 다운로드 받습니다.
Scanning objects using Object Capture | Apple Developer Documentation
Implement a full scanning workflow for capturing objects on iOS devices.
developer.apple.com
그리고 ObjectCaptureView에 .hideObjectReticle() 수정자를 추가한 후,
CaptureOverlayView의 Extension에서 startDetecting() 하는 부분을 startCapturing()으로 변경하면 직접 사용해볼 수 있습니다.
(현재는 iOS18의 추가된 코드이므로 Xcode를 베타 16 버전으로 올려야 사용해볼 수 있습니다.)
MacOS에서의 Object Capture 새로운 기능
MacOS에서는 캡처한 이미지 폴더를 넣으면 photogrammetry를 이용하여
다양한 옵션들을 선택하여 3D Model을 만들 수 있는 기능이 추가되었습니다.
Building an object reconstruction app | Apple Developer Documentation
Reconstruct objects from user-selected input images by using photogrammetry.
developer.apple.com
위 링크를 통해 Sample Code를 다운 받고 실행시키면 다음과 같은 앱을 실행시킬 수 있습니다.
위 앱을 통해 Quad Mesh와 Triangular Mesh를 선택할 수 있고,
텍스처 품질(1~16K), 주변 환경 포함여부등 세밀한 설정을 통해 3D Model을 생성할 수 있게 되었습니다.
(쿼드 메시를 사용하면 UV 편집과 3D 오브젝트 애니메이션이 더 쉬워지고,
아티스트에 친화적인 적절한 Edge Loop를 생성할 수 있다고 합니다.)
통합 메모리가 높은 Mac에서는 최대 2000개의 이미지 처리가 가능하고,
생성된 모델은 Reality Composer Pro를 통해 편집할 수 있습니다.
새롭게 추가된 Data Loading API
기존 ObjectCapture의 Reconstruction 과정에서
PhotogrammetrySample(contentsOf:) 와 PhotogrammetrySession(input:) 을 통해
RGB 이미지 데이터, depthDataMap, gravity, metaData, objectMask 속성 시퀸스를 추가할 수 있게 되었습니다.
Custom photogrammetry Session 생성 코드 예시
func loadSampleAndMask(file: URL) -> PhotogrammetrySample? {
do {
var sample = try PhotogrammetrySample(contentsOf: file)
sample.objectMask = try loadObjectMask(for: file)
return sample
} catch {
return nil
}
}
func createCustomPhotogrammetrySession(for images: [URL]) -> PhotogrammetrySession {
let inputSequence = images.lazy.compactMap { file in
return loadSampleAndMask(file: file)
}
return PhotogrammetrySession(input: inputSequence)
}
이 때, 모든 이미지를 한 번에 메모리에 로드하지 않도록 주의해야합니다.
즉, 세션이 시퀸스를 반복하면서 이미지를 한 번에 하나씩 로드하도록 코드를 작성해야합니다.
또한, images에 map 대신 compactMap을 사용해야합니다.
하단 이미지는 위 코드를 활용한 예시 케이스입니다.
추가로 PhotogrammetrySample에 읽기 전용 프로퍼티가 제공됩니다.
추가되는 프로퍼티는 다음과 같습니다.
- captureTime, sessionID, boundingBox, depthConfidenceMap, scanPassID, camera data for the shot
- camera에는 transform, intrinsics, calibrationData
ObjectCapture 관련 개발을 하고 있는 저로써는 이번 세션이 정말 흥미롭고 재밌었습니다.
아직은 어렵지만 PhotogrammetrySample 객체를 잘 활용한다면 보다 더 훌륭한 기능을 개발할 수 있을 것 같습니다.
이른 시일내에 추가된 기능들을 연구하고 잘 활용해서 기존에 개발했던 기능을 더욱 더 고도화하는 시간을 가져보고 싶습니다!ㅎㅎ
읽어 주셔서 감사합니다!