空間メッシュ (実験的)

はじめに
パッケージとSnapdragon Spaces Service側の最適化により、現時点ではリリース間の後方互換性が失われているため、この機能は実験的とされています。
このサンプルでは、現実世界の環境に近似した空間メッシュを生成して可視化する方法を紹介します。
空間メッシュの基本的な情報や、AR Foundationの AR Mesh Manager コンポーネントの機能については、Unityのドキュメントを参照してください。
機能の有効化
この機能を使用するには、以下のOpenXRのプロジェクト設定でSpatial Meshingにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ)
サンプルのインポート
まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。
サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/0.XX.0/Core Samples/Scenes/Spatial Meshing Sample/Spatial Meshing Sample.unity
サンプルの仕組み
ARMeshManager
ARMeshManager
コンポーネントは、ARSessionOrigin
ゲームオブジェクトの子にアタッチする必要があります。このコンポーネントには、メッシュが利用可能になったときに生成されるMeshFilter
への参照があります。
ARMeshManager
コンポーネントをカメラオブジェクトに取り付けると、オブジェクトのScaleが元の(1, 1, 1)から(10, 10, 10)に変更されます。これにより、元のカメラスケールに戻るまで、ARグラス上でアプリのレンダリングに問題が発生します。
以下のプロパティはサポートされていません:
- 生成されたメッシュの
Density
の変更は現在サポートされていません。 Tangents
、Texture Coordinates
、Colors
は現在メッシュの一部として生成されません。ARMeshManager
コンポーネントからこれらのプロパティのバッファにアクセスすると、nullの結果が生成される場合があります。- 現在、
Concurrent Queue Size
の変更はサポートされていません。
Normals
プロパティはデフォルトで有効になっています。
サポートされていないARMeshManager
コンポーネントのプロパティを変更すると、アプリのビルド時にコンソールに警告が表示されます。
ARMeshManager
コンポーネントのmeshesChanged
コールバックをサブスクライブすることで、メッシュが追加、更新、削除されたときのデータを取得できます。
サンプルコード
private ARMeshManager _meshManager;
public void Awake() {
_meshManager = FindObjectOfType<ARMeshManager>();
}
public override void OnEnable() {
...
_meshManager.meshesChanged += OnMeshesChanged;
}
public override void OnDisable() {
...
_meshManager.meshesChanged -= OnMeshesChanged;
}
void OnMeshesChanged(ARMeshesChangedEventArgs args) {
foreach (MeshFilter meshFilter in args.added) {
...
}
foreach (MeshFilter meshFilter in args.updated) {
...
}
foreach (MeshFilter meshFilter in args.removed) {
...
}
}
Spaces AR Mesh Manger Config
AR Mesh Manager
コンポーネントには、Snapdragon SpacesのUnityパッケージのサブシステムの実装でサポートされていないプロパティがあります。
サポートされていないプロパティを使用しようとすると、ビルドが実行され、Spatial Meshing(Experimental)
機能が有効になっているときに警告が表示されます。
生成されたメッシュを設定するための追加オプションがある(オプションの)Spaces AR Mesh Manager Config
コンポーネントを使用することをお勧めします。
このコンポーネントを使用すると、Spatial Meshingプロバイダは、ランタイム側から来るTrackingOriginMode.Floor関連のカメラの高さのオフセットも処理できます。
このコンポーネントを使用しないと、メッシュが間違った位置に表示される可能性があります。
このコンポーネントはARMeshManager
コンポーネントと同じゲームオブジェクトにアタッチする必要があります。
-
CPU法線を計算する場合
- 有効にすると、CPU法線がメッシュの各頂点について計算されます。
- 一部の頂点はメッシュ内で繰り返されることがあります(異なるインデックスを使用)。
- これは生成されたメッシュに目に見える継ぎ目を生じさせます。
- メッシュ内の各インデックスについて、そのインデックスを参照する各三角形は結果の法線に寄与しますが、(繰り返される頂点の)異なるインデックスは異な る法線を持つことがあります。
ARMeshManager
コンポーネントのCalculate CPU Normals
プロパティとNormals
プロパティの両方が有効になっていないか、両方が無効になっている場合、アプリのビルド時にコンソールに説明の警告が出力されます。
-
スムージング法線を使用する場合
- 有効にすると、各頂点のCPU法線がスムージングされます。
- 同じ空間で異なるインデックスを持つ頂点を参照するすべての三角形は、それらの重複頂点を同じ頂点であるかのように扱います。
- このため、検出されたジオメトリのハードエッジがうまく定義されなくなることがありますが、継ぎ目の見た目は軽減されます。
- 平滑化された法線を計算すると処理能力が上がり、パフォーマンスに影響します。
デフォルトでは、サンプルを開くと、検出された環境に適応したポリゴンを持つメッシュが生成されます。
Calculate CPU Normals
プロパティが有効な場合、メッシュはMesh With Cpu Normals
マテリアルを使用してStandardシェーダでビジュアライズされます。Calculate CPU Normals
プロパティが無効の場合、メッシュは視覚化のみを目的として法線を生成するカスタムMeshVisualization.shader
で視覚化されます。