본문 바로가기

iOS/WWDC

WWDC24 - Object Capture를 위한 영역 모드 살펴보기 정리

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 버전으로 올려야 사용해볼 수 있습니다.)

.hideObjectReticle() 수정자를 추가

 

startDetecting() 하는 부분을 startCapturing()으로 변경

 

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 객체를 잘 활용한다면 보다 더 훌륭한 기능을 개발할 수 있을 것 같습니다.

이른 시일내에 추가된 기능들을 연구하고 잘 활용해서 기존에 개발했던 기능을 더욱 더 고도화하는 시간을 가져보고 싶습니다!ㅎㅎ

읽어 주셔서 감사합니다!