- 2년전에 https://github.com/kocensd/testAR에 .usdz 파일을 올리고 테스트를 해본적이 있지만 더 자세하게 알고 싶어져서 ARKit을 공부해보려고 함
- 기본적으로 apple Document와 샘플코드를 작성하면서 내용을 정리할 예정임
ARKit
- iOS기기의 카메라 및 모션기능을 통합하여 앱에서 증강현실을 경험하게 해준다.
요소
- Choosing Which Camera Feed to Augment (전면카메라 / 후면카메라) ARKit3부터는 전면/후면 카메라에서 데이터를 얻을 수 있지만 사용자에게는 하나를 선택하여 표시해야한다.
1) ARWorldTrackingConfiguration - 현재 장소를 추적하여 가상의 콘텐츠를 배치할수있다. 다른환경의 물체를 인식하거나 이미지를 인식하게 할 수 있다.. ex) 장소에 추가, 이미지트레킹 등 let configuration = ARWorldTrackingConfiguration() sceneView.session.run(configuration)
2) ARFaceTrackingConfiguration - 전면카메라를 이용하여 얼굴의 포즈와 표정을 추적한다. ex) 얼굴에 이모티콘 넣기 등 let configuration = ARFaceTrackingConfiguration() sceneView.session.run(configuration)
– 주요 클래스 3가지 (ARSession, ARConfiguration, ARAnchor)가 있는데 오늘은 ARSession
- ARSession
- 장치의 모션감지
- 하드웨어에서의 데이터 읽기
- 내장카메라 제어
- 캡쳐된 이미지에 대한 분석 등 모든 결과를 종합하여 AR콘텐츠를 모델링하는 가상공간 사이에 대응관계를 설정한다.
== 세션 1.1) 세션구성 ex) let session = ARSession() session.delegate = self
-> ARSCNView || ARSKView 중 하나를 사용하면 세션객체를 자동으로 생성해주기때문에 session을 가지고 오기만 하면 된다. @IBOutlet var sceneView: ARSCNView! let session = sceneView.session
1.2) 세션실행 func run(ARConfiguration, options: ARSession.RunOptions)
후면카메라를사용할지, 전면카메라를 사용할지 구성하여 세션을 실행시켜준다. let configuration = ARWorldTrackingConfiguration() let configuration = ARFaceTrackingConfiguration()
sceneView.session.run(configuration)
1.3) 세션중지 sceneView.session.pause()
== 이벤트 응답 2.1) delegate 캡쳐한 비디오 이미지 및 추적정보를 받거나 세션 상태의 변화에 응답하는 delegate ARSCNView || ARSKView를 사용하면 -> ARSCNViewDelegate || ARSKViewDelegate 이렇게 사용하면된다.
ARSCNViewDelegate를 알아보자
- func renderer(SCNSceneRenderer, nodeFor: ARAnchor) -> SCNNode? 새로 추가된 앵커에 해당하는 sceneKit노드를 제공하도록 요청
- func renderer(SCNSceneRenderer, didAdd: SCNNode, for: ARAnchor) 새 AR앵커에 해당하는 노드가 장면에 추가됨
- func renderer(SCNSceneRenderer, willUpdate: SCNNode, for: ARAnchor) 현재 상태와 일치하도록 업데이트됨을 알려준다.
- func renderer(SCNSceneRenderer, didUpdate: SCNNode, for: ARAnchor) 현재 상태와 일치하도록 업데이트 된것을 알려준다.
-
func renderer(SCNSceneRenderer, didRemove: SCNNode, for: ARAnchor) 노드가 장면에서 제거된것을 알려준다.
- nodeFor에서 노드를 추가해주고 변경이 되는 노드가 있을때는 상황에 맞게 willUpdate, didUpdate에 알려준다.
이렇게 글만 적어놓으면 잘 모르기 때문에 간단하게 보고 코드를 이용하여 더 자세하게 살펴보는게 좋겠다.