深度を使って画面上の地点を現実世界の位置に変換する
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
の使用方法をご覧ください。 -
深度のピッキングとプレハブの配置を処理するスクリプトを作成します。
Depth_ScreenToWorldPosition
という名前を付けます。 -
更新時に深度画像を取得する
-
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();
-
}.
1. ディスプレイマトリクスを計算する: 深度画像は、機械学習モデルから表面化されたときにセンサーの方向を向いているため、現在の画面の向きに対してサンプリングする必要があります。 ディスプレイ変換は、スクリーン空間から画像座標系に変換するマッピングを提供する。 GPUテクスチャの代わりに`XRCpuImageを使って`、`Sample(Vector2 uv, Matrix4x4 transform)`メソッドをCPUで使えるようにしています。
1. プライベートな`Matrix4x4と` `ScreenOrientation`フィールドを追加する。
```cs
private Matrix4x4 _displayMatrix;
private ScreenOrientation? _latestScreenOrientation;
UpdateDisplayMatrixという
新しいメソッドを作成する。- スクリプトに有効な
XRCpuImageが
キャッシュされているか確認する。 - 画面の向きが変わったかどうかをテストして、マトリックスの再計算が必要かどうかをチェックする。
CameraMath.CalculateDisplayMatrixを呼び出して
、スクリーン座標を画像座標に変換する行列を計算する。
private void UpdateDisplayMatrix()
{
// 有効な深度画像があることを確認する
if (_depthImage is {valid: true})
{
// 画面の向きが変更された場合にのみ、表示行列を再計算する必要がある
if (!_latestScreenOrientation.HasValue ||
_latestScreenOrientation.Value != XRDisplayContext.GetScreenOrientation())
{
_latestScreenOrientation = XRDisplayContext.GetScreenOrientation();
_displayMatrix = CameraMath.CalculateDisplayMatrix(
_depthImage.Value.width,
_depthImage.Value.height,
Screen.width,
Screen.height,
_latestScreenOrientation.Value,
invertVertically: true);
}.
}
}
Update
コールバック内でUpdateDisplayMatrix
メソッドを呼び出す:
private void Update()
{
...
UpdateDisplayMatrix();
}.
-
以下の手順で、タップ入力を処理するコードを設定します。
- 「HandleTouch」というプライベートメソッドを作成します。
- エディターでは、「Input.MouseDown」を使用してマウスクリックを検出します。
- スマートフォンでは、「Input.GetTouch」を使用してタップを検出します。