TECHブログ


iPhone12 ProのLiDARを使った距離計測ARアプリケーション

 

はじめに:

この記事の目的は、iPhone12Proのカメラに搭載しているLiDARスキャナを使って、UnityのAR空間上で実際の距離を測定できるか、さらに発展させAR空間上に実寸サイズのオブジェクトを配置して表示できるかを試してみることです。

開発環境:

マシン

mac mini 2020 M1
macOS:Big Sur バージョン11.2.2
iPhone12 Pro 14.4.1

使用ソフト

Unity 2020.3.4f1
VisualStudio for Mac 8.9.10(build4)
Xcode 12.5

使用したUnityパッケージ

ARFoundation 4.2.0-pre.8

ARKit XR Plugin 4.2.0-pre.8

機能紹介

距離計測機能

指定した2点間の距離をmmで表示

タップして削除可能

resultresult2

実際に定規で計測してみたところ77mm、動画上の表示は76mmとほぼ一致しています。

オブジェクト作製及び配置機能

指定したサイズのオブジェクトを作成して、AR空間に配置する。

配置したオブジェクトを移動、リサイズ、回転、削除可能

Unityでの実装

ARFoundationで平面に対してrayが当たったか判定する方法

AR空間で距離を計測するにもオブジェクトを配置するにも配置するための座標を取得しないといけないのでRayを飛ばして座標を取得します。

ARFoundationではPlane Managerを利用すると平面検出が可能になります。

以下はその平面にRayが当たった座標を取得するためのコードです。

  1. AR Session OriginにAR Raycast ManagerとAR Plane Managerをアタッチする
  2. 以下のコードを実装
public ARRaycastManager rayCastManager; //Unity側でARSession Originをアタッチ

static List<ARRaycastHit> hitResult = new List<ARRaycastHit>();//rayが当たったplaneを格納するリスト

Vector2 centerPosition = new Vector2(Screen.width / 2, Screen.height / 2);//画面中央を変数に代入

if (rayCastManager.Raycast(centerPosition, hitResult, TrackableType.PlaneWithinPolygon))
{
    hitPose = hitResult[0].pose;	//rayが当たったplaneのリストから一番手前にあるplaneを取得
    Vector3 hitPosition = hitPose.position;
}

上記スクリプトを利用して、始点と終点を取得してLineRendererで表示をしています。

 

画面スワイプでオブジェクトを回転させる方法

オブジェクトの角度を調整する際に、InputFieldから値を入力して回転させるのは扱いにくいので画面スワイプで回転させるようにしました。

Vector2 sPos;   //タッチした座標
Quaternion sRot; //タッチしたときの回転
float wid, hei;  //スクリーンサイズ
float tx; //移動量の変数

void Update()
{
  if (Input.touchCount == 1)
  {
    Touch t1 = Input.GetTouch(0);
    if (t1.phase == TouchPhase.Began)
    {
      sPos = t1.position;
      sRot = gameObject.transform.rotation;
    }
    else if (t1.phase == TouchPhase.Moved || t1.phase == TouchPhase.Stationary)
    {
      tx = (t1.position.x - sPos.x) / wid; //指の横移動量の計算
      gameObject.transform.rotation = sRot;          
      gameObject.transform.Rotate(new Vector3(0, -90 * tx, 0), Space.World);
    }
  }  
}

上記スクリプトを回転させたいオブジェクトにアタッチすると、スワイプによるオブジェクトの回転が実現できます。

同じ要領で縦方向の回転も可能ですが今回は横回転のみ実装しています。

まとめ

目的であった距離計測とオブジェクト配置機能を組み合わせることが問題なくできることが分かりました。

また、LiDARスキャナの恩恵で高精度な距離計測が行えることも分かりました。

本アプリではCubeを配置していますが、3Dオブジェクトファイルを読み込んでAR空間に配置してサイズを確かめるということもできそうですね。

最低限のARアプリケーションはARFoundationを使えば簡単に作れるのでアイデア次第で更に面白いARアプリケーションが開発できそうです。