深度を使って画面上の地点を現実世界の位置に変換する
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;
- 非公開の