メッシングの概要
メッシングの機能、使うべき場面、最適な活用法を学ぶ。
はじめに
メッシングは、画像や、カメラのポーズ、ハイエンドのデバイスではLIDARの深度フレームから作成された環境の3Dジオメトリを提供するARDKの機能です。この3Dジオメトリは メッシュ と呼ばれ、ユーザーが見たことのないオブジェクトにデバイスを向けると、1秒間に最大10回、オンザフライで生成されます。つまり、地面や壁、家具、植物などの境界がなく、あらゆるオブジェクトの面に伸びる薄いゴムシートのようなものと概念化することができます。
IARSession の設定時にこの機能を有効にすると、メッシングに必要な入力データが自動的に取り込まれます。初回実行時には、アルゴリズムによって、ニューラルネットワークモデルをダウンロードするよう求められます。モデルの必須バージョンがデバイスにすでに存在する場合は、キャッシュされたバージョンがメモリにロードされます。
メッシュの使用方法
環境メッシュは、多くのAR機能を実現し、拡張します。
ビジュアライゼーション : ユーザーが環境をスキャンすると、視覚的なフィードバックが提供されます。
オクルージョン : 特に、 深度ベースのオクルージョン が実用的でない大きな屋外環境では、仮想オブジェクトを実際のオブジェクトの陰に隠すことができます。
物理演算 :
MeshCollider
を使用して、仮想のオブジェクトやキャラクターを環境や現実のオブジェクトとインタラクトできるようにします。キャラクターの配置とナビゲーション : ゲームボード への入力
プロシージャル オブジェクトの配置 : プレーンの検知 より柔軟にARの世界に追加することができます。詳細については、 中級チュートリアル: ガーデンチャンクのメッシング をご参照ください。
メッシュジオメトリ
メッシュジオメトリは、頂点と面で構成されます。頂点 は3Dの点、面 は3次元の頂点で構成される三角形です。
メッシングAPIでは、頂点はそれぞれ6桁の浮動小数点数で構成されています。
3桁は、点の位置(x, y, z)、
もう3桁は、その法線ベクトル(nx, ny, nz)を指します。法線ベクトルは、その点が向いている方向を表し、照明のレンダリングや衝突物理に使用されます。
メッシュジオメトリは、ARDKの座標系で表記されており、その表記は右回りに、Y軸方向に重力に沿うように示されます。Unityの右回りの座標系の規約に準拠するには、Y軸の符号を反転させて変換する必要があります。この変換は、 ARMesh
プレハブやARMeshManagerなどのヘルパーを使用して行います。ほとんどの場合、メッシュの GameObject
の変換に(1, -1, 1)のスケールを適用します。詳細については、 メッシング: はじめに を参照してください。
メッシュの面は3つの整数で構成されており、それぞれが頂点リストのそのインデックスを持つ頂点に対応しています。これらの頂点のインデックスは常に反時計回りの順序になっているため、面ごとに既知の外周面があります。
メッシュブロック
現在、メッシングAPIでは、ユーザーの周囲100m(300フィート)以内のメッシュ情報を提供します。メッシュ操作を簡略化するために、アルゴリズムは世界を同じサイズの立方体(デフォルトでは一辺1.4m/55インチ)にスライスし、そのすべてのメッシュの三角形を立方体にグループ化します。少なくとも1つのメッシュの三角形を含むすべての立方体がメッシュブロックになります。
各ブロックは4つの値で表されます。
(X, Y, Z)整数のブロック座標
頂点数
面数
バージョン番号
ブロック座標は整数値です。デフォルトのブロックサイズを仮定すると、(0, 0, 0)は各軸0.0mから1.4mの間の頂点と三角形を含むブロックの座標、 (-1, -1, -1) は各軸-1.4mから0.0mの間の頂点と三角形を含むブロックであることを意味します。
詳細については、 付録: 低レベルのメッシング を参照してください。
ブロックサイズとボクセルサイズ
デフォルトのブロックサイズである1.4m(55インチ)は、Unityの不要なメッシュ更新を抑えるのに十分小さく、同時にメッシュオブジェクトごとに発生するオーバーヘッドを抑えるために十分大きくなるように設定されています。目的のブロックサイズは、 IARWorldTrackingConfiguration.MeshingTargetBlockSize プロパティを使用して設定できます。
基準となるこのアルゴリズムは、世界を ボクセル と呼ばれる小さな立方体でモデル化し、各ボクセルに「立体」または「空」にするための確率値を割り当てます。その結果、立体と空のボクセルを分離して作成された表面のメッシュが得られます。
ボクセルサイズは固定のため、設定することができません。ノイズと精度のバランスを考慮して、2.8cm(1.1インチ)を選択しました。 さらに大きなボクセルでは小さなオブジェクトを取得できないのに対し、小さなボクセルではメッシュに穴が開く可能性が高くなり、メモリ要件も大幅に厳しくなります。
ブロックバージョンとチャンク
Unityの Mesh
オブジェクトの更新には時間がかかるため、各ブロックにはバージョン番号が割り当てられます。このバージョン番号は、頂点や面が変更されたときのみ上がります。
ColliderMesh
を更新する度に計算コストが大幅に高くなり、ポリゴン数に応じて直線的に増大するため、これは、メッシュを物理的に使用する場合に特に重要です。
このため、アプリケーションでこのような更新の頻度を必ず制限する必要があります。方法は次のとおりです。
メッシュ全体を、ブロックごとに1つの小さなサブメッシュに分割する。
ブロックのバージョンが変更されたサブメッシュのみを更新する。
(オプション)バージョンをスキップしてレンダリングに使用する
MeshFilter
よりも低い頻度でColliderMesh
を更新する。
残念なことに、各サブメッシュにはオーバーヘッドが伴うことがあるため、アプリケーション側でその数をブロックごとに1つの GameObject
に制限する必要があり、メッシュチャンク というプレハブからインスタンス化されます。メッシュチャンクを管理するために、ARMeshManagerヘルパーが付属しています。
メッシュチャンクの詳細については、 メッシング: はじめに チュートリアルの メッシュブロックのプレハブ セクションを参照してください。
セッション構成とLiDARのサポート
デフォルトでは、メッシュのサポートはすべてのARセッションで無効になっています。
サポートされているデバイス(制限事項および注意事項 を参照)では、 IARWorldTrackingConfiguration.IsMeshingEnabled フラグを設定してメッシュを有効にすることができます。ARMeshManagerヘルパークラスをシーンで使用すると、ARセッションは自動的に設定されます。
機械学習で生成される深度はメッシュ生成アルゴリズムに必要な入力であるため、 IsMeshingEnabled
で設定されるセッションでは、 深度推定 は暗黙的に有効にされます。
iPhone 12 ProのようなLiDARセンサーが搭載されたデバイスでは、センサーの高忠実度の深度データを使用してメッシュが作成されます。このようなデバイスでは、 IsMeshingEnabled
によって、深度推定が暗黙的に有効になることはありません。ただし、セッション構成で IARWorldTrackingConfiguration.IsDepthEnabled を true
に設定することで、深度推定を明示的に有効にすることができます。
LiDAR対応デバイスにおいて、メッシングとあわせて深度推定が明示的に有効になっている場合は、以下のテーブルのように両者の深度データを融合してメッシュが生成されます。
メッシングが有効 |
深度推定が有効 |
深度推定が無効 |
---|---|---|
LiDAR対応デバイス |
LiDARと深度推定を融合したメッシュ |
LiDARベースのメッシュ |
その他の対応デバイス |
深度推定メッシュ |
深度推定メッシュ |
制限事項および注意事項
メッシングには、3GB以上のRAMが搭載された最新型のデバイスが必要です。対応デバイスの一覧は、 システム要件 を参照してください。
現在のデバイスがメッシングに対応しているかどうかを実行時に確認するには、ARWorldTrackingConfigurationFactory.CheckMeshingSupport()メソッドを呼び出します。
メッシュの品質は、iPhone 12 ProのようなLIDAR対応デバイスで最も優れており、その他のデバイスでは、環境の「コンピュータービジョンとの親和性」に依存し、次の3段階に分類することができます。
ティア 1: 最高品質:
表面が立体、艶なし、不透明:森、レンガ、石、木、木の葉。
無反射の大型家具: ソファ、テーブル、棚。
高度なテクスチャの面: カーペット、壁画、壁紙、カーテン。
ティア 2: 良質(照明が十分な環境の場合):
無地面: 塗装面、白壁、生コンクリート。
テクスチャの細かい面: 砂、石、草、アスファルト。
小型家具: 椅子、ベンチ。
ティア 3: 低品質:
透明面: ガラス、窓、水。
半透明の面: ステンドグラス、シェード。
反射面: 磨かれた花崗岩、金属、ニス塗装が施された木材、スクリーン、鏡。
細いオブジェクト: 街灯、フェンス、自転車。
暗い環境: 夜明け、夕暮れ、夜、低照度の室内。
動くオブジェクト: 人、ペット、車、風になびく葉っぱ。
品質の低さは、一般的に以下のようなメッシュと現実の違いに現れます。
不正確さ、メッシュと実際の表面との間のオフセット。
騒音、滑らかな表面での頑丈なメッシュ。
人工物。宙に浮くメッシュの破片。
穴。メッシュの気密性が低い部分。
不完全。オブジェクトが欠落している。
チュートリアル
メッシングを使い始めるには、まず メッシング: はじめに チュートリアルを参照してから、構築する体験の種類に応じて上級チュートリアルのいずれかを選択します。
初級チュートリアル: メッシング: はじめに - AR体験にメッシングを追加する
中級チュートリアル: メッシングとコリジョン - メッシングの使い方および生成されたメッシュとオブジェクトの衝突について学ぶ
中級チュートリアル: ガーデンチャンクのメッシング - 生成したメッシュを使ってARガーデンを作る
中級チュートリアル: Unityエディターのメッシュ - 生成したメッシュをデバイス上に保存してUnityで取り出す
上級チュートリアル: Gameboard(ゲームボード) - ゲームボードを使用して、オブジェクトの配置や、プロシージャルなゲームプレイ、キャラクターのナビゲーションのための環境についてクエリを実行する