nyancoder

WWDC 2021 - Create 3D models with Object Capture 본문

WWDC/WWDC 2021

WWDC 2021 - Create 3D models with Object Capture

nyancoder 2021. 7. 14. 02:54

원본 영상: https://developer.apple.com/videos/play/wwdc2021/10076/

 

Object Capture

  • 원하는 물체를 3D 모델로 만들어 내기 위해서 우선 모든 각도에서 대상의 사진을 촬영해야 합니다.
  • 촬영된 결과물을 새로운 Object Capture API를 지원하는 Mac에 복사합니다.
  • "photogrammetry"라고 불리는 기술을 사용해서 몇 분 만에 2D 이미지 들을 3D 모델로 변경할 수 있습니다.
  • 출력된 결과에는 기하학적 구조를 담당하는 메시와 다양한 material map들이 포함되어 있으며 앱에 넣거나 AR Quick Look에서 바로 결과를 확인할 수 있습니다.

  • 위의 단계들을 좀 더 세분화하여 살펴보자면 사진 촬영 단계에서는 다양한 방법으로 사진을 촬영할 수 있습니다.
  • iPhone, iPad, DSLR, Drone 등을 사용해서 대상이 되는 물체의 모든 각도의 선명한 사진을 촬영합니다.
  • 스테레오 깊이 데이터를 지원하는 iPhone 또는 iPad에서 촬영하는 경우 실제 물체의 크기와 중력 벡터를 얻을 수 있기 때문에 모델이 자동으로 올바른 방향과 크기로 만들어질 수 있습니다.

  • 촬영이 끝난 이미지는 최신 Mac으로 복사되어야 합니다.
  • Intel Mac에서도 지원될 수 있지만 Apple Neural Engine을 사용할 수 있는 Apple Silicon Mac에서 최상의 성능을 보여줄 수 있습니다.
  • Command line에서 실행해 볼 수 있는 앱인 HelloPhotogrammetry를 사용해서 코드를 작성하기 전에 모델을 구성해볼 수 있습니다.

  • 작업이 끝나면 USDZ 출력 모델을 바로 확인할 수 있습니다.
  • 4가지 단계의 모델을 제공할 수 있으며 Reduced, Medium, Full의 경우에는 즉시 사용할 수 있는 모델입니다.
  • Raw단계의 모델은 사용자가 임의의 작업을 수행하기 위한 모델입니다.
  • Medium 세부 수준을 선택하면 iPhone이나 iPad의 AR Quick Look에서 확인할 수 있습니다.

  • 위의 이미지는 거의 사진처럼 생긴 이미지이지만 실제로는 3D 캡처를 통해서 만든 모델들을 적절히 배치한 이미지입니다.

  • 이처럼 Object Capture는 단순 AR 앱뿐만 아니라 다양한 영화 같은 이미지들을 만드는 데에도 사용할 수 있습니다.

 

