😎

ARCore Recording and Playplay APIを使って現地に行かずにImmersal開発をする

2022/05/12に公開

概要

  • AR開発においては、どうしても現地に赴いての検証が増えてしまいイテレーションが回しづらい問題があります
  • ARCoreでは、あらかじめ撮影した動画を使用してAR開発が行える Recording and Playplay APIという機能があります
  • AR VPSとして知られるImmersalとRecording and Playplay APIを組み合わせて、現地に行かずに開発する方法を紹介します

環境

  • Unity 2021.3.1
  • Immersal SDK 1.16.1
  • AR Foundation 4.2.3
  • ARCore XR Plugin 4.2.3
  • (UniGLTF 1.27)

環境は上記のとおりです
今回glbからfbxへの変換にはUniGLTFを使用しました。

今回作成したプロジェクトはこちらにアップしてあります。なお、Mapファイルは含まれていませんのでご自身で用意をお願いします
https://github.com/tkada/ImmersalPlayback

Immersalが使えるようにする

  • まずImmersalが使えるように撮影&Unityセットアップをします
  • Immersalのセットアップに理解している方は読み飛ばしていただいて問題ありません
  • セットアップに関しては下記の記事も詳しいです

https://qiita.com/brocolly/items/d97f406aa18440d291a3
https://gaprot.jp/2020/10/01/try-immersal/

今回は空プロジェクトにImmersal SDK/UniGLTFをインポートして構築しました

空シーンから構成する手順としては

  • AR SessionとAR Session Originを作成
  • ImmersalSDKのPrefabを設置
  • AR Localizerをアタッチ
  • AR Spaceを作成し、その配下にARMapを作成
  • AR Mapにはbytesファイルを設定する

空プロジェクトから設定するにあたり、ハマった個所をリストアップしておきます。これらをしないとImmersalが正しく動きませんでした

  • Auto Graphics APIをOFFにしてVulkanを無効に

  • Scripting BackendをIL2CPPに。Internet AccessをRequireに設定

  • Allow 'unsafe' CodeをONに

Recording and Playplay APIを使えるようにする

  • Recording and Playplay APIのサンプルをAR Fundationのリポジトリから持ってきます
    https://github.com/Unity-Technologies/arfoundation-samples/blob/main/Assets/Scenes/ARCore/ARCoreSessionRecorder.cs

  • ARCoreSessionRecorderARSessionと同じ階層にアタッチします

  • このままビルドしてもRecording後、Playbackしようとしたときに落ちてしまいます

    • ImmersalでLocalize中にPlaybackを実行してしまうとImmersal側でクラッシュしてしまうようです
    • Playbackを実行する際にLocalizeが止められるようにUIを作成します
    • SDKのLocalizerにStartLocalizing()StopLocalizing()があるのでボタンが押されたらそれらを呼ぶようにします
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LocalizeSwitch : MonoBehaviour
{
    [SerializeField] Button startButton;
    [SerializeField] Button stopButton;
    private void Start()
    {
        this.startButton.onClick.AddListener(() =>
        {
            Immersal.ImmersalSDK.Instance.Localizer.StartLocalizing();
        });

        this.stopButton.onClick.AddListener(() =>
        {
            Immersal.ImmersalSDK.Instance.Localizer.StopLocalizing();
        });
    }
}

操作方法

1.アプリが立ち上がったら画面上部のStart recordingをタップ→撮影が開始される
2.ある程度撮ったらStop recordingをタップ
3.画面下部のLocalize StopをタップしLocalizeをいったん止める
4.画面上部のStart playbackをタップすると、先ほど撮影した動画が再生される
5.画面下部のLocalize StartをタップしLocalizeを再開する→動画でImmersalが機能する

動画にしてしまうとわかりづらいですが、下記のGifはカメラではなくPlayback機能を使ってImmersalで位置合わせを行っています

上手くいくと動画でImmersalが機能するようになるので、あらかじめ現地で撮った動画を使用してデバッグをするといったことが可能になります
なお、サンプルでは1つの動画を使いまわす仕組みになっていますが、複数の動画をアプリ内に入れておいて、入れ替えながらPlaybackをすることも可能です
m_Mp4Pathで入出力の動画ファイル名を指定しているので、この辺を改造すれば実装可能です。

ARCoreSessionRecorder.cs
void Awake()
{
    m_Session = GetComponent<ARSession>();
    m_Mp4Path = Path.Combine(Application.persistentDataPath, "arcore-session.mp4");
}

参考記事

https://www.jyuko49.com/entry/2021/05/27/022934
https://zenn.dev/drumath2237/scraps/fdff25b6c4a94c

Discussion