Holoとモバイル端末でのAR体験の共有をしたい
とあるタスクで、HoloとAndroid 間で空間を共有しながらAR体験もリアルタイムに反映させるものが生えました
要件としてはデバイスはすべて同一LANにつながっており、
HoloとiPadとか
そのデモをするためにiPadがないのでAndroidで実装します
前回ASAのサンプルを動かして空間アンカーの共有までできたので、
今回は一からUnityプロジェクトをセットアップして、ASAで空間の共有までやりたい
MSの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でインポートするには、ここで説明されているように名前でインポートできる
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クライアントではアンカーの探索ができる
アンカーの作成プロセスでは、
- なんらかのボタンを押してcubeが出現
- cubeを適当な場所に配置
- ボタンを押してアンカーを作成
アンカーの探索プロセスでは
- ボタンを押す
- アンカーの場所を探索し、最後に配置したアンカーの場所にcubeを配置する
- ボタンを押して終了
チュートリアル写経してみていた
どうやら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!");
}
}
ちなみにAnchorLocateCriteriaのIdentifiersはstinrg[]
ユーザフロー作るのがちょっとめんどくさいな
とりあえず初めからcubeは既に配置されているのがいいのかなぁ
おそらく、利用する人からするとアンカーを探索することのほうが主な用途になる
なので利用する人からして「内部実装はよくわからんけど、なんとなくシーンに配置したら自動的にアンカーの場所に移動してくれる謎のプレハブ」みたいなのがいいのかなぁと思うなど
ボタンを押したらプレハブをInstantiateして、勝手にアンカーの場所に移る仕様にしたい
「シーンに配置したら勝手に空間共有ができるプレハブ」は
アンカー設置用とアンカー探索用で分けるし、スクリプトもわける(わかりやすいので)
デモってそのプレハブはメッシュとか表示用の何かは全くない
設置用のプレハブはなんかcubeの子要素になってるし、探索用のプレハブはその子要素にcubeがある感じ