Getting started

  • 작업을 시작하기 위해서는 대상 물체의 이미지들을 설정하는 작업과 그 이후의 모델을 생성하는 두 가지 과정이 필요합니다.

  • 초기의 설정 단계는 세션을 생성하는 작업과 출력에 세션을 연결하는 두 가지 과정이 있습니다.
  • 우선 첫 번째로 해야 하는 일은 PhotogrammetrySession을 생성하는 일입니다.

  • PhotogrammetrySession는 제어에 사용할 최상위 클래스입니다.
  • 이 세션은 입력 이미지 세트가 들어있는 보관소로 생각할 수 있습니다.

  • HEIC, JPG, PNG 이미지들이 들어있는 디렉터리에 대한 URL을 이용하여 이미지를 지정할 수 있습니다.
  • 또는 PhotogrammetrySample를 통해 직접 이미지를 넣어줄 수 있습니다.
  • PhotogrammetrySample에는 이미지뿐만 아니라 깊이, 중력, 메타정보, 세그멘테이션 마스크를 넣을 수 있습니다.

  • 세션의 구성이 끝나면 requests를 통해 모델을 구성할 수 있습니다.
  • 이 과정이 끝나면 결과 모델과 에러를 포함한 상태 메시지를 얻을 수 있습니다.

  • RealityKit에 있는 PhotogrammetrySession을 생성해야 합니다.
  • 이때 입력으로 이미지들이 들어있는 폴더의 URL을 제공합니다.
  • 적절한 설정을 제공하거나 PhotogrammetrySession.Configuration()을 통해 기본 설정을 사용할 수 있습니다.

  • 세션에서 메시지 스트림을 연결한 다음 모델을 요청할 때에는 올해의 새 Swift기능인 AsyncSequence를 사용하여 출력 스트림을 제공합니다.
  • 출력 스트림에는 수행 결과, 진행률 업데이트와 같은 상태 정보, 오류 정보가 포함됩니다.

  • process()를 호출하면 비동기로 메시지를 전달하기 시작하며, 세션이 해제되거나 치명적인 오류가 발생할 때까지 업데이트됩니다.

  • 받을 출력 메시지에는 주기적인 주기적인 requestProgress를 통해 진행률을 얻을 수 있습니다.
  • 처리가 완료되면 requestComplete메시지를 통해 결과 모델과 Bounds를 얻을 수 있습니다.
  • 처리가 실패하면 requestError를 받을 수 있습니다.
  • 대기 중인 모든 요청이 처리되면 processingComplete를 받을 수 있습니다.

  • 위의 메시지를 처리하는 코드에서는 for try await를 통해서 비동기로 메시지를 수신합니다.
  • 나머지는 위의 설명에서 나온 각 상황에서 발생하는 이벤트들을 처리하는 switch - case로 구성할 수 있습니다.

  • 세션의 결과로 받을 수 있는 데이터 형식은 3가지 Model File, ModelEntity, BoudningBox의 3가지가 있습니다.

  • Model File의 USDZ파일을 얻는 것은 가장 일반적이며 기본 워크플로에서 사용할 것입니다.
  • Model File의 폴더는 보다 복잡한 후처리나 세부 정보가 필요한 경우 요청하면 USDA, OBJ, Texture, Material 등의 모든 참조 데이터를 해당 폴더에 저장합니다.

  • ModelEntity 요청은 세부 정보를 제공하며 추가적으로 Geometry 정보를 얻을 수 있습니다.
  • BoudingBox는 예상되는 물체의 크기를 나타내는 BoundingBox를 제공합니다.

  • 출력물의 세부 출력 레벨에서 Preview 레벨은 대화형 워크플로우에서 사용되기 위한 것으로 시각적 품질은 매우 낮지만 가장 빠르게 생성됩니다.
  • Reduced, Medium, Full 순서대로 출력물의 크기와 품질이 상승합니다.
  • Raw단계는 후처리에 사용하기 위한 레벨입니다.

  • 한 번에 두 개 이상의 레벨의 모델을 요청할 수 있으며, 이는 각각의 모델을 순서대로 요청하는 것보다 더 빠르게 처리됩니다.

  • 이 단계가 끝나면 결과 USDZ 파일을 바로 열어서 모든 각도에서 3D로 결과물을 확인할 수 있습니다.

  • 대화형 워크플로우를 통해서 동일한 작업을 수행할 수 있으며 최종 결과를 만들기 전에 미리보기를 통해 결과물을 보면서 설정을 할 수 있습니다.
  • Setup과 Process단계는 이전과 동일하며 중간의 Iterate 단계가 추가되어 미리보기를 보면서 설정을 수정하는 단계가 추가됩니다.
  • 이 과정에서 모델의 크기를 변경하거나 촬영할 때 받침대와 같이 추가된 불필요한 요소를 제거할 수 있습니다.

  • 이 단계를 수행하려면 먼저 대상의 이미지가 들어있는 입력 파일 폴더와 결과물이 저장된 출력 폴더를 선택하면 미리보기가 표시됩니다.
  • 주위를 감싸고 있는 경계 상자의 크기를 조절해 원하지 않는 부분을 제거하고 Refine Preview버튼을 눌러 새 결과물을 확인합니다.

  • 결과가 마음에 들면 품질 레벨을 선택한 다음 Create Model버튼을 눌러 결과를 저장합니다.

  • 이처럼 입력 파일로부터 세션을 생성하고 이를 출력에 연결한 다음 원하는 수준의 세부 레벨의 모델로 저장할 수 있습니다.
  • 원하는 경우 미리보기를 보면서 적절히 편집할 수 있습니다.

