【AR】ARkitを利用して現実世界に仮想オブジェクトを配置してみる

AR
スポンサーリンク

ARkitのテンプレートを使用して現実世界に仮想オブジェクトを配置してみたいと思います。

私はiphone開発エンジニアではないので、間違ったことを言っている場合があります。

予めご了承ください。

プロジェクトの準備

本記事では、ARkitが用意するテンプレートを利用してプロジェクトを作成します。

まずは、Augmented Reality Appを選択して「Next」ボタンを押下してください。

次に、Product Nameなどの必要項目を埋め、「Next」を押下してください。

本記事では開発言語はSwiftを使用し、フレームワークはSceneKitを使用します。

SceneKitはAR体験を簡単に表示するためのビュークラスを用意してくださるものです。

実機で表示

それではさっそく仮想オブジェクトを表示してみましょう。

USBケーブルを使用してiPhoneまたはiPadを端末に接続してください。

自分の端末がポップアップに表示されますので、選択し再生マークを押下してください。

以下の画像のように飛行機の仮想オブジェクトが表示されていれば成功です!

ソースコード

//
//  ViewController.swift
//  sampleAR1
//
//  Copyright © 2020 エンジニアの日記. All rights reserved.
//

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // Create a new scene
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
        
        // Set the scene to the view
        sceneView.scene = scene
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()

        // Run the view's session
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // Pause the view's session
        sceneView.session.pause()
    }

    // MARK: - ARSCNViewDelegate
    
/*
    // Override to create and configure nodes for anchors added to the view's session.
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        let node = SCNNode()
     
        return node
    }
*/
    
    func session(_ session: ARSession, didFailWithError error: Error) {
        // Present an error message to the user
        
    }
    
    func sessionWasInterrupted(_ session: ARSession) {
        // Inform the user that the session has been interrupted, for example, by presenting an overlay
        
    }
    
    func sessionInterruptionEnded(_ session: ARSession) {
        // Reset tracking and/or remove existing anchors if consistent tracking is required
        
    }
}

プロジェクトはいくつかのファイルで構成されていますが、

拡張現実を作り上げるプログラムが記述されている場所はViewController.swiftになります。

仮想オブジェクトを空間上に配置させるには、仮想オブジェクトを配置させる領域が必要になります。この領域を構築するのがARSCHViewになり、まずはそのクラスのインスタンスをsceneViewとして定義します。

そのうえでデバイスのスクリーンとインスタンスを紐づけるために@IBOutletとして宣言します。

@IBOutlet で宣言するとStoryboard と紐づけられます。

 @IBOutlet var sceneView: ARSCNView!

次に、viewDidLoadメソッドの中を見ていきます。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // Create a new scene
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
        
        // Set the scene to the view
        sceneView.scene = scene
    }

まずは、sceneViewのデリゲート問合せ先をselfにしています。

次に、1秒あたりのフレーム数(ftp)などの統計情報を画面に表示させる設定をしてます。

次に、拡張現実シーンを表示させるための設定を行っています。

最後に拡張現実シーンをsceneViewに配置してます。

viewDidLoadメソッド 終わり。

次に、viewDidLoadメソッドの中を見ていきます。

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()

        // Run the view's session
        sceneView.session.run(configuration)
    }

デバイスが移動したり傾いたりした際に仮想オブジェクトがその場にとどまるように錯覚させる必要があります。

そのためにデバイスの動きを追跡する必要があり、その追跡を有効にする設定を行います。

そのうえで拡張現実処理を実行開始させます。

以上が仮想オブジェクトを仮想空間上に配置するまでの動きになります。

AR
スポンサーリンク
エンジニアの日記

コメント