中級チュートリアル: Unityエディターのメッシュ

メッシュをファイルとして保存しデバイス上で再利用する。

メッシング ベースの機能で作業する場合は、試したり変更したりする度にデバイスにデプロイすることで時間がかかることがあります。このため、ARDKでは、メッシュをデバイス上のファイルとして保存し、エディタ上でモックメッシュとして再利用する初歩的なシステムを使用しています。

メッシュファイルを保存する

ARDK使用例MeshSaver のサンプルシーンには、UIボタン Save Mesh File(メッシュファイルの保存) があり、MeshSaverヘルパーを呼び出して現在のメッシュデータをデバイスのファイルシステム内のバイナリファイルにダンプします。

../../_images/meshing_savemesh.jpg

ボタンを押すたびに、 mesh_*.bin ファイルが新たに作成されます。この名前は、メッシュのバージョンにちなんで付けられます。 付録: 低レベルメッシュ で説明したように、各ファイルは、APIのブロック、頂点、フェイスバッファのバイナリダンプです。メッシュの更新をUnityエディタで再現する場合は、スキャンしながら複数のメッシュを保存しておくことをお勧めします。

重要なのは、アプリケーションにファイルの書き込み権限を設定することと、USB経由のファイルアクセスを許可することです。iOSでは、アプリの Info.plistUIFileSharingEnabled の値を有効にすることができます。この値は、次のような PostProcessBuild ステップの一部として有効にすることができます。

#if UNITY_IOS && UNITY_EDITOR

using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class EnableFileSharingPostProcessor
{
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
    {
        if (buildTarget == BuildTarget.iOS)
            BuildForiOS(path);
    }

    private static void BuildForiOS(string path)
    {
        // Get plist
        string plistPath = path + "/Info.plist";
        PlistDocument plist = new PlistDocument();
        plist.ReadFromString(File.ReadAllText(plistPath));

        // Set key and value for UIFileSharingEnabled.
        PlistElementDict rootDict = plist.root;
        rootDict.SetBoolean("UIFileSharingEnabled", true);

        // Write to file
        File.WriteAllText(plistPath, plist.WriteToString());
    }
}

#endif

iOSでメッシュファイルを抽出する

iPhoneをノートパソコンにUSB接続し、Finder(macOS Catalina以降)でiPhoneのファイルをブラウズします。ARDK使用例を探し、その meshes フォルダをローカルディスクにコピーします。

../../_images/meshing_extract_ios.jpg

この中には、それぞれ異なるARセッションを表す複数のディレクトリがあり、その名前にはタイムスタンプが含まれます。各セッションフォルダの中に、 mesh_*.bin ファイルがあります。

Androidでメッシュファイルを抽出する

AndroidのスマートフォンをノートパソコンにUSB接続し、Android File Transfer を利用してスマートフォンのファイルをブラウズします。

ファイルは、Android/data/com.nianticlabs.ar.ardkexamples/files/meshes の下の複数のディレクトリにあります。このディレクトリはそれぞれ異なるARセッションを表しており、ファイル名はタイムスタンプで指定されています。

Unityにメッシュをインポートする

Unityのシーン階層に、空の GameObject を作成し、「MockMeshes」と名前を付けます。このオブジェクトは、保存されたメッシュをエディタにロードし、デバイスにデプロイせずにメッシュ関連のロジックをテストすることを目的としています。

MockMeshオブジェクトを追加するには、Add Component(コンポーネントの追加) をクリックし、検索ボックスに「mock mesh」と入力します。

../../_images/meshing_mockmeshes.jpg

次に、メッシュファイルをシーンのファイル階層にあるフォルダにコピーアンドペーストします。Project(プロジェクト) ウィンドウで.binファイルのいずれかを右クリックし、Copy Path(パスのコピー) を選択し、インスペクターの MockMesh コンポーネントの Mesh Path フィールドにそのパスを貼り付けます。

なお、 Time To Discovery は、UnityエディタのプレイモードでモックARセッションを初期化してから、メッシュが表示されるまでの時間を秒単位で設定するパラメーターです。

試しに、Unityエディタの Play(プレイ) ボタンをクリックしてみてください。GameタブでおかしなUIが表示されたら、iPhoneのポートレートモードのアスペクト比をシミュレートするようにドロップダウンを変更して、Run AR(ARの実行) ボタンを押してください。

設定した検出時間が経過すると、メッシュが表示されることが分かります。複数のメッシュ更新を連鎖させるには、オブジェクトに複数の MockMesh コンポーネントを追加し、それぞれに検出までの時間と異なるメッシュファイルパスを指定します。また、MockMeshSequenceを追加することもできます。この場合、 Mesh Sequence Path フィールドに個々のメッシュファイルを含むフォルダを設定します。メッシュはバージョン番号順に1つずつロードされ、 Update Interval フィールドで指定された秒数でロードされます。

サンプルメッシュ

サンプルモックメッシュは、 lightship.dev にある ardk-mock-meshes.unitypackage から使用可能です。このパッケージには、現実世界のさまざまな場所をスキャンしたメッシュのサンプルが含まれています。このパッケージをUnityプロジェクトにインポートすれば、これらのメッシュをモックメッシュとして使用できます。