ARKit 데모: 증강 현실 영화 제작
게시 됨: 2022-03-11AR과 VR은 주류가 되고 있으며 모든 주요 하이테크 기업들이 이를 추구하고 있습니다. Apple에는 ARKit이 있고 Google에는 ARCore가 있고 Microsoft에는 자체 HoloLens가 있습니다(물론 Unity도 있습니다). 그리고 대중의 많은 관심을 받는 몇 가지 응용 프로그램과 함께 증강 현실 앱 개발은 모바일 개발자에게 매우 바람직한 기술이 되고 있습니다.
이 기사에서는 단순히 회전하는 큐브 이상을 수행하는 간단하지만 의미 있는 작은 앱을 보여드리고자 합니다. 어쨌든 회전하는 큐브가 필요한 사람은 누구입니까? 매트릭스를 만들어 봅시다.
ARKit 소개
ARKit은 iOS 기기용 AR 앱을 만들기 위한 Apple 프레임워크입니다. 2D 개체용 SpriteKit, 3D용 SceneKit, 사용자 지정 렌더러를 구현하려는 경우 Metal 등 여러 렌더러를 함께 사용할 수 있습니다.
이 데모에서는 SceneKit을 사용하여 완전히 렌더링된 3D 개체(칼)를 렌더링하고 배치합니다.
ARKit v2부터 ARKit에서는 5가지 유형의 구성이 지원됩니다.
AROrientationTrackingConfiguration – 장치의 방향만 추적하려는 경우(예: 별자리 응용 프로그램의 경우). 이 구성을 사용하면 사이드 스테핑과 같은 물리적 움직임이 추적되지 않으며 장면에서 개체의 위치나 방향에 영향을 미치지 않습니다.
ARWorldTrackingConfiguration – 이것은 대부분의 사람들이 증강 현실로 간주하는 것을 지원하기 때문에 아마도 AR에 가장 자주 사용되는 구성일 것입니다. 예로는 가상 애완 동물 또는 포켓몬 사냥 응용 프로그램이 있습니다.
ARFaceTrackingConfiguration – 이 구성은 TrueDepth 카메라(Face ID와 같은)가 필요하기 때문에 현재 iPhone X에서만 지원됩니다. 이 구성은 얼굴의 특징을 추적하고 중립적인 표정에서 상대적 오프셋을 추적합니다(예: 사용자가 선글라스를 주문하기 전에 패션 선글라스를 사용해 볼 수 있는 애플리케이션).
ARImageTrackingConfiguration – 마커 세트가 있고 마커에서 동물이 점프하는 것을 보여주고 싶다면 이 구성이 적합합니다. 카드와 같은 마커일 필요는 없지만 2D 그림이면 됩니다. 카메라를 모나리자를 향하게 하면 그녀가 고개를 돌리고 당신에게 무언가 말을 할 것입니다. 단점은 이미지 마커의 물리적 크기를 미리 말해야 한다는 것입니다.
ARObjectScanningConfiguration – 이 구성은 ARImageTrackingConfiguration의 3D 버전입니다.
이 데모에서는 장면에 칼과 총알을 추가하고 6개의 자유도를 원하므로 적절한 도구는 ARWorldTrackingConfiguration입니다.
앱 개념
매트릭스를 본 사람이라면 누구나 네오(키아누 리브스)가 총알을 피하고 공중에서 막는 것을 기억할 것입니다. 우리의 응용 프로그램은 라이브 카메라 피드에서 이 장면을 재현하는 데 도움이 될 것입니다. 따라서 Neo와 같은 힘을 보여주는 맞춤형 비디오를 만들 수 있습니다.
우리 앱에는 총알과 칼의 3D 모델이 있습니다. 영화에서 얼마나 많은 총알이나 칼을 원하는지는 사용자에게 달려 있습니다. 시간을 할애하여 다른 모델을 추가하고 싶다면 앱 코드가 공개 소스이며 GitHub(https://github.com/altaibayar/toptal_ar_video_maker)에서 사용할 수 있습니다. 이것은 완전한 AR 튜토리얼은 아니지만 iOS에서 AR 앱 개발을 시작하려는 경우 데모와 소스가 귀중한 리소스가 될 것입니다.
의도된 사용 사례 시나리오는 다음과 같습니다.
- 친구에게 네오로 분장하게 하십시오(응용 프로그램의 기능에 꼭 필요한 것은 아니지만 이 작업을 수행하는 동안 좋아 보일 수 있음).
- "Neo"에게 당신에게서 약 10미터(30ish 피트) 떨어진 곳에 서도록 요청하십시오.
- 응용 프로그램을 시작하고 접지면을 스캔합니다.
- "네오"에서 날아오는 총알과 칼을 추가하십시오.
- "Neo"가 총알을 피하거나 막는 멋진 동작을 수행하는 동안 녹화 버튼을 길게 눌러 비디오를 녹화하세요.
- 녹화 버튼에서 손을 떼고 비디오를 라이브러리에 저장합니다.
앱 빌드
앞에서 언급했듯이 장면의 360도를 모두 기록하면서 자유롭게 움직일 수 있고 총알과 칼이 카메라 움직임을 적절하게 추적할 수 있기를 원합니다.
시연을 위해 칼과 샷건 총알의 두 가지 유형의 가상 개체만 사용합니다.
칼은 세부적인 개체이며 https://poly.google.com/view/3TnnfzKfHrq의 무료 모델을 사용할 것입니다(Andrew에게 감사합니다).
그러나 산탄총 총알은 단순한 구형 물체이므로 간단히 코딩할 수 있습니다. 다양하게 사용할 수 있도록 금속성 및 뜨겁게 만들 것입니다. 우리는 샷건을 에뮬레이트하고 있으므로 그룹화된 클러스터로도 생성합니다. 너무 많은 번거로움 없이 클러스터링을 의미 있게 만들기 위해 GamplayKit의 가우스 난수 생성기를 사용할 수 있습니다.

GameplayKit은 무작위 노이즈 생성, 상태 머신, AI 또는 확률 기반 의사 결정이 필요할 때마다 편리하게 사용할 수 있는 유용한 도구입니다.
override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }
칼에 대해서도 유사한 임의 오프셋 논리를 사용할 수 있지만 클러스터로 동작하지 않기 때문에 간단한 임의 분포를 사용할 수 있습니다.
앱 아키텍처
어떤 아키텍처 패러다임이 가장 좋은지 논의하는 것은 이 데모의 범위를 벗어납니다. 그 주제를 다룬 많은 기사가 있습니다.
대신, 연결된 GitHub 프로젝트를 탐색하는 방법을 찾기 위한 가이드로 프로젝트의 구조를 배치하겠습니다. 주요 구성 요소가 무엇인지, 어떻게 연결되어 있는지, 왜 선택했는지 등입니다.
애플리케이션에는 세 개의 화면만 있습니다.
PermissionViewController – 사용자에게 필요한 모바일 기능에 대한 애플리케이션 액세스 권한을 부여하도록 요청하는 화면입니다.
- 카메라 – 분명히
- 갤러리 – 녹화된 비디오 및 마이크 입력을 저장하려면
- 마이크 – 비디오를 만드는 데 사용 중인 라이브러리에서 권한이 필요합니다(기본적으로 마이크의 사운드는 오디오 트랙의 소스로 사용됨).
ExportViewController – 이 화면은 녹화된 비디오를 보여주고 비디오를 공유하거나 저장할 수 있는 옵션을 제공합니다.
MainViewController – 모든 마법이 여기에서 발생합니다.
내 경험에 따르면 ARSession, ARConfiguration 및 모든 고유한 유형의 SCNNode와 같은 필요한 모든 ARKit 클래스를 래핑하는 것이 가장 좋습니다. 그렇게 하면 코드가 자명합니다.
ARSession은 ToptalARSession으로 상속되며 새 세션 클래스에는 필요한 모든 것을 설정하는 클래스 생성자와 resetTracking 및 pauseTracking 메서드의 세 가지 메서드만 있습니다.
애플리케이션은 4가지 고유한 유형의 SCNNode를 인식합니다.
- KnifeNode – 칼 3D 개체를 나타내며 3D 칼을 형상으로 자동 로드합니다.
BulletsNode – 이 노드는 샷건 쉘 세트를 나타냅니다. 랜덤 가우시안 노이즈, 색상 및 물리적 조명 모드가 자동으로 설정됩니다.
KnifeNode 또는 BulletsNode를 사용하는 클래스에서는 특별한 작업이나 추가 작업이 필요하지 않으며, 응용 프로그램을 사용자 지정하기 위한 템플릿으로 사용하여 더 많은 종류의 3D 개체를 추가할 수 있습니다.
- ReticleNode – 바닥 위의 장면에 나타나는 3D 모델을 래핑하여 칼이나 총알이 추가될 위치를 보여줍니다.
- DirectionalLightNode – 아래를 가리키는 수직 조명을 나타내는 노드입니다.
참조 및 크레딧
칼 모델: https://poly.google.com/view/3TnnfzKfHrq
SCNScene에서 녹화: https://github.com/svtek/SceneKitVideoRecorder
버튼 아이콘, ARKit 데모 애플리케이션: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality