본문 바로가기
iOS

ARKit 과 SceneKit 기초!

by 융식 2022. 11. 1.

이 페이지는 공식 문서를 번역한 글입니다!

오역이 있거나 잘못된 정보는 댓글을 통해 알려주시면 너무너무 감사하겠습니다!

 

ARKit이란? 

카메라에서 2D나 3D의 요소를 실제 세계에 있는 것처럼 볼 수 있게 합니다. 

ARKit은 그런 요소들을 쉽게 표현할 수 있게 다양한 AR 기술을 지원한다고 합니다. 

 

ARKit 요구사항

  1. 앱이 AR을 기본 기능을 요구할 경우(후면 카메라 사용 시) : 해당 UIRequiredDeviceCapabilities 키를 앱의 Info.plist item에 추가 해야 합니다. 이 키를 사용할 시 ARKit 호환 장치에서만 앱을 사용할 수 있습니다. (ARKit으로 프로젝트 생성시 자동 추가)
  2. AR이 앱의 부가기능일 때 : isSupported 메소드를 이용하여 해당 기기가 AR 구성을 지원하는지 확인해줍니다.
  3. 앱이 face-tracking AR을 사용 시 : Face-tracking은 TrueDepth 카메라가 필요합니다. 따라서 ARFaceTrackingConfiguration.isSupported .메소드를 이용하여 해당기기가 구성을 지원하는지 확인해야합니다.
  4. ARKit은 사용자의 카메라혹은 마이크를 사용하기 때문에 Info.plist를 추가해주어야합니다.
  5. Face-tracking을 사용시 앱에서는 데이터를 사용하는 방법을 설명하는 개인 정보 보호 정책이 포함 되어야합니다(Apple Developer Program License Agreement)

후면 카메라에서의 AR

  • 사용자가 있는 곳을 추적하고 가상 콘텐츠를 배치할 수 있는 좌표 공간을 일치시킵니다.
  • 사용자 환경의 사물과 이미지를 인식하고, 실제 조명을 대응시켜 더 몰입감있는 기능을 제공합니다.

전면 카메라에서의 AR

  • TrueDepth 카메라가 있는 기기의 경우 ARFaceTrackingConfiguration 을 사용하여 전면 카메라를 증강시키면서 얼굴의 포즈와 표정을 실시간으로 추적할 수 있습니다.

 

 

ARSession Life Cycle 관리 및 Tracking Quality

ARSession을 실행할 때

세션이 실행되고 나면 ARKit은 몇 프레임 후 ARCamera.TrackingState.limited(_:) 상태가 됩니다.

장치를 사용할 수는 있지만 정확성이 불확실한 상태입니다.

이 상태는 여전히 ARCamera.TrackingState.Reason.initializing(준비) 상태입니다.

 

 

사용자 환경 번화로 인해 발생하는 상태 변화

정상적으로 실행중이다가 기기의 환경변화나 다른 상호작용이 일어나면 ARCamera.TrackingState.limited(_:) 상태로 넘어가게됩니다. 

  • 평면 감지가 평면 anchor를 추가하거나 업데이트하지 않습니다.
  • Hit- testing 결과를 제공하지 않습니다. (Hit-test 실제 세계의 물체를 찾거나 AR anchors를 찾는 메소드)

ARCamera.TrackingState.Reason 는 상태를 파악해서 nomal인지 limited인지 판별합니다.

 

ARKit은 ARSession이 없으면 추적할 수 없습니다. (인터럽트 발생한 경우. ex) 다른 앱을 실행시킨 경우)

세션이 중단되는 경우 해당 세션의 가상 콘텐츠는 실제 환경에 비해 부적절할 수 있습니다.

중단된 세션을 복구하기 위해서는 sessionShouldAttemptRelocalization(_:) 메소드를 이용합니다.

해당 메소드가 true일 때 멈추기 전의 환경을 현재 데이터와 조정할 수 있습니다. 

만약 false라면 ARKit이 relocalization하지 않고 세션을 재시작합니다.

이 과정이 진행중 일 때는 limited상태이고, 성공적으로 트래킹 상태는 nomal로 변경됩니다.

 

만약 카메라 환경이 완전히 바뀐 경우에는 계속 relocalizing하므로 계속 limitied 상태에 있게 됩니다.

따라서 run(_:options:)메소드와 resetTracking메소드를 이용하여 재시작하라고 알려야합니다.

 

Scene Kit

AR 환경에 사실적인 3차원 객체를 추가하기위해 Scene Kit을 사용합니다.

 

 

Box Scene 만들기

 

 

ARKit 프로젝트 생성

 

 override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // 상자 생성
        let cube = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.01)
        
        // 상자 색상 조정
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.red
        
        cube.materials = [material]

	// 상자 위치 조정
        let node = SCNNode()
        node.position = SCNVector3(0, 0.1, -0.5)
        node.geometry = cube
        
        sceneView.scene.rootNode.addChildNode(node)
        
        // 조명 효과
        sceneView.autoenablesDefaultLighting = true
   
    }

 

참고자료 : 

https://developer.apple.com/documentation/arkit/choosing_which_camera_feed_to_augment

https://developer.apple.com/documentation/arkit/managing_session_life_cycle_and_tracking_quality

https://developer.apple.com/documentation/scenekit/organizing_a_scene_with_nodes

.