Mac Plus

Hello Swift

ARKit

  • 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

  1. 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에 알려준다.

이렇게 글만 적어놓으면 잘 모르기 때문에 간단하게 보고 코드를 이용하여 더 자세하게 살펴보는게 좋겠다.