深度を使って画面上の地点を現実世界の位置に変換する
Lightshipの深度マップ出力を使用すると、平面やメッシュを使用せずにARシーン内にオブジェクトを動的に配置できます。 この入門ガイドでは、画面上の位置を選択し、深度出力を使用して3D空間にオブジェクトを配置する手順を説明します。

前提条件
Lightship ARを有効にしたUnityのプロジェクトが必要です。 詳細については、 ARDK 3 のインストール をご覧ください。
初めて深度を使うのであれば、 Accessing and Displaying Depth Information は、深度のより単純な使用例を提供しており始めやすいです。
手順
メインシーンがAR対応でない場合は、次のように設定します。
-
Main Camera を削除します。
-
ARSession と XROrigin をHierarchyに追加し、 AR Occlusion Manager コンポーネントを XROrigin に追加します。 高精度なオクルージョンを望む場合は、 How to Set Up Real-World Occlusion(現実世界のオクルージョンを設定する) の
LightshipOcclusionExtension
の使用方法をご覧ください。 -
深度ピックとプレハブの配置を処理する
MonoBehaviour
スクリプトを作成します。Depth_ScreenToWorldPosition
という名前を付けます。 -
スクリプトに必要な名前空間を追加します。
using Niantic.Lightship.AR.Utilities;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems; -
更新時に深度画像を取得する
-
AROcclusionManager
のシリアライズされたフィールドと、XRCpuImage
のプライベートフィールドを追加します。[SerializeField]
private AROcclusionManager _occlusionManager;
private XRCpuImage? _depthimage; -
以下の手順で、新しいメソッド(
UpdateImage
)を作成します。XROcclusionSubsystem
が有効かつ実行中であることを確認します。_occlusionManager.TryAcquireEnvironmentDepthCpuImage
を呼び出して、最新の深度画像をAROcclusionManager
から取得します。- 古い深度画像を破棄し、新しい値をキャッシュします。
private void UpdateImage()
{
if (!_occlusionManager.subsystem.running)
{
return;
}
if (_occlusionManager.TryAcquireEnvironmentDepthCpuImage(out var image))
{
// 古いイメージを破棄
_depthImage?.Dispose();
// 新しいイメージをキャッシュ
_depthImage = image;
}
} -
次のように、
Update
コールバック内でUpdateImage
メソッドを呼び出します。private void Update()
{
UpdateImage();
}
-
-
表示マトリックスの計算: 機械学習モデルから生成される際、深度画像はセンサーに向かって配置されるため、現在の画面の向きに合わせてサンプリングする必要があります。 表示変換では、スクリーン空間からイメージ座標系への変換マッピングを利用できます。
Sample(Vector2 uv, Matrix4x4 transform)
メソッドをCPU上で使用できるように、GPUテクスチャではなくXRCpuImage
を使用します。- 非公開の
Matrix4x4
フィールドとScreenOrientation
フィールドを追加します。private Matrix4x4 _displayMatrix;
private ScreenOrientation? _latestScreenOrientation;
- 非公開の