ARKit 기초 요약 - 평면 검출 및 3D 객체 배치

7623 단어 SwiftARKit

ARKit 기초



2018년도 앞으로 1시간 만에 종료입니다.
올해는, AR의 데모 앱을 몇개 만들거나 했습니다만, AppStore에 낼 정도의 앱이 아직 개발되어 있지 않은 것이 마음 남아 있습니다.

내년이야말로, ARKit를 잘 다루고 싶습니다만, UIKit만큼 아직 친해지지 않은 느낌이 들기 때문에, 이제 ARKit의 기본적인 사용법이나 작법을 정리해 복습해 갑니다.

평면을 감지하고 3D 객체를 놓습니다.



데모에서 제일 잘 보는 평면 검출해, 3D 오브젝트를 두는 녀석.

최소한의 코드로 평면 검출 + 3D 객체 배치를 구현하려면 다음과 같은 흐름이 있습니다.
  • ARSCNView 설정 (수평면을 감지하는 설정)
  • 3D 오브젝트 캡처를위한 메소드 준비 (이번에는 dae 파일)
  • ARSCNViewDelegate 메서드에서 3D 객체 배치

  • ARSCNView 설정



    ViewController.swift
    class ViewController: UIViewController {
    
        @IBOutlet var sceneView: ARSCNView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Set the view's delegate
            sceneView.delegate = self
    
            // fps情報などを表示
            sceneView.showsStatistics = true
    
            // デバッグ用に特徴点を表示
            sceneView.debugOptions = ARSCNDebugOptions.showFeaturePoints
    
            //Viewに初期化したsceneをセット
            sceneView.scene = SCNScene()
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            // Sessionの設定
            let configuration = ARWorldTrackingConfiguration()
    
            // .horizontalで水平面 (.verticalだと垂直面を検知)
            configuration.planeDetection = .horizontal
    
            //空間から光の情報を取得し画面上のライトの情報に適応
            configuration.isLightEstimationEnabled = true
    
            // sessionをスタート
            sceneView.session.run(configuration)
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
    
            // sessionをストップ
            sceneView.session.pause()
        }
    
    

    3D 객체 캡처를 위한 메서드



    dae 형식의 파일을 캡처
    여기 3D 모델을 이용하였습니다.
    Beer bottle

    ViewController.swift
        func load3dObject() -> SCNNode {
            let url = Bundle.main.url(forResource: "3d.scnassets/bottle", withExtension: "dae")!
            let sceneSource = SCNSceneSource(url: url, options: nil)!
            let virtualObjectNode
                = sceneSource.entryWithIdentifier("bottle", withClass: SCNNode.self)!
            return virtualObjectNode
        }
    

    ARSCNViewDelegate 메서드로 배치



    평면을 새롭게 검지했을 때에, 불리는 renderer(_:didAdd:for:)로 검지한 Node에 3D 오브젝트의 Node를 추가

    ViewController.swift
        func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
            node.addChildNode(load3dObject())
        }
    

    결과



    섀도우나 라이트를 조정하지 않으면 별로 리얼리티가 나오지 않네요.
    그리고 특징량이 적은 새하얀 바닥은 잘 검출할 수 없습니다.
    앱화할 때는, 인스트럭션을 잘 만들지 않으면 유저에게 스트레스를 주어 버릴 것 같습니다.

    좋은 웹페이지 즐겨찾기