이 페이지는 공식 문서를 번역한 글입니다!
오역이 있거나 잘못된 정보는 댓글을 통해 알려주시면 너무너무 감사하겠습니다!
ARKit이란?
카메라에서 2D나 3D의 요소를 실제 세계에 있는 것처럼 볼 수 있게 합니다.
ARKit은 그런 요소들을 쉽게 표현할 수 있게 다양한 AR 기술을 지원한다고 합니다.
ARKit 요구사항
- 앱이 AR을 기본 기능을 요구할 경우(후면 카메라 사용 시) : 해당 UIRequiredDeviceCapabilities 키를 앱의 Info.plist item에 추가 해야 합니다. 이 키를 사용할 시 ARKit 호환 장치에서만 앱을 사용할 수 있습니다. (ARKit으로 프로젝트 생성시 자동 추가)
- AR이 앱의 부가기능일 때 : isSupported 메소드를 이용하여 해당 기기가 AR 구성을 지원하는지 확인해줍니다.
- 앱이 face-tracking AR을 사용 시 : Face-tracking은 TrueDepth 카메라가 필요합니다. 따라서 ARFaceTrackingConfiguration.isSupported .메소드를 이용하여 해당기기가 구성을 지원하는지 확인해야합니다.
- ARKit은 사용자의 카메라혹은 마이크를 사용하기 때문에 Info.plist를 추가해주어야합니다.
- Face-tracking을 사용시 앱에서는 데이터를 사용하는 방법을 설명하는 개인 정보 보호 정책이 포함 되어야합니다(Apple Developer Program License Agreement)
후면 카메라에서의 AR
- 사용자가 있는 곳을 추적하고 가상 콘텐츠를 배치할 수 있는 좌표 공간을 일치시킵니다.
- 사용자 환경의 사물과 이미지를 인식하고, 실제 조명을 대응시켜 더 몰입감있는 기능을 제공합니다.
전면 카메라에서의 AR
- TrueDepth 카메라가 있는 기기의 경우 ARFaceTrackingConfiguration 을 사용하여 전면 카메라를 증강시키면서 얼굴의 포즈와 표정을 실시간으로 추적할 수 있습니다.
ARSession Life Cycle 관리 및 Tracking Quality
세션이 실행되고 나면 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
.
'iOS' 카테고리의 다른 글
♻️ 네트워킹 Singleton Pattern 적용기 (0) | 2023.03.13 |
---|---|
음악 재검색 후 기록 저장시 앱 다운 버그 수정 일지 (0) | 2022.11.07 |
AVCapture Session (0) | 2022.10.17 |
iOS ARKit LiDAR 에 대해 (0) | 2022.09.27 |
Pencil Kit (iPadOS) - 기초편 (0) | 2022.09.21 |