Closed16

Holoとモバイル端末でのAR体験の共有をしたい

にー兄さんにー兄さん

とあるタスクで、HoloとAndroid 間で空間を共有しながらAR体験もリアルタイムに反映させるものが生えました
要件としてはデバイスはすべて同一LANにつながっており、
HoloとiPadとか

そのデモをするためにiPadがないのでAndroidで実装します

にー兄さんにー兄さん

前回ASAのサンプルを動かして空間アンカーの共有までできたので、
今回は一からUnityプロジェクトをセットアップして、ASAで空間の共有までやりたい

にー兄さんにー兄さん

環境は

  • Unity 2021.3.2
  • MRTK 2.7.3
  • ASA

MR系のパッケージは基本UPM経由でインポートする

にー兄さんにー兄さん

Hololensに関しては上記の環境で

他にAndroidでもやりたいので

  • Unity 2021..3.2
  • ARFoundation4.2.3
  • ARCore XR Plugin
にー兄さんにー兄さん

まずはMRTKの設定
Unity2021.3.2の場合、MRTKは2.8.0、MR OpenXRは1.4.0だった
あとからアプデしても普通に動いたけど

  "scopedRegistries": [
    {
      "name": "Microsoft Mixed Reality",
      "url": "https://pkgs.dev.azure.com/aipmr/MixedReality-Unity-Packages/_packaging/Unity-packages/npm/registry/",
      "scopes": [
        "com.microsoft.mixedreality",
      ]
    }
  ],
  "dependencies": {
    "com.microsoft.mixedreality.openxr": "1.4.0",
    "com.microsoft.mixedreality.toolkit.foundation": "2.8.0",
    "com.microsoft.mixedreality.toolkit.tools": "2.8.0",
}
にー兄さんにー兄さん

ASAをUPMでインポートするには、ここで説明されているように名前でインポートできる
https://docs.microsoft.com/ja-jp/azure/spatial-anchors/how-tos/setup-unity-project?tabs=xr-plugin-framework%2Cunity-2020%2Cunity-package-npm%2CExtraConfigurationsHoloLens#download-asa-packages

com.microsoft.azure.spatial-anchors-sdk.core
com.microsoft.azure.spatial-anchors-sdk.windows

これらはscoped registoryにcom.microsoft.azureを追加すればインポートできる

  "scopedRegistries": [
    {
      "name": "Microsoft Mixed Reality",
      "url": "https://pkgs.dev.azure.com/aipmr/MixedReality-Unity-Packages/_packaging/Unity-packages/npm/registry/",
      "scopes": [
        "com.microsoft.mixedreality",
        "com.microsoft.azure"
      ]
    }
  ],
  "dependencies": {
    "com.microsoft.azure.spatial-anchors-sdk.core": "2.12.0",
    "com.microsoft.azure.spatial-anchors-sdk.windows": "2.12.0",
にー兄さんにー兄さん

ASAのチュートリアルで、アンカーを作成するチュートリアルがあるが
あれでやっていることは既にSpatialAnchorManagerというコンポーネントで実装されており、
これを使うと比較的簡単に空間アンカーが扱えそう

にー兄さんにー兄さん

ちなみにAPIトークンなどはResources以下にConfigを作ってそこからロードするっぽい

にー兄さんにー兄さん

どんな操作感のデモを作るかを検討する

やりたいことは、空間の共有
もっと言うとアンカー姿勢の共有ができればよい
逆にそれ以外を実装するとわかりにくい

にー兄さんにー兄さん

HoloLensクライアントではアンカーの作成と探索ができる
androidクライアントではアンカーの探索ができる

アンカーの作成プロセスでは、

  1. なんらかのボタンを押してcubeが出現
  2. cubeを適当な場所に配置
  3. ボタンを押してアンカーを作成

アンカーの探索プロセスでは

  1. ボタンを押す
  2. アンカーの場所を探索し、最後に配置したアンカーの場所にcubeを配置する
  3. ボタンを押して終了
にー兄さんにー兄さん

チュートリアル写経してみていた
どうやらSpatialAnchorSessionをstartする時点でAnchorLocateCriteriaをインスタンス化し
session.CreateWatcher()を登録しなくてはいけない

/// <summary>
/// Looking for anchors with ID in _createdAnchorIDs
/// </summary>
private void LocateAnchor()
{
    if (_createdAnchorIDs.Count > 0)
    {
        //Create watcher to look for all stored anchor IDs
        Debug.Log($"ASA - Creating watcher to look for {_createdAnchorIDs.Count} spatial anchors");
        AnchorLocateCriteria anchorLocateCriteria = new AnchorLocateCriteria();
        anchorLocateCriteria.Identifiers = _createdAnchorIDs.ToArray();
        _spatialAnchorManager.Session.CreateWatcher(anchorLocateCriteria);
        Debug.Log($"ASA - Watcher created!");
    }
}
にー兄さんにー兄さん

ユーザフロー作るのがちょっとめんどくさいな
とりあえず初めからcubeは既に配置されているのがいいのかなぁ

にー兄さんにー兄さん

おそらく、利用する人からするとアンカーを探索することのほうが主な用途になる
なので利用する人からして「内部実装はよくわからんけど、なんとなくシーンに配置したら自動的にアンカーの場所に移動してくれる謎のプレハブ」みたいなのがいいのかなぁと思うなど

ボタンを押したらプレハブをInstantiateして、勝手にアンカーの場所に移る仕様にしたい

にー兄さんにー兄さん

「シーンに配置したら勝手に空間共有ができるプレハブ」は
アンカー設置用とアンカー探索用で分けるし、スクリプトもわける(わかりやすいので)

デモってそのプレハブはメッシュとか表示用の何かは全くない
設置用のプレハブはなんかcubeの子要素になってるし、探索用のプレハブはその子要素にcubeがある感じ

このスクラップは2023/02/19にクローズされました