rksoftware

Visual Studio とか C# とかが好きです

Xamarin iOS で ARKit を使う最初のシンプルなサンプルの説明

先日 Xamarin.iOS で ARKit を試し始めた話を書きました。 試し中のコード スクリーンショット

上記の記事では試し始めましたという話だけだったので、今日はコードを見てみたいと思います。

■ コード

/// <summary>
/// 空間にモデルを置くだけのシンプルなサンプル
/// </summary>
public class SimpleCode : CodeBase
{
    /// <summary>
    /// ARSCNView の参照を取得または設定します
    /// </summary>
    /// <value>The arscn view.</value>
    ARSCNView _arscnView { get; set; }

    /// <summary>
    /// 初期化処理を行います
    /// </summary>
    public override void ViewDidLoad()
    {
        // ARSCNView のインスタンスを生成し画面にセット、レイアウトを指定します
        _arscnView = new ARSCNView();
        View.AddSubview(_arscnView);
        _arscnView.TranslatesAutoresizingMaskIntoConstraints = false;
        _arscnView.LeftAnchor.ConstraintEqualTo(View.LeftAnchor).Active = true;
        _arscnView.TopAnchor.ConstraintEqualTo(View.TopAnchor).Active = true;
        _arscnView.RightAnchor.ConstraintEqualTo(View.RightAnchor).Active = true;
        _arscnView.BottomAnchor.ConstraintEqualTo(View.BottomAnchor).Active = true;

        // ARSCNView のシーンをモデルデータで作成します
        _arscnView.Scene = SCNScene.FromFile("art.scnassets/ship.scn");
    }

    /// <summary>
    /// セッションを開始します
    /// </summary>
    /// <param name="animated">If set to <c>true</c> animated.</param>
    public override void ViewWillAppear(bool animated)
    {
        _arscnView.Session.Run(new ARWorldTrackingConfiguration(), new ARSessionRunOptions());
    }

    /// <summary>
    /// セッションを停止します
    /// </summary>
    /// <param name="animated">If set to <c>true</c> animated.</param>
    public override void ViewWillDisappear(bool animated)
    {
        _arscnView.Session.Pause();
    }
}

ViewController のコードではないですが、ViewController のそれぞれのメソッドから呼ばれるメソッドを持ったクラスです。
コードを把握するだけなら、ViewController に書かれたコードと思って読んで大丈夫です。
View プロパティも、ViewController の View をセットしています。

要点だけを抽出

上記コードではライフサイクルイベントやレイアウトのコードが結構な割合で記述されています。AR 部分を理解するには邪魔になるので要点部分だけを抜き出してみます。

    public override void ViewDidLoad()
    {
        // ARSCNView のインスタンスを生成し画面にセットします
        _arscnView = new ARSCNView();
        View.AddSubview(_arscnView);

        // ARSCNView のシーンをモデルデータで作成します
        _arscnView.Scene = SCNScene.FromFile("art.scnassets/ship.scn");
    }

要点はこれでだけです。

■ コード解説

まず、AR のための View の ARSCNView を作成し画面にセットします。
この View を置いただけでカメラの映像が表示され AR が開始されるようです。簡単ですね。

        _arscnView = new ARSCNView();
        View.AddSubview(_arscnView);

次に、作成した ARSCNViewScene プロパティにモデルデータから作成した SCNScene をセットします。
モデルのデータは iOS のサンプルでおなじみの宇宙船になっています。FromFile メソッドの引数でモデルのファイルを指定します。

        // ARSCNView のシーンをモデルデータで作成します
        _arscnView.Scene = SCNScene.FromFile("art.scnassets/ship.scn");

これだけで、宇宙船が空間に存在する AR 表示ができました。

最初の一歩が簡単なのはとてもありがたいですね。