안녕하세요! 피피아노입니다 🎵
Apple은 iOS에서도 Object Capture를 사용할 수 있게 되었음을 발표했습니다. Object Capture는 다양한 각도에서 촬영한 이미지를 바탕으로 실제와 같은 3D 모델을 자동으로 만들어주는 API로, 이전에는 Mac에서만 가능했지만 이제 iPhone과 iPad에서도 직접 캡처와 모델 재구성이 가능합니다.
이번 글에서는 iOS에서 Object Capture가 어떻게 작동하는지, 개발자가 앱에 통합하는 방법, 그리고 실제 스캔과 모델 재구성 과정에서 고려할 점을 살펴보겠습니다.
Object Capture란?
Object Capture는 사진 측량(Photogrammetry) 기술을 기반으로, 여러 장의 2D 이미지를 분석해 3D 모델을 생성하는 API입니다.
Mac에서의 Object Capture 경험을 iOS로 옮겨와, 개발자는 이제 모바일 환경에서 직접 캡처하고 모델을 만들 수 있게 되었습니다.
간단히 말해,
- 이미지 캡처: 물체를 다양한 각도에서 촬영
- 온디바이스 재구성: iOS 기기에서 3D 모델 생성
- 모델 사용: USDZ 포맷으로 앱에서 바로 활용 가능
기존에는 Mac에서만 가능한 작업이었지만, iOS용 API를 통해 이제 모바일 환경에서도 모든 과정을 수행할 수 있게 되었습니다. 개발자는 단 몇 분 만에 실제 물체를 3D 모델로 변환할 수 있고, 이를 AR, 게임, 이커머스 등 다양한 앱에서 활용할 수 있습니다.
LiDAR를 활용한 로우 텍스처 물체 스캔
Object Capture는 본래 충분한 텍스처 디테일을 가진 물체에서 최적의 성능을 발휘합니다. 하지만 이제는 아이폰이나 아이패드에 있는 LiDAR 센서를 활용해 텍스처가 부족한 물체도 재구성이 가능해졌습니다.
import ObjectCapture
let session = ObjectCaptureSession()
session.enableLiDAR = true // LiDAR 기반 스캔 활성화
예를 들어, 텍스처가 거의 없는 의자를 캡처할 때 RGB 사진만으로는 충분하지 않지만, LiDAR 포인트 클라우드를 결합하면 3D 형태를 보다 정확히 재현할 수 있습니다. 다만 투명하거나 반사되는 물체, 매우 얇은 구조의 물체는 여전히 스캔이 어렵다는 문제점이 있습니다.
Guided Capture
iOS용 Object Capture에서는 Guided Capture 기능을 제공합니다. 사용자가 물체 주변을 돌며 촬영하면, 시스템이 자동으로 최적의 이미지와 LiDAR 데이터를 수집하고 필요한 경우 피드백을 제공합니다.
session.startDetecting() // 바운딩 박스 감지 시작
session.startCapturing(to: captureDirectory) // 자동 캡처 시작
하지만 정밀한 스캔을 위해서 캡처 과정에서 주의해야 하는 부분들이 있습니다.
- 주변 조명을 일정하게 유지
- 카메라를 천천히 움직여 흐림 방지
- 물체가 카메라 프레임에 적절히 들어오도록 거리 유지
- 모든 각도에서 이미지 확보
이 과정을 통해 포인트 클라우드와 캡처 다이얼을 활용하여 어느 부분이 충분히 촬영되었는지 시각적으로 확인할 수 있습니다. 또한, 물체를 뒤집어 바닥면 등 숨은 면을 촬영할 수도 있습니다. 단, 물체 특성에 따라 뒤집기가 적합한 경우와 아닌 경우가 있으므로 주의해야 합니다.
iOS에서 Object Capture API 활용
- ObjectCaptureSession 생성
세션 상태를 유지하며 캡처 진행을 관리합니다. - ObjectCaptureView 사용
카메라 피드를 보여주고, 세션 상태에 따라 UI가 자동 변화합니다. - 캡처 상태 진행
startCapturing() 호출 후, 물체 주변을 돌며 이미지와 LiDAR 데이터를 수집합니다. 필요 시 새로운 스캔 패스를 시작(beginNewScanPass() 또는 beginNewScanPassAfterFlip())해 다양한 각도에서 이미지를 확보합니다. - 재구성
캡처가 완료되면 process() 함수를 통해 온디바이스 3D 모델 생성이 가능합니다. 모바일 환경에서는 디테일 레벨이 축소된 모델을 제공하며, 더 높은 품질이 필요하면 Mac에서 재구성할 수도 있습니다.
Object Capture 세션 상태 관리
iOS API는 세션 상태 기반으로 캡처 과정을 관리합니다.
if session.state == .ready {
session.startDetecting()
} else if session.state == .capturing {
session.startCapturing(to: captureDirectory)
} else if session.state == .completed {
session.process(to: modelURL, detailLevel: .medium)
}
준비 -> 감지 -> 캡처 -> 완료 -> 재구성 순서로 진행이 됩니다.
새로운 스캔 패스가 필요하면 아래처럼 코드를 작성할 수 있습니다.
session.beginNewScanPassAfterFlip() // 물체 뒤집기 후
session.beginNewScanPass() // 같은 방향에서 추가 스캔
재구성: 캡처한 이미지 -> 3D 모델
캡처가 완료되면 process()를 호출해 온디바이스에서 USDZ 모델을 생성할 수 있습니다.
let modelURL = captureDirectory.appendingPathComponent("ObjectModel.usdz")
let modelFile = try await session.process(to: modelURL, detailLevel: .medium)
print("3D 모델 생성 완료:", modelFile)
iOS에서는 모바일 최적화된 디테일 레벨 사용, Mac에서 재구성하면 포즈, 커스텀 디테일 등 고급 설정이 가능합니다.
포즈 출력(Poses): 각 이미지의 카메라 위치와 방향 추출
커스텀 디테일 레벨: 메시 데시메이션, 텍스처 해상도, 포함 맵 등을 개발자가 직접 선택 가능
이를 통해 모델의 품질과 재구성 속도를 세밀하게 제어할 수 있습니다.
또한, Mac에서의 Object Capture는 Reality Composer Pro와 통합되어 이미지 임포트, 디테일 레벨 선택 등도 가능합니다.
여기까지 :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > iOS' 카테고리의 다른 글
[iOS/CoreML] Core ML로 구현하는 온디바이스 AI (2) | 2025.05.11 |
---|---|
[iOS] CocoaPods 알아보기 (8) | 2024.08.13 |
[iOS] Live Activity 알아보기 (0) | 2024.08.09 |
[iOS] RESTful API 완벽 이해하기 (0) | 2024.07.22 |
[iOS] Core Data는 뭘까? (1) | 2024.05.24 |