Best Practice

  • 3D 모델에 사용될 적절한 물체를 고르는 방법과, 이미지를 촬영하는 방법, Capture Sample App을 사용하는 법, 적절한 출력을 선택하는 방법에 대해 알아볼 것입니다.

  • 좋은 결과를 얻으려면 적절한 표면의 디테일을 가진 물체를 선택하는 것이 좋습니다.
  • 표면의 반사율이 높거나 투명한 재질은 피하는 것이 좋습니다.
  • 꼭 반사율이 높은 물체를 사용해야 한다면 스캔할 때 조명을 분산시키는 것이 좋습니다.
  • 물체를 뒤집어야 하는 경우 변형이 일어나지 않을 정도로 단단한 물체가 좋습니다.
  • 표면이 미세한 디테일을 가진 경우 고해상도 카메라를 사용해야 합니다.

  • 촬영 단계에서는 깔끔한 배경에서 촬영하여 물체가 잘 눈에 띄도록 촬영해야 합니다.
  • 가능한 모든 각도에서 촬영해야 하며 물체를 뒤집어서도 촬영해야 합니다.
  • 물체를 가까이에서 촬영하거나 최대한 촬영된 결과들이 겹치는 장면이 많도록 해야 합니다.
  • 물체에 따라 20-200장 정도의 사진이면 적당합니다.

  • 예제로 제공되는 CaptureSample앱은 고품질 사진 촬영과 깊이 및 중력 정보를 포함하게 되어 있으므로 이 앱을 통해서 사진을 찍는 것이 좋은 방법일 수 있습니다.
  • 이 앱은 디바이스의 듀얼 카메라를 이용해서 깊이 정보를 HEIC파일에 저장합니다.

  • 턴 테이블과 같이 지속적으로 천천히 회전하는 테이블 위에 물체를 놓고 타이머 촬영을 하는 것이 좋습니다.
  • 조명은 적절히 밝고 균일하며 짙은 그림자가 없는 상태로 유지하고 물체와 받침 이외에는 아무것도 없는 것을 볼 수 있습니다.

  • 이렇게 촬영한 결과의 USDZ 파일의 예제입니다.

  • 위의 표는 각각의 출력 레벨에서 지원하는 사용처와 포함하는 리소스의 양을 보여줍니다.

  • 출력 레벨에서 Reduced 및 Medium은 AR Quick Look과 같은 웹 기반 모바일 사용에 최적화되어 있습니다.
  • 하나의 결과물을 보여줄 때는 Medium이 적절하지만 한 번에 많은 결과물을 보여주기 위해서는 Reduced가 적절합니다.
  • 두 레벨 모두 Diffuse, Normal, Ambient occlusion을 포함합니다.

  • Full, Raw는 컴퓨터 게임 또는 후처리를 위한 가장 높은 세부 정보를 필요로 하는 고급 사용을 위한 것입니다.
  • Diffuse, Normal, Ambient Occlusion, Roughness, Displacement를 포함합니다.

  • 후처리가 필요하거나 Material의 베이킹이 필요 없는 경우는 raw레벨을 사용할 수 있습니다.
  • 최대 해상도의 여러 텍스쳐들을 결과로 얻을 수 있습니다.

 

목차: https://nyancoder.tistory.com/2

Comments