Developer World ToF AR
English
Table of Contents

1. ToF ARとは

ToF AR(Time of Flight Augmented Reality 以下、ToF ARと略す)はToFカメラの機能を核にアプリケーション開発の効率化をサポートするサブ機能を集めたUnity向けツールキットライブラリである。

1.1. ToF ARのシステム要件

1.1.1. ToF ARで開発を行ったアプリケーションの動作環境

ToF AR SDKが利用可能なSony, Samsung, Huawei, Honor, Appleのデバイスのリストについては、SDK対応端末モデル名リストを参照。

デバイス毎のカメラIDとデフォルト設定についても上記リストを参照。

1.1.2. ToF ARアプリケーション開発の実施に推奨するソフトウェアバージョン

  • Unity 2020.3.36f1, Unity 2021.3.5f1 (Unity 2020以上が必要)
    Androidビルド、iOSビルドのセットアップが行われていること。

    Androidのセットアップ方法は下記リンクを参照。 Android 環境の設定
  • AR Foundation 4.2.3

  • ARCore Extensions for AR Foundation 1.32.0

1.2. ToF ARの3D座標系

ToF ARの3D座標系をカメラ座標系と呼ぶ。 カメラ座標系はToFカメラを原点とした左手座標系で単位はメートルである。

image

1.3. Unityワールド座標系とToFカメラ映像座標系

Unityのワールド座標系は左手座標系である。

ToFカメラ映像座標系は端末の回転方向に依存した2次元座標系である。

image
image

2. ToF ARの概要

2.1. システム構成図

ToF ARは、下記の2つで構成されている

  • ToF AR コンポーネントライブラリ : RGBカメラやToFカメラなどのハードウェアへアクセスし、アルゴリズム等を実装する為のライブラリ。

  • ToF AR Unityツールキット : ToF AR コンポーネントライブラリのUnity用ラッパー。
    これらのうちアプリケーション開発者が直接利用するのはToF AR Unityツールキットである。

image

2.2. コンポーネントとツールキット

ToF ARは、サブ機能を担う各コンポーネントに対して、各コンポーネントを管理するManager Prefabと、各コンポーネントの処理結果を表示する可視化Prefab (Visualization Prefab)をツールキットとして提供している。コンポーネントの処理結果はストリームを介して、Manager Prefabを通して可視化Prefabやユーザーアプリケーションにわたる。これらの関係を下図に示す。

image
  • ストリーム
    各コンポーネントで処理されたデータの転送を指す。転送されるデータは、DepthデータやColorデータ、Meshデータ、特徴点の座標データなどコンポーネント毎に異なる。また、複数のデータを含むこともある。

  • Manager Prefab
    各コンポーネントと、その出力であるストリームへのアクセスを提供する。コンポーネントを利用する場合、対応するManager Prefabのシングルトンインスタンスを取得する。

  • 可視化 Prefab
    各コンポーネントのストリームから取得したデータの画面表示機能を提供する。

ToF AR ツールキットを用いる際、ColorManager PrefabかTofManager Prefabの何れかのインスタンス取得が必要である。取得が必要なインスタンスは、コンポーネントによって異なるため、ToF AR reference articlesのPrefab説明を確認する必要がある。Color / ToF コンポーネント以外のコンポーネントは、Color / ToF コンポーネントからのストリームを処理する事が理由である。

2.3. コンポーネントリスト

ToF ARは下記の機能を有するコンポーネントから構成される。 ユーザーはそれぞれを単独または組み合わせて利用可能である。

Component Description Package

ToF

Depthデータ、Confidenceデータ, PointCloudデータ取得。 ToFコンポーネントを参照。

Base

Color

RGB Colorデータ取得。 Colorコンポーネントを参照。

Base

Mesh

3D Meshデータ取得。 Meshコンポーネントを参照。

Base

Plane

平面推定データ取得。 Planeコンポーネントを参照。

Base

Coordinate

Depthデータ、Colorデータ、3D座標空間の相互座標変換機能。 Coordinateコンポーネントを参照。

Base

Hand

手(指)位置推定データ取得。 Handコンポーネントを参照。

Base, Hand

MarkRecog

マーク認識。 MarkRecogコンポーネントを参照。

Base, Hand

Modeling

3Dモデリング。 Modelingコンポーネントを参照。

Base

Body

Body認識。 Bodyコンポーネントを参照。

Base

Segmentation

Segmentation認識。 Segmentationコンポーネントを参照。

Base

Face

Face認識。 Faceコンポーネントを参照。

Base

パッケージは、セットアップでインポートが必要なUnityパッケージである。

  • BaseTofAR_Base_xxxx_yyyy.unitypackage

  • HandTofAR_Hand_xxxx_yyyy.unitypackage

xxxxはバージョン番号、 yyyyはビルド対象のプラットフォーム

2.4. パッケージ構成

ToF ARのパッケージには下記のものが含まれる。 パッケージは任意の場所に展開し利用できる。

image
Folder Description

01_UnityProject

ToF ARのUnityパッケージファイル

2.5. Unityパッケージ内フォルダ構成

ToF ARをUnityにセットアップした場合のフォルダ構成は下記のようになる。

image
Folder Description

TofAr/TofArXXXX

コンポーネントごとのフォルダ。
基本構成は全てのコンポーネントで共通である。

TofAr/TofArXXXX/Plugins

ToF ARの動作に必要なバイナリファイル類。
削除や変更を行ってはいけない。

TofAr/TofArXXXX/V0/Resources

リソースファイル類。Prefabが格納されている。

TofAr/TofArXXXX/V0/Resources/xml

ToF ARの動作に必要な設定ファイル類。
削除や変更を行ってはいけない。

TofAr/TofArXXXX/V0/Scripts

スクリプトが格納されている。

3. セットアップ

ToF ARアプリケーション開発のセットアップを説明する。

3.1. ToF ARのセットアップとアップグレード

3.1.1. ToF ARのセットアップ

ToF AR Unityツールキットは下記手順でセットアップを行う。

  1. Unityで新規プロジェクトを作成する
    Unityプロジェクトは任意の場所を指定可能

  2. メニューのFile / Build Settings…​ / Player Settings / Android Settings ボタンをクリックし、Other Settings内に下記設定を行う

    • Api Compatibility Level : .NET4.x

    • Scripting Backend : IL2CPP

    • Target Architectures : ARM64のみチェックする

      image
  3. メニューのFile / Build Settings…​ / Player Settings / iOS Settings ボタンをクリックし、Other Settings内に下記設定を行う

    • Api Compatibility Level : .NET4.x

    • Camera Usage Description : カメラの利用方法を説明する任意の文字列

      image
  4. メニューのAssets / ImportPackage / Custom Package…を選択し、TofAR_Base_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)をインポートする

    image
  5. Handコンポーネントを使用する時は、TofAR_Hand_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)も同じ手順でインポートする

  • ToF AR v1.1.0では、Unityパッケージファイルはビルド対象のプラットフォーム(Android iOS)ごとでそれぞれ基本コンポーネントとHandコンポーネントに分割されて提供される。

  • Android iOS 共にビルド対象とする場合はそれぞれのUnityパッケージをインポートする。

  • また、Handコンポーネントを使用する場合は基本コンポーネントと合わせて両方のUnityパッケージをインポートする。

3.1.2. ToF ARのアップグレード

既存プロジェクトのToF AR Unityツールキットをアップグレードする場合、下記の手順にて行う。

  1. アップグレードするToF ARがサポートしているバージョンのUnityで既存プロジェクトを開く。これまでと異なるバージョンのUnityで開いた場合はダイアログが表示されるのでContinue を選択する。

    image
  2. Projectビューの TofAr フォルダを削除する。

  3. メニューの Assets / ImportPackage / Custom Package… を選択し、TofAR_Base_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)をインポートする。

  4. Handコンポーネントを使用する時は、TofAR_Hand_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)も同じ手順でインポートする

  • ToF AR v1.1.0では、Unityパッケージファイルはビルド対象のプラットフォーム(Android iOS)ごとでそれぞれ基本コンポーネントとHandコンポーネントに分割されて提供される。

  • Android iOS 共にビルド対象とする場合はそれぞれのUnityパッケージをインポートする。

  • また、Handコンポーネントを使用する場合は基本コンポーネントと合わせて両方のUnityパッケージをインポートする。

  • コンパイルエラーが発生する箇所があればコードを修正する。

3.2. AR Foundationのセットアップ

3.2.1. パッケージのインストール

Unity EditorのPackage Managerより下記パッケージをインストールする。

  • AR Foundation

  • ARCore XR Plugin (Android)

  • ARKit XR Plugin (iOS)

  • ARCore Extensions for AR Foundation

AR Foundationの詳細については、 AR Foundationスタートガイド を参照。

AR Foundation と ARCore XR Plugin のインストール

AR FoundationのプラグインとしてARCoreを使用する場合のインストール方法を以下に示す。

  1. Window / Package Manager メニューより、Package Managerウィンドウを開く。

    image
  2. Package Managerウィンドウの Packages: Unity Registry を選択する。

    image
  3. 表示されたパッケージのリストから AR Foundation を選択し、インストールする。

    image
  4. 表示されたパッケージのリストから ARCore XR Plugin を選択し、インストールする。

    image
ARCore Extensions for AR Foundation のインストール

ARCore Extensions for AR Foundationをインストールする。

  1. GoogleのGitHubなどから arcore-unity-extensions-x.x.x.tgz(x.x.xはパッケージのバージョン)を Google AR GitHub から入手する。

  2. Package Managerウィンドウの + ボタンから Add Package from tarball…​ を選択し、arcore-unity-extensions-x.x.x.tgz をインストールする。

    image

3.2.2. ARFoundationConnectorのインポート

  1. Assets-Import Package-Custom Package…​ メニューを選択し、TofAR.ThirdParty.ARFoundationConnector-vx.x.x.unitypackage(vx.x.xはパッケージのバージョン)を開くと、Import Unity Packageウィンドウが開く。

  2. Import Unity Packageウィンドウの Import ボタンを選択し、パッケージをインポートする。

    image

3.2.3. ARCoreの設定

AR FoundationのプラグインとしてARCoreを使用する場合、次の設定を行う必要がある。

  1. AndroidManifest変更のため、 Assets/Plugins/Android/AndroidManifest.xml を編集する。

    対象ファイルが存在しない場合、ProjectSettings / Publishing Settings / BuildCustomMainManifest のチェックボックスをONにすることで、自動生成される。
    image
    • 設定: <application> タグ内で android:extractNativeLibs="true" とする

      image

4. ToF ARアプリケーション開発

  • ストリームデータアクセス
    ToF ARからはRGBカメラやToFカメラの映像データ、Meshの頂点情報といったRawレベルのストリームデータを取得できる。このストリームデータへのManagerクラスからのアクセスについて説明する。

  • ストリームデータの保存と再生
    ストリームデータのファイル保存方法と、ファイルからのストリームデータ再生方法を説明する。

  • AR Foundationの利用
    AR FoundationとToF ARの機能を同時利用する際の、設定方法とデバッグ方法を説明する。

  • TofARServerを用いたDebug
    TofARServerを用いた、Androidデバイスと接続してのデバッグ方法を説明する。

  • ToF ARデバイス設定
    ToF ARの標準的なToFカメラ設定(デバイスプロファイル)は自動で適用されるが、プロファイルを指定する事もできる。この指定方法を説明する。

  • ToFモード設定
    ToFカメラには、測距レンジの異なる複数のモードを切り替えることができるToFカメラがある。このモード取得と設定について説明する。

4.1. ストリームデータアクセス

4.1.1. ストリームとチャンネル

各ManagerクラスにはToFカメラの映像データやMeshの頂点情報といったRawレベルのデータをスクリプト経由で取得できるインターフェイスが用意されている。 このデータの流れをストリームと呼ぶ。ストリームの中には1種類または複数の異なるデータが格納されることがあり、個々は異なるチャンネルに格納されている。 Managerとストリーム、チャンネルの関係は下記の図のようになっている。 例えばTofArTofManagerのストリームはDepthデータ、Confidenceデータ、PointCloudデータの3つのチャンネルを持つ。

この構造は内部的なものであり、アプリケーション開発者は各チャンネルから自動更新されるManagerクラスの公開データフィールドを参照することで任意のタイミングで最新のデータを取得することができる。

image

4.1.2. イベントドリブンなデータアクセス

Managerクラスには下記のイベントが用意されており、イベントハンドラを登録することでイベントドリブンにデータを扱う事ができる。

EventName Description

OnStreamStarted

ストリームが開始された

OnStreamStopped

ストリームが停止した

OnFrameArrived

新たなデータが発生した

4.1.3. ユーザースクリプトからManagerへのアクセス

ManagerクラスはManager Prefabがシーンにインスタンス化されていれば、どのユーザースクリプトからもManagerクラスのInstanceフィールドより参照可能である。

TofArTofManagerの場合

var instance = TofArTofManager.Instance;

4.1.4. ストリームの開始と終了

Managerクラスには StartStream() メソッドと StopStream() メソッドが用意されており、任意のタイミングでストリームの開始と終了を行うことができる。

4.2. ストリームデータの保存と再生

4.2.1. ストリームデータの保存

パラメータを指定した RecordPropertySetProperty することで、ストリームデータをファイルに保存することができる。

RecordProperty入力パラメータ
Member Type Description

Enabled

bool

true : ファイル保存を行う false : ファイル保存を行わない

Path

string

ファイル保存先ディレクトリ名

Formats

Dictionary<long, string>

データフォーマット名リスト

BufferNum

int

バッファ数

サンプルコード
var recordProperty = new RecordProperty()
{
    Enabled = true,
    Path = recordingPath,
    BufferNum = 5
};
var channelInfo = TofArTofManager.Instance.GetProperty<ChannelInfoProperty>();

foreach (var channel in channelInfo.Channels)
{
    recordProperty.Formats[channel.Key] = "raw";
}

TofArTofManager.Instance.SetProperty(recordProperty);

4.2.2. ストリームデータの再生

TofArTofManager等のManagerクラスの StartPlayback(string path) メソッドをコールすることで、ファイルに保存されたストリームデータを再生することができる。
pathには保存データの格納されたディレクトリへのパスを指定する。

HandやMesh等ToFデータからデータ生成を行うコンポーネントは、TofArTofManagerで保存ファイルからのPlaybackを開始した後に StartPlayback() メソッドをコールすることでToFの再生データからリアルタイムにデータ生成を行い、ストリームデータとして使用することができる

サンプルコード
// playback from saved files.
TofArTofManager.Instance.StartPlayback(path);

// playback from playing Tof data.
TofArHandManager.Instance.StartPlayback();

4.3. AR Foundationの利用

4.3.1. ARFoundationConnector

ARFoundationConnectorを利用すると、Unityの提供する AR Foundation とToF ARの機能を同時利用することができる。
ARFoundationConnectorはAR Foundationが出力するDepthデータ、Colorデータ、Bodyデータを中継し、ToF ARへ入力する拡張機能である。

AR Foundation のセットアップ

こちらのAR Foundation のセットアップを参照。

ARFoundationConnectorの有効化
  1. TofAr.ThirdParty / ARFoundationConnector / Prefabs / ARFoundationConnector Prefabをシーンに配置する

  2. 配置した ARFoundationConnector オブジェクトの ARFoundationConnectorManager.autoStartoff に設定する

  3. シーン内に ARFoundationConnector / AR Session Origin / AR Camera 以外のCameraが存在する場合は、そのカメラのTagを MainCamera 以外に設定する

    image
  4. Project Settings / XR Plug-in Management で使用する ARKit Plug-inを有効化する

    image
Prefabs

下記の機能を有するPrefabが用意されている。

Prefab Description

ARFoundationConnectorManager

AR Foundationが出力するDepthデータ、Colorデータ等を中継し、ToF ARへ入力する アプリケーションはTofArTofManager、TofArColorManager等よりデータを取得することができる

ToggleARFoundationBodyUsage

AR FoundationのBody認識機能の有効性を切り替えることができるUIパーツ iOSでAR FoundationのBody認識機能を有効にするとAR Foundationの動作プロファイルがBodyTracking用のものに切り替わる

ToggleARFoundationFaceUsage

AR FoundationのFace認識機能の有効性を切り替えることができるUIパーツ AR FoundationのFace認識機能を有効にするとAR Foundationの動作プロファイルがFaceTracking用のものに切り替わる

4.3.2. AR Foundationを使用したアプリケーションのDebug

4.4. TofARServerを用いたDebug

TofARServerをデバイス上で実行すると、ToFカメラから取得したデータを用いて、Unity Editor上で実行したアプリケーションのデバッグを行うことができる。

4.4.1. TofARServerのセットアップ

環境設定

TofARServerをAndroidデバイス上で使用する場合、PCにインストールされたAndroid SDKのadb(Android Debug Bridge)コマンドを使用する。
TofARServerへの接続ができない場合はUnity Editorの Preference メニューの External Toolsを確認し下記設定を行う。

  1. Android SDK Tools Installed with Unity (recommended) をオフにする。

  2. SDK パス入力欄にインストール済みのAndroid SDKパスを指定する。

TofARServerのビルド、および接続設定
  1. ToF ARのパッケージに含まれる、TofAR_Server Unityプロジェクトをオープンし、ToF ARのセットアップを行う。
    セットアップは、ToF ARのセットアップを参照のこと。また、BaseとHand両方のUnityパッケージが必要。

    ToF ARのセットアップ前にプロジェクトを開くと、設定によってはセーフモードへの移行確認メッセージが表示される。 セーフモードに移行した場合、セーフモードメニューなどからセーフモードを終了してインポートを行う。
  2. アプリケーションをビルドし、端末にインストールする。

  3. Unity Editorとデバイスの接続設定を行う。

    image
    • 接続先のOS指定
      TofArManagerのInspectorで Debug Server Device で接続先のOSを指定する。
      接続先がAndroidの場合は、Play時に自動的に adb forward コマンドが実行され、接続のセットアップが行われる。

    • USB接続 / ネットワーク接続の切り替え
      TofArManagerのInspectorで Enable network debugging にチェックを入れ選択することで切り替えることができる。
      ネットワーク接続の場合は接続先のIPアドレスおよびポート番号を指定する。
      通信タイムアウト時間を Server Connection Timeout にミリ秒単位で指定することができる。

      設定変更を行った場合はUnity Editorの再起動が必要である。
  4. TofARServer画面上のポート番号をタップし、サーバー側受信ポートを変更する。

    設定変更を行った場合はTofARServerの再起動が必要である。
    image
Debug実行
  1. Unity Editorで Play を実行する。

4.4.2. AR Foundationを使用したアプリケーションのDebug

ARFoundationConnectorをTofARServerへインポートしてビルドすると、 Unity Editor上でAR Foundationが出力するデータを用いたアプリケーションを実行、デバッグを行うことができる。

TofARServerに対するARFoundationConnectorのセットアップ
  1. TofARServer Unityプロジェクトをオープンし、ToF ARとAR Foundation のセットアップを行う。

  2. ARFoundationConnector のセットアップを行う。

  3. /Assets/Samples/Scenes/Main.unity シーンをオープンする。

  4. /Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ARFoundationConnector をシーンに配置する。

  5. 配置した ARFoundationConnector オブジェクトの ARFoundationConnectorManager.autoStarton に設定する。

  6. 配置した ARFoundationConnector オブジェクトの Dont Destroy On Load (Script) のチェックを off (非アクティブ)に設定する。

    image
  7. シーン内に ARFoundationConnector/AR Session Origin/AR Camera 以外のCameraが存在する場合は、そのカメラのTagを"MainCamera"以外に設定する。

  8. (iOSのみ) /Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ToggleARFoundationBodyUsage をシーンの DebugServerCanvas に配置する。

    ToggleARFoundationBodyUsage
    AR FoundationのBody認識機能の有効性を切り替えることができるUIパーツ
  9. (iOSのみ) 配置した ToggleARFoundationBodyUsage オブジェクトの ToggleARFoundationBodyUsage.ConnectorManager にシーン内の ARFoundationConnector オブジェクトを指定する。

    image
  10. /Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ToggleARFoundationFaceUsage をシーンの DebugServerCanvas に配置する。

    ToggleARFoundationFaceUsage
    AR FoundationのFace認識機能の有効性を切り替えることができるUIパーツ
  11. 配置した ToggleARFoundationFaceUsage オブジェクトの ToggleARFoundationFaceUsage.ConnectorManager にシーン内の ARFoundationConnector オブジェクトを指定する。

    image
  12. (iOSのみ) Unity Package Manager で ARKit Face Tracking パッケージをインストールする。バージョンはARKit XR Pluginと同じとする。

  13. Project Settings / XR Plug-in Management で使用するPlug-inを有効化する。

  14. (iOSのみ) Project Settings / XR Plug-in Management / ARKitFaceTracking を有効化する。

  15. アプリケーションをビルドし、端末にインストールする。

Debug実行を行う時は、Unity Editorで Play を実行する前に、本手順で追加したTofARServer画面上の ToggleARFoundation を切り替える必要がある。

4.5. ToF ARデバイスプロファイル設定

4.5.1. ToF ARデバイス設定

ToF ARはToFカメラ固有の設定をデバイス内の設定ファイルで定義している。 標準的な設定は自動的に適用されるが、特殊な設定を行いたい場合は下記手順で設定ファイルをデバイスに書き込むことができる。

  1. デバイスをPCにUSB接続する。端末はUSBデバッグが可能な状態である必要がある。

  2. UnityでToF ARを利用するプロジェクトを開く。

  3. TofArManagerInspector を開く。

  4. Device Profile に適切な設定ファイルを設定する。

    image
    設定ファイルはUnityプロジェクト内の TofAr\TofAr\V0\Resources\DeviceProfiles フォルダに格納されている。
  5. Push to Device ボタンをクリックする。

4.6. ToFモード設定

4.6.1. ToFモード設定

ToFカメラは複数のモードを持つことがあり、それらはTofArTofManagerクラスのプロパティから取得/設定変更を行うことができる。

4.6.2. ToFモードリスト取得

ToFモードリストは、CameraConfigurationsPropertyを GetProperty() することにより取得できる。 bufferSize はToFカメラにより必要なサイズが異なるが、8192程度を指定することを推奨する。

ex)
var configurations = TofArTofManager.Instance.GetProperty(new CameraConfigurationsProperty(), 8192);

4.6.3. ToFモード変更

ToFモードは、事前に取得したToFモード情報に含まれるuidをSetConfigurationIdProperty.uidに設定し、 SetProperty() することで変更できる。

ex)
TofArTofManager.Instance.SetProperty(new SetConfigurationIdProperty() \{ uid = TargetUID });

5. チュートリアル

この章では、ToF ARを使った以下のチュートリアルについて記載する。

本チュートリアルでは、アプリケーションの作成にUnity 2020.3.36f1を使用している。
異なるUnityのバージョンを使用する場合は、Unity Editor上の表示など、若干の違いがあることに注意すること。

  • Depth映像の表示
    ToF AR Unityツールキットを使ったDepth映像表示アプリケーションの作成を通して、アプリケーションの実装からデバッグ迄の一連の流れを説明する。

  • AR Foundation(ARCore)の平面検出とToF ARの手認識を使ったアプリケーション
    このチュートリアルでは、AR Foundationで検出した平面上にCubeを置き、そのCubeをToF ARのHandで操作するアプリケーションを作成する。 このアプリケーション作成を通して、AR Foundation(ARCore)とToF ARの機能の同時利用に必要な、ARFoundationConnectorを使った実装方法を説明する。

  • PointCloudデータをParticle Systemを使って表示するアプリケーション
    Unityに備わっている機能であるParticle Systemを利用して、ToF ARで取得したPointCloudデータを表示するアプリケーションを作成する手順を説明する。
    このチュートリアルでは、ToF ARデータやTofAR_Samples_Basicで提供されているツールバーの使用法について学ぶことが出来る。

5.1. Depth映像の表示

ToF AR Unityツールキットには、アプリケーションを効率良く開発できるPrefabが用意されている。
これらのPrefabを組み合わせることにより、ToFカメラの基本的な機能を使ったアプリケーションを、比較的簡単に作成することが可能である。

このチュートリアルでは、一例として、ToF AR Unityツールキットを使って、ToFカメラのDepth映像を画面に表示するアプリケーションを作成する手順を示す。

この手順の中で、ToF ARアプリケーションの作成からデバッグまでの一連の流れを説明する。

  • アプリケーションの作成
    ToF ARのManager Prefabの基本的な使い方

  • デバイスでのアプリ実行
    端末でのToF ARアプリの動作確認の方法

  • アプリケーションのデバッグ
    端末を用いた、Unity Editor上のToF ARアプリケーションデバッグの方法

5.1.1. アプリケーションの作成

Unity Editor上でアプリケーションを作成する。

準備

ToF ARのセットアップを参照して、ToF ARのパッケージはUnityプロジェクトにセットアップ済みとする。

Handコンポーネントは本チュートリアルでは使用しないため、Handコンポーネントパッケージのインポートは不要である。
手順
TofArManagerとTofArTofManagerのインスタンス化

TofArManagerはToF ARで共通に使われる機能を提供するクラスで、Prefabとして定義されている。 これはToF ARを利用するアプリケーションに必ず必要となる。

TofArTofManagerはデバイスとの接続を管理するクラスで、Prefabとして定義されている。 これは、ToFカメラからのデータ(DepthデータやConfidenceデータなど)を取得する。

  1. Projectウィンドウの TofAr/TofAr/V0/Resources/Prefabs/TofArManager をHierarchyウィンドウへドロップする。

    image
  2. Projectウィンドウの TofAr/TofArTof/V0/Resources/Prefabs/TofArTofManager をHierarchyへドロップする。

    image
TofArTofManagerのプロパティ設定

アプリケーションを起動した時に、自動でToFカメラのデータ取得を開始するように設定する。

  1. HierarcyウィンドウでTofArTofManagerを選択する。

  2. InspectorウィンドウでAuto Startプロパティをチェックする。

    image
取得したデータの可視化設定

取得したデータを表示するために、DepthViewRawImage をインスタンス化する。
DepthViewRawImage は、Depthデータを自動的に表示してくれるクラスで、Prefabとして定義されている。 シーンに配置すると、シングルトンであるTofArTofManagerのインスタンスのストリームにアクセスしてDepthデータを取得し、TofArTofManagerのストリーム開始/終了に自動連携し表示を行う。

  1. HierarchyウィンドウのCreateメニューからUI / Panelを選択する。 Panelがインスタンス化され、Canvasの下に配置される。

    image
  2. HierarchyウィンドウでPanelを選択する。

  3. InspectorウィンドウのRect TransformAnchor Presetsで、Panel が全画面を覆うように設定する。 デフォルトでは全画面表示に設定されている。

  4. Projectウィンドウの TofAr/TofArTof/V0/Resources/Prefabs/DepthViewRawImage を、HierarchyウィンドウのPanel上にドロップする。 これにより、DepthViewRawImageはPanelの子オブジェクトとして追加される。

    image
  5. HierarchyウィンドウでDepthViewRawImageを選択する。

    image
  6. InspectorウィンドウのRect Transformなどを使って、画像の表示レイアウトを適宜修正する。

5.1.2. アプリケーションの実行

作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。

準備

開発用のPCと対象となるデバイスをUSBで接続する。

手順
アプリケーションを実行するデバイスの選択
  1. File / Build Settings… メニューよりビルド設定画面を開く。

  2. アプリケーションを実行するデバイスのプラットフォーム(OS) として、AndroidまたはiOSを選択しSwitch Platformボタンをクリックする。

    image
アプリケーションパッケージの設定
  1. Player Settings…をクリックする。

  2. Inspectorに表示されたPlayerSettings上で、Package Nameなど任意の設定を行う。

    image
アプリケーションの実行
  1. Build And Runボタンをクリックする。 アプリケーションのビルドとデバイスへのインストールが行われる。

    この時、Androidではアプリが直接デバイスにインストールされるが、iOSではXcodeプロジェクトが出力されるので、Xcodeでアプリの署名設定などを行った後、Build And Runボタンをクリックし実行する。

    image
  2. インストール後、デバイス上でアプリケーションが実行される。

    image

5.1.3. アプリケーションのデバッグ

ToF ARはPC(Windows 10 / macOS 11)とデバイスをUSBまたはネットワーク接続することにより、Unity Editor上でアプリケーションを実行し、デバッグを行うことが出来る。
この時、ビルドを実施する必要はない。

ここでは、Androidデバイス用のアプリケーションのデバッグ設定について記述する。
image
準備

開発用のPCと対象となるデバイスをUSBで接続し、デバイスがUSBデバッグ可能な設定になっていることを確認しておく。

環境設定

TofARServerをAndroidデバイス上で使用する場合、PCにインストールされたAndroid SDKの adb (Android Debug Bridge)コマンドを使用する。
TofARServerへの接続ができない場合はUnity EditorのPreferenceメニューのExternal Toolsを確認し下記設定を行う。

  1. Android SDK Tools Installed with Unity (recommended)をオフにする。

  2. SDKパス入力欄にインストール済みのAndroid SDKパスを指定する。

接続設定
  1. TofArManagerのInspectorで、Unity Editorとデバイスの接続設定を行う。(以下、例)

    image
    • TofArManagerのInspectorでDebug Server Deviceで接続先のOSを指定する。
      接続先がAndroidの場合は、Play時に自動的に adb forward コマンドが実行され、接続のセットアップが行われる。

    • TofArManagerのInspectorでEnable network debuggingを選択、または非選択することで、ネットワーク接続とUSB接続を切り替えることができる。

    • ネットワーク接続の場合は接続先のIPアドレスおよびポート番号を指定する。

    • 通信タイムアウト時間をServer Connection Timeoutにミリ秒単位で指定することができる。

      設定変更を行った場合はUnity Editorの再起動が必要である。
  2. TofARServer画面上で、サーバー側の受信ポート番号をタップし、編集を行う。

    設定変更を行った場合はTofARServerの再起動が必要である。
    image
手順
Unity Editor上でのデバッグ
  • Unity EditorでPlayを実行する。

デバイス上で実行されているTofARServerのストリームとUnity Editor上で実行しているアプリケーションのストリームが繋がることにより、アプリケーションが画像データを取得出来る。
これにより、デバイスからデータを取得しながら、デバッグすることが可能となる。

5.2. AR Foundation(ARCore)の平面検出とToF ARの手認識を使ったアプリケーション

ARFoundationConnectorを利用して、Unityの提供するAR FoundationとToF ARの機能を同時に利用したアプリケーションを開発することが出来る。

このチュートリアルでは、一例として、以下の機能を実現する、Android上で動作するアプリケーションを作成する手順を示す。

  • AR Foundationの機能を使って平面検出を行い、画面に検出平面を表示する。

  • 表示された検出平面を画面上でタッチした位置にCubeを表示する。

  • ToF ARの機能を使って、画面に映った手を認識し、skeleton handを表示する。

  • 平面上に配置されたCubeをskeleton handで触り、倒したり、位置を動かすことが出来る。

5.2.1. ビルドの設定

アプリケーションをビルドするための環境を設定する。

準備

ToF ARのパッケージをUnityプロジェクトにセットアップ済みである事。ToF ARのセットアップを参照。

AR FoundationのパッケージをUnityプロジェクトにセットアップ済みである事。AR Foundationのセットアップを参照。

手順
アプリケーションを実行するデバイスの選択
  1. File / Build Settings…​ メニューよりビルド設定画面を開く。

  2. アプリケーションを実行するデバイスのPlatform(OS)を選択する。このチュートリアルでは、Androidを選択し、Switch Platformボタンを選択する。

    image
ビルド設定
  1. ビルド設定画面のPlayer Settings…​を選択する。

  2. Project SettingsウィンドウのPlayer設定で以下の設定を行う。

  3. Other Settings / Graphics APIsVulkanが表示されていた場合、Vulkanを選択し、- ボタンで削除する。

    ARCoreがVulkanに対応していないため。
    image
  1. Other Settings / Identification / Minimum API Levelを"Android 7.0"以上に設定する。

    image
  2. Other Settings / Configuration / Scripting Backendを"IL2CPP"に設定する。

  3. Other Settings / Configuration / API Compatibility Levelを".NET 4.x"に設定する。

  4. Other Settings / Configuration / Target Architecturesを"ARM64"に設定する。

    image
  5. Publishing Settings / Build / Custom Main Manifestにチェックを入れる。
    これにより Assets\Plugins\Android\AndroidManifest.xml ファイルが作成される。

  6. 作成された AndroidManifest.xml ファイルの <application> タグ内で、attributeとして android:extractNativeLibs="true" を設定する。

    image
  7. Project SettingsウィンドウのXR Plug-in Management設定でARCoreを有効にする。

    image

5.2.2. アプリケーションの作成

Unity Editor上で、AR Foundation、およびToF ARを用いたアプリケーションを作成する。

このチュートリアルの ARFoundationConnectorを利用したAR Foundation Prefabとスクリプトの配置 以下の部分では、AR FoundationとToF ARの同時利用について説明している。 ARFoundationConnectorのAR Session Originの下に、AR Foundation Prefabやスクリプトを配置する事で、AR FoundationとToF ARの機能を同時に利用できる。

準備

AR Foundation、ARCore、およびToF ARに関連するソフトウェアは、Unityプロジェクトにセットアップ済みであること。

手順
ToF AR Manager Prefabの配置
TofArManagerのインスタンス化

TofArManagerは、ToF ARで共通に使われる機能を提供するクラスで、Prefabとして定義されている。
これはToF ARを利用するアプリケーションに必ず必要となる。

  1. Projectウィンドウの TofAr/TofAr/V0/Resources/Prefabs/TofArManager をHierarchyウィンドウのシーン上へ配置する。

    image
本アプリケーションで利用するToF AR Manager Prefabのインスタンス化
  1. Projectウィンドウの TofAr/TofArTof/V0/Resources/Prefabs/TofArTofManager をHierarchyウィンドウのシーン上へ配置する。TofArTofManagerは、デバイスとの接続を管理するクラスである。

  2. Projectウィンドウの TofAr/TofArColor/V0/Resources/Prefabs/TofArColorManager をHierarchyウィンドウのシーン上へ配置する。TofArColorManagerは、RGBカメラとの接続を管理するクラスである。

  3. Projectウィンドウの TofAr/TofArHand/V0/Resources/Prefabs/TofArHandManager をHierarchyウィンドウのシーン上へ配置する。TofArHandManagerは、Tof AR Handコンポーネントとの接続を管理するクラスである。

    image
ARFoundationConnectorを利用したAR Foundation Prefabとスクリプトの配置
ARFoundationConnectorのインスタンス化

Unityの提供するAR FoundationとToF ARの機能を同時に利用するために、ARFoundationConnectorを利用する。

  1. Projectウィンドウの TofAr.ThirdParty/ARFoundationConnector/Prefabs/ARFoundationConnector をHierarchyウィンドウのシーン上へ配置する。

    image
  2. 配置したARFoundationConnectorのInspectorウィンドウ上でARFoundationConnectorManagerのAuto Startをoffに設定する。

    image
  3. ARFoundationConnectorはAR Cameraを持っているので、Hierarchyウィンドウのシーン上からMain Cameraを削除する。

AR Session OriginへのAR Plane Managerコンポーネントの追加

ARFoundationConnector配下にあるAR Session OriginAR Plane Managerコンポーネントを追加することにより、AR平面の検出が可能になる。

  1. Hierarchyウィンドウ上でAR Session Originを選択する。

  2. Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。

  3. Searchウィンドウ上で、AR Plane Managerを検索し、追加する。

    image
AR Plane Managerの設定

AR Plane ManagerAR Default Planeをセットすることで、検出時に画面にAR平面を表示することが出来る。

  1. ProjectウィンドウのAssetsフォルダにPrefabsフォルダを作成する。

  2. Unity Editor上部のメニュー、GameObject / XR / AR Default Planeを選択し、Hierarchyウィンドウのシーン上に追加する。

    image
  3. HierarchyウィンドウのAR Default PlaneをPrefabsフォルダに配置し、Prefab化する。

    image
  4. Hierarchyウィンドウ上にある、元となったAR Default Planeは削除する。

  5. Hierarchyウィンドウ上でAR Session Originを選択し、前の操作で作成したAR Default Plane Prefabを、Inspectorウィンドウに表示されているAR Plane ManagerPlane Prefabへ設定する。

    image
  6. Inspectorウィンドウ上に表示されているAR Plane ManagerのDetection ModeをHorizontalに設定する。

    image
AR Session OriginへのAR Raycast Managerコンポーネントの追加

画面上でタッチしたAR平面上の位置を特定するためにAR Raycast Managerを使用する。

  1. Hierarchyウィンドウ上でAR Session Originを選択する。

  2. Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。

  3. Searchウィンドウ上で、AR Raycast Managerを検索し、追加する。

    image
AR平面上にCubeを表示する機能の追加

AR平面の画面上でタッチした位置にCubeを配置するC#スクリプトを作成し、AR Session Originにコンポーネントとして追加する。

  1. ProjectウィンドウのAssetsフォルダにScriptsフォルダを作成する。

  2. Hierarchyウィンドウ上でAR Session Originを選択する。

  3. Inspectorウィンドウ下部にあるAdd Componentボタンを選択し、New scriptメニューから"ObjectPlacement"というスクリプトを作成する。

    image
  4. Projectウィンドウで、作成したスクリプトをScriptsフォルダに移動する。

  5. Inspectorウィンドウ上で、AR Session Originに追加した ObjectPlacement.csEdit Scriptから開く。

    image
  6. 以下のように実装し、スクリプトを保存する。

    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR.ARFoundation;
    
    public class ObjectPlacement : MonoBehaviour
    {
        public Camera MainCamera;
        public GameObject SpawnObjectPrefab;
        public ARRaycastManager arRaycastManager;
    
        public void Update()
        {
            Touch touch;
            if (Input.touchCount > 0 && (touch = Input.GetTouch(0)).phase == TouchPhase.Began)
            {
                List<ARRaycastHit> hitResults = new List<ARRaycastHit>();
    
                if (arRaycastManager.Raycast(touch.position, hitResults, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
                {
                    foreach (ARRaycastHit hit in hitResults)
                    {
                        if (Vector3.Dot(MainCamera.transform.position - hit.pose.position, hit.pose.up) > 0)
                        {
                            // Instantiate a new game object on the hit plane
                            Vector3 position = hit.pose.position;
                            position.y += 0.15f;
                            var planeObject = Instantiate(SpawnObjectPrefab, position, hit.pose.rotation);
                        }
                    }
                }
            }
        }
    }
AR画面に表示するCubeの設定

上記で作成したObjectPlacementコンポーネントに対して、以下のような設定を行う。

  • 表示するCubeの設定として、そのCubeについて、大きさの設定、および当たり判定のためにRigidbodyの機能を追加する。

  • 画面でタッチした平面上の位置を特定するために、AR Camera、およびAR Raycast Managerを追加する。

  1. Unity Editor上部のメニュー、GameObject / 3D Object / Cubeを選択し、Hierarchyウィンドウのシーン上へ追加する。

    image
  2. Hierarchyウィンドウ上のCubeを選択し、Inspectorウィンドウ上でCubeTransformを以下の図のように設定する。

    image
  3. Inspectorウィンドウ下部にあるAdd Componentボタンを選択するとSearchウィンドウが表示される。

  4. Searchウィンドウ上で、Rigidbodyを検索し、追加する。

    image
  5. Hierarchyウィンドウ上のCubePrefabsフォルダに配置し、Prefab化する。

  6. Hierarchyウィンドウ上にある、元となったCubeは削除する。

  7. Inspectorウィンドウ上で、AR Session Originに追加したObjectPlacementのPropertyを以下のように設定する。

    • Main Camera: HierarchyウィンドウからAR Cameraを設定する。

    • Spawn Object Prefab: Prefabフォルダに移動したCubeを設定する。

    • Ar Raycast Manager: HierarchyウィンドウからAR Session Originを設定する。

      image
表示するSkeleton Handの設定
Skeleton handの表示設定

画面に表示された手を認識し、表示するための設定を行う。

  1. Hierarchyウィンドウ上でAR Cameraを選択後、Unity Editor上部のメニュー、GameObject / Create Empty Childを選択し、HierarchyウィンドウのAR Camera上へGameObjectを追加する。

    image
  2. AR Camera上へ追加したGameObjectを選択し、Inspectorウィンドウ上で名前を"RelativePositionContainer"に変更する。

    image
  3. Projectウィンドウの TofAr/TofArHand/V0/Resources/Prefabs/HandModel をHierarchyウィンドウのRelativePositionContainer上へ配置する。

    image
  4. RelativePositionContainer上へ配置したHandModelを選択し、Inspectorウィンドウ上で名前を"RightHandModel"に変更、またHandModelLr Handの設定を"Right Hand"に設定する。

    image
  5. Projectウィンドウから、二つめの TofAr/TofArHand/V0/Resources/Prefabs/HandModel をHierarchyウィンドウのRelativePositionContainer上へ配置する。

  6. RelativePositionContainer上へ配置したHandModelを選択し、Inspectorウィンドウ上で名前を"LeftHandModel"に変更、またHandModelLr Handの設定を"Left Hand"に設定する。

    image
  7. Projectウィンドウの TofAr/TofArHand/V0/Resources/Prefabs/HandCollider をHierarchyウィンドウのRelativePositionContainer上へ配置する。

    image
  8. RelativePositionContainer上へ配置したHandColliderを選択し、Inspectorウィンドウ上で名前を"RightHandCollider"に変更、またHandColliderのLr Handの設定を"Right Hand"に設定する。
    この時、TransformPositionがすべて 0 になっていることを確認する。

    image
  9. Projectウィンドウから、二つめの TofAr/TofArHand/V0/Resources/Prefabs/HandCollider をHierarchyウィンドウのRelativePositionContainer上へ配置する。

  10. RelativePositionContainer上へ配置したHandColliderを選択し、Inspectorウィンドウ上で名前を"LeftHandCollider"に変更、またHandColliderのLr Handの設定を"Left Hand"に設定する。
    この時、TransformPositionがすべて 0 になっていることを確認する。

    image
  11. 画面の向きとSkeleton handの表示向きを合わせるため、RelativePositionContainerに"Reorient Relative Color Camera"コンポーネントを追加する。

    image
AR Cameraの設定
  1. Hierarchyウィンドウ上でAR Cameraを選択し、Inspectorウィンドウ上でTarget Textureに"None"を設定する。

    image

5.2.3. アプリケーションの実行

作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。

準備

開発用のPCと対象となるデバイスをUSBで接続する。

手順
アプリケーションのビルド、およびデバイス上での実行
  • Build And Runボタンを選択する。

アプリケーションのビルドとデバイスへのインストールが行われる。 Androidではアプリが直接デバイスにインストールされる。 インストール後、デバイス上でアプリケーションが実行される。

image

5.3. PointCloudデータをParticle Systemを使って表示するアプリケーション

Unityに備わっている機能であるParticle Systemを利用して、ToF ARで取得したPointCloudデータを表示するアプリケーションを作成する手順を示す。
このチュートリアルを実施することにより、ToF ARデータやTofAR_Samples_Basicで提供されているツールバーの使用法について学ぶことが出来る。

本チュートリアルでは、iOSデバイス上で、以下のような機能を持ったアプリケーションを動作させることを想定している。

  • PointCloudデータをParticle Systemを使って表示する。

  • Particleを各PointCloudデータの位置に基づいて色付けして表示する。

  • GUIで各種表示設定を変更可能。

    image

5.3.1. ビルドの設定

アプリケーションをビルドするための環境を設定する。

準備

TofAR_Base_vx.x.x_iOS.unitypackageがUnityプロジェクトにセットアップ済みであること。 インポート方法については、ToF ARのセットアップを参照。 本チュートリアルでは、Baseコンポーネントパッケージのみを使用する。

ToF AR サンプルプログラムとして提供されているプロジェクト、TofAR_Samples_Basic ProjectがUnityプロジェクトにセットアップ済みであること。 セットアップ方法については下記を参照。

  1. TofAR_Samples_Basicプロジェクトの Assets フォルダから、TofArSamplesBasic フォルダと TofArSettings フォルダを本プロジェクトの Assets フォルダ内にコピーする。

  2. TofArSamplesBasic フォルダ内の Hand、および MarkRecog フォルダを削除する。

  3. TofArSettings フォルダ内の Scripts/Hand、および Scripts/MarkRecog フォルダを削除する。

手順
アプリケーションを実行するデバイスの選択
  1. File / Build Settings…​メニューよりビルド設定画面を開く。

  2. アプリケーションを実行するデバイスのPlatform(OS) を選択する。 本チュートリアルでは、iOSを選択し、Switch Platformボタンを選択する。

    image
ビルドの設定
  1. メニューのFile / Build Settings…​ / Player Settings / iOS Settingsボタンをクリックする。

  2. Other Settings / Configuration / Api COmpatibility Levelに、".NET 4.x"をセットする。

  3. Other Settings / Configuration / Camera Usage Descriptionに、"ToF Camera"、またはToFカメラの利用方法を説明する任意の文字列をセットする。

    image

5.3.2. アプリケーションの作成

UnityのParticle SystemとToF ARを使って、PointCloudデータを表示するプログラムを作成する。

準備

ToF ARに関連するソフトウェアは、Unityプロジェクトにセットアップ済みであること。

手順
PointCloudデータ表示機能作成

ToFカメラで取得したPointCloudデータをParticle Systemを使って表示する機能を作成する。

TofArManagerのインスタンス化

TofArManagerは、ToF ARで共通に使われる機能を提供するクラスで、ToFカメラからPointCloudデータを取得する機能を持っている。 このクラスはPrefabとして定義されており、ToF ARを利用するアプリケーションに必ず必要となる。

  1. Projectウィンドウの TofAr/TofAr/V0/Resources/Prefabs/TofArManager をHierarchyウィンドウのシーン上へ配置する。

    image
TofArTofManagerのインスタンス化

TofArTofManagerは、デバイスとの接続を管理するクラスで、Prefabとして定義されており、DepthやConfidenceデータをを取得する機能を提供する。本アプリケーションでは、PointCloudデータを取得するために使用する。

  1. Projectウィンドウの TofAr/TofArTof/V0/Resources/Prefabs/TofArTofManager をHierarchyウィンドウのシーン上へ配置する。

    image
  2. Hierarchyウィンドウ上でTofArTofManagerを選択する。

  3. Inspectorウィンドウ上でAuto StartをOffにし、アプリケーション起動時には処理をスタートしないようにする。

    image
ToFデータの制御設定

ToFカメラから取得するToFデータのFPS値やDelay値の変更、および録画、再生機能の制御を行うための設定を行う。 TofArSettingsでPrefabとして提供されているTofControllerを使うことで、TofArTofManager経由で、ToFデータに関する制御を行うことが出来る。

  1. Unity Editor上部のメニュー、GameObject / Create Emptyを選択し、Hierarchyウィンドウのシーン上に新規GameObjectを配置する。

  2. 配置したGameObjectを選択し、Inspectorウィンドウ上で名前を"Controllers"に変更する。

  3. Projectウィンドウの TofArSettings/Prefabs/Controllers/TofController をHierarchyウィンドウの Controllers 上へ配置する。

    image
Particle Systemを使った表示設定

Unityが持つParticle System機能を使用し、PointCloudデータの表示設定を行う。

  1. Unity Editor上部のメニュー、GameObject / Effect / Particle Systemを選択し、Hierarchyウィンドウのシーン上にParticle Systemを配置する。

    image
  2. 配置したParticle Systemを選択し、Inspectorウィンドウ上で名前を"PointCloud2ParticleSystem"に変更する。

  3. Transformコンポーネントを、下図のように設定する。

    image
  4. Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle Systemメインモジュールを設定する(下図参照)。

    image
  5. Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle System Rendererモジュール以外をOffにする。

    image
  6. Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle System Rendererモジュールを選択し、設定する(下図参照)。

    image
各PointCloudデータのParticleへの割り当て、およびParticle Systemへのスクリプトの追加

これにより、PointCloudデータを三次元的に表示すること出来る。

  1. Inspectorウィンドウ下部にあるAdd Componentボタンを選択し、New scriptメニューから"PointCloud2ParticleSystem"というスクリプトを作成する。

    image
  2. Inspectorウィンドウ上で、PointCloud2ParticleSystemオブジェクトに追加した PointCloud2ParticleSystem.csEdit Scriptから開く。

    image
  3. PointCloudデータをParticle Systemにセットするように実装し、保存する。
    このスクリプトでは、PointCloudデータを元にしてParticleを生成し、Particle Systemにセットする処理を行っている。
    以下に、コードの詳細を説明する。 コード全体は、PointCloud2ParticleSystem.csを参照。

    1. 処理に必要な変数を定義する。

      private ParticleSystem particleSystem;
      private ParticleSystem.Particle[] particles;
      
      private object sync = new object();
      
      private bool updated = false;
      
      private Vector3[] vs;

      以下の変数が使われている。

      • particleSystem - ParticleSystemコンポーネント

      • particles - PointCloudデータをセットするParticleデータの配列

      • sync - 排他処理のためのオブジェクト

      • updated - vsが更新されたかどうかを示すフラグ

      • vs - 取得したPointCloudデータの配列

    2. OnEnable() : オブジェクトがアクティブになった際に呼び出され、フレームデータ受信時のコールバックを設定する。

      void OnEnable()
      {
          TofArTofManager.OnFrameArrived += OnTofFrameArrived;
      }
    3. OnDisable() : オブジェクトが無効になった際に呼び出され、フレームデータ受信時のコールバックを解除する。

      private void OnDisable()
      {
          TofArTofManager.OnFrameArrived -= OnTofFrameArrived;
      }
    4. Start() : スクリプト開始時に呼び出され、ParticleSystemコンポーネントを取得する。

      void Start()
      {
          particleSystem = GetComponent<ParticleSystem>();
      }
    5. OnTofFrameArrived : ToFデータを受信する毎に呼び出され、TofArTofManagerからPointCloudデータを取得し、配列 vs にセットする。
      データをセットしたら updated フラグをtrueにする。

      private void OnTofFrameArrived(object stream)
      {
          if (!TofArTofManager.Instantiated)
          {
              return;
          }
      
          var pointCloudData = TofArTofManager.Instance.PointCloudData;
          if (pointCloudData == null || pointCloudData.Points == null)
          {
              return;
          }
      
          lock (sync)
          {
              vs = pointCloudData.Points;
          }
          updated = true;
      }
    6. Update() : Unityのフレーム毎に呼びだされ、updated フラグがtrueの場合、Particle の配列を生成する。
      vs に保持されたPointCloudデータを使ってRGB Colorデータを生成し、Particle にセットする。
      生成された Particle をParticleSystemにセットする。

      void Update()
      {
          if (updated)
          {
              updated = false;
      
              lock (sync)
              {
                  particles = new ParticleSystem.Particle[vs.Length];
                  particleSystem.GetParticles(particles);
      
                  for (int i = 0; i < vs.Length; i++)
                  {
                      particles[i].position = vs[i];
      
                      float r = Mathf.Min(1, Mathf.Max(0, (vs[i].z) / 2));
                      float g = Mathf.Min(1, Mathf.Max(0, (vs[i].y + 1f) / 2));
                      float b = Mathf.Min(1, Mathf.Max(0, (vs[i].x + 1f) / 2));
      
                      particles[i].startColor = new Color(r, g, b);
                      particles[i].startSize = 0.02f;
                  }
      
                  particleSystem.SetParticles(particles);
              }
          }
      }
  1. 作成したスクリプトを保存する。

  2. Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。

  3. Reorient With Deviceを検索し、追加する。

    image
機能設定GUI作成

画面端にツールバー表示し、ユーザーがToFカメラの設定や録画、再生機能の実行を行えるようにボタンを配置する。

image

ツールバーなど、機能を設定するGUI部品を配置し必要な設定を行う。
TofArSettingsで提供されているSettings Prefabには、Toolbar PrefabのようなGUI部品が含まれている。
このSettings Prefabをインスタンス化し、各種機能(ToFカメラ設定/録画機能/再生機能/一般設定)が使用可能になるように設定を行う。
Toolbar Prefabには、デフォルトで各種機能を起動するためのボタンが配置されている。本チュートリアルに不要な機能は非アクティブにする。

  1. Projectウィンドウの TofArSettings/Prefabs/Settings をHierarchyウィンドウのシーン上へ配置する。

    image
  2. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / CameraSettingsを選択し、Inspectorウィンドウ上でCamera SettingsUse ComponentTofを選択する。

    image
  3. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / RecordSettingsを選択し、Inspectorウィンドウ上でRecord SettingsUse ComponentTofを選択する。

    image
  4. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / RecPlayerSettingsを選択し、Inspectorウィンドウ上でRec Player SettingsUse ComponentTofを選択する。

    image
  5. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / GeneralSettingsを選択し、Inspectorウィンドウ上でGeneral SettingsUse ComponentTofを選択する。

    image
  6. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / DebugInfo / FpsPanelを選択し、Inspectorウィンドウ上でこのオブジェクトをアクティブにする(下図参照)。

    image
  7. Hierarchyウィンドウ上でSettings / Canvas / SafeArea / DebugInfo / FpsPanel /TxFpsTofを選択し、Inspectorウィンドウ上でこのオブジェクトをアクティブにする(下図参照)。

    image
  8. FpsPanelの他のオブジェクトがアクティブだった場合は、非アクティブにする。

ToFカメラ設定

画面の向き、およびユーザーの操作によって、表示画像の向きを変更するための設定を行う。 ToFカメラの画面の向き、およびユーザーが画面に触れて指をスライドすることによって、表示画像の視点を変えて表示することが出来る。

Main Cameraの設定
  1. Hierarchyウィンドウ上でMain Cameraを選択し、Inspectorウィンドウ上でTransformコンポーネントを設定する(下図参照)。

    image
  2. 同じInspcetorウィンドウ上で、Cameraコンポーネントを設定する(下図参照)。

    image
  3. Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。

  4. Searchウィンドウ上で、Camera Controllerを検索し、追加する。

    image
  5. Inspectorウィンドウ上で、Camera Controllerコンポーネントの設定を行う。

    image
ライト設定
  1. Hierarchyウィンドウ上でDirectional Lightを選択し、Inspectorウィンドウ上でLightコンポーネントのModeを"Realtime"に設定する。

    image

5.3.3. アプリケーションの実行

作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。

準備

開発用のPCと対象となるデバイスをUSBで接続する。

手順
  1. アプリケーションをビルドするために、Build And Runボタンを選択する。iOSではXcodeプロジェクトが出力される。

  2. Xcodeでアプリの署名設定などを行い、Build And Runボタンをクリックすると、アプリケーションのビルドとデバイスへのインストールが行われる。 インストール後、デバイス上でアプリケーションが実行される。

    以下に機能の概要を説明する。

    • 画面左下部のCameraボタンを押下し、使用するToFカメラとそのDepthデータサイズを選択する。

      image
    • 画面左下部のRecordボタンを押下すると、表示画像を録画することが出来る。

      image
    • 画面左下部のPlayボタンを押下すると、録画した画像を再生することが出来る。

      image
    • 画面右下部のSettingsボタンを押下すると、機能の設定のためのパネルが表示される。

      image
    • 画面上を指でタッチしてスライドすると、表示されているParticleデータを三次元的に回転させることが出来る。

      image

6. ToF AR対応端末モデル名リスト

ToF AR対応端末モデルのリスト、端末モデル毎のカメラIDとデフォルト設定については下記のリストを参照

6.1. SDK対応端末モデル名リスト

ModelGroup Model Json file

Sony Xperia 1 II

SOG01

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 II

SO-51A

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 II

XQ-AT42

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 II

XQ-AT51

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 II

XQ-AT52

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 II

XQ-AT72

sony_xperia1-2_v1.0.0.json

Sony Xperia 1 III

A101SO

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

SO-51B

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

SOG03

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

XQ-BC42

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

XQ-BC52

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

XQ-BC62

sony_xperia1-3_v1.0.0.json

Sony Xperia 1 III

XQ-BC72

sony_xperia1-3_v1.0.0.json

Sony Xperia PRO I

XQ-BE42

sony_xperiaPRO-I_v1.1.0.json

Samsung Galaxy Note10+

SC-01M

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SCV45

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N9750

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N9750/DS

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975C

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975N

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975U

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975U1

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975W

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975F

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N975F/DS

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N976B

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N976N

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N9760

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N976Q

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N976V

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy Note10+

SM-N976U

samsung_galaxy_note_10+_v1.0.0.json

Samsung Galaxy S10 5G

SC-03L

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SCV41

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973F

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973N

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9730

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9738

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973C

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973U

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973U1

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G973W

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G977B

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G977N

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G977P

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G977T

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G977U

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G770F

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G770U1

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SC-04L

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SCV42

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G975F

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G975N

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9750

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9758

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G975U

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G975U1

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G975W

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SC-05L

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G970F

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G970N

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9700

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9708

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G970U

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G970U1

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G970W

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S10 5G

SM-G9770

samsung_galaxy_s10_v1.0.0.json

Samsung Galaxy S20 Ultra

SCG03

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G9880

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988N

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988Q

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988U

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988U1

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988W

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Ultra

SM-G988B

samsung_galaxy_s20_ultra_v1.0.0.json

Samsung Galaxy S20 Plus 4G

SM-G985

samsung_galaxy_s20_plus_4G_v1.0.0.json

Samsung Galaxy S20 Plus 4G

SM-G985F

samsung_galaxy_s20_plus_4G_v1.0.0.json

Samsung Galaxy S20 Plus 4G

SM-G985F/DS

samsung_galaxy_s20_plus_4G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SC-52A

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SCG02

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G9860

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986N

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986U

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986U1

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986W

samsung_galaxy_s20_plus_5G_v1.0.0.json

Samsung Galaxy S20 Plus 5G

SM-G986B/DS

samsung_galaxy_s20_plus_5G_v1.0.0.json

Huawei P30 Pro

HW-02L

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-AL00

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-AL10

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-L04

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-L09

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-L29

huawei_p30_pro_v1.0.0.json

Huawei P30 Pro

VOG-TL00

huawei_p30_pro_v1.0.0.json

Huawei P40 Pro

ELS-NX9

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro

ELS-AN00

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro

ELS-TN00

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro

ELS-N04

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro

ELS-N29

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro

ELS-N29D

huawei_p40_pro_v1.0.0.json

Huawei P40 Pro+

ELS-AN01

huawei_p40_pro_plus_v1.0.0.json

Huawei P40 Pro+

ELS-TN10

huawei_p40_pro_plus_v1.0.0.json

Huawei P40 Pro+

ELS-N39

huawei_p40_pro_plus_v1.0.0.json

Huawei Mate30 Pro

TAS-AN00

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

TAS-TN00

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-N29

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-L09

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-AL00

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-TL00

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-AL10

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-TL10

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-AN00P

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate30 Pro

LIO-AN00

huawei_mate30_pro_5g_v1.0.0.json

Huawei Mate40 Pro

NOH-NX9

huawei_mate40_pro_v1.0.0.json

Huawei Mate40 Pro

NOH-AN00

huawei_mate40_pro_v1.0.0.json

Huawei Mate40 Pro+

NOP-NX9

huawei_mate40_pro_plus_v1.0.0.json

Huawei Mate40 Pro+

NOP-AN00

huawei_mate40_pro_plus_v1.0.0.json

Huawei Honor V20

PCT-TL10

huawei_honor_v20_v1.0.0.json

Huawei Honor V20

PCT-AL10

huawei_honor_v20_v1.0.0.json

Huawei Honor V20

PCT-L29

huawei_honor_v20_v1.0.0.json

Honor Magic3 Pro

ELZ-AN10

honor_magic3_pro_v1.0.0.json

Honor Magic3 Pro+

ELZ-AN20

honor_magic3_pro_plus_v1.0.0.json

Apple iPhoneX

iPhone10,3

none

Apple iPhoneX

iPhone10,6

none

Apple iPhoneXS

iPhone11,2

none

Apple iPhoneXS Max

iPhone11,4

none

Apple iPhoneXS Max

iPhone11,6

none

Apple iPhoneXR

iPhone11,8

none

Apple iPhone11

iPhone12,1

none

Apple iPhone11 Pro

iPhone12,3

none

Apple iPhone11 Pro Max

iPhone12,5

none

Apple iPhone12 mini

iPhone13,1

none

Apple iPhone12

iPhone13,2

none

Apple iPhone12 Pro

iPhone13,3

iphone_12_pro_v1.0.0.json

Apple iPhone12 Pro Max

iPhone13,4

iphone_12_pro_max_v1.0.0.json

Apple iPhone13 mini

iPhone14,4

none

Apple iPhone13

iPhone14,5

none

Apple iPhone13 Pro

iPhone14,2

iphone_13_pro_v1.0.0.json

Apple iPhone13 Pro Max

iPhone14,3

iphone_13_pro_max_v1.0.0.json

Apple iPad Pro 11-inch(1st generation)

iPad8,1

none

Apple iPad Pro 11-inch(1st generation)

iPad8,2

none

Apple iPad Pro 11-inch(1st generation)

iPad8,3

none

Apple iPad Pro 11-inch(1st generation)

iPad8,4

none

Apple iPad Pro 11-inch(2nd generation)

iPad8,9

ipad_pro_11_gen2_v1.0.0.json

Apple iPad Pro 11-inch(2nd generation)

iPad8,10

ipad_pro_11_gen2_v1.0.0.json

Apple iPad Pro 11-inch(3rd generation)

iPad13,4

ipad_pro_11_gen3_v1.0.0.json

Apple iPad Pro 11-inch(3rd generation)

iPad13,5

ipad_pro_11_gen3_v1.0.0.json

Apple iPad Pro 11-inch(3rd generation)

iPad13,6

ipad_pro_11_gen3_v1.0.0.json

Apple iPad Pro 11-inch(3rd generation)

iPad13,7

ipad_pro_11_gen3_v1.0.0.json

Apple iPad Pro 12.9-inch(3rd generation)

iPad8,5

none

Apple iPad Pro 12.9-inch(3rd generation)

iPad8,6

none

Apple iPad Pro 12.9-inch(3rd generation)

iPad8,7

none

Apple iPad Pro 12.9-inch(3rd generation)

iPad8,8

none

Apple iPad Pro 12.9-inch(4th generation)

iPad8,11

ipad_pro_12_9_gen4_v1.0.0.json

Apple iPad Pro 12.9-inch(4th generation)

iPad8,12

ipad_pro_12_9_gen4_v1.0.0.json

Apple iPad Pro 12.9-inch(5th generation)

iPad13,8

ipad_pro_12_9_gen5_v1.0.0.json

Apple iPad Pro 12.9-inch(5th generation)

iPad13,9

ipad_pro_12_9_gen5_v1.0.0.json

Apple iPad Pro 12.9-inch(5th generation)

iPad13,10

ipad_pro_12_9_gen5_v1.0.0.json

Apple iPad Pro 12.9-inch(5th generation)

iPad13,11

ipad_pro_12_9_gen5_v1.0.0.json

6.2. 同時起動可能なColor/DepthカメラのIDと向き

Device ColorID R/F DepthID R/F

Sony Xperia 1 II

0

Rear

5

Rear

Sony Xperia 1 III

0

Rear

5

Rear

Sony Xperia PRO I

0

Rear

5

Rear

Samsung Galaxy Note10+

0

Rear

4

Rear

Samsung Galaxy S10 5G(Snapdragon)

0

Rear

4

Rear

Samsung Galaxy S10 5G(Snapdragon)

0

Rear

5

Front

Samsung Galaxy S10 5G(Snapdragon)

1

Front

4

Rear

Samsung Galaxy S10 5G(Snapdragon)

1

Front

5

Front

Samsung Galaxy S10 5G(Snapdragon)

2

Rear

4

Rear

Samsung Galaxy S10 5G(Snapdragon)

2

Rear

5

Front

Samsung Galaxy S10 5G(Snapdragon)

3

Front

4

Rear

Samsung Galaxy S10 5G(Snapdragon)

3

Front

5

Front

Samsung Galaxy S10 5G(Exynos)

0

Rear

4

Rear

Samsung Galaxy S10 5G(Exynos)

1

Front

5

Front

Samsung Galaxy S20 Ultra

0

Rear

4

Rear

Samsung Galaxy S20+ 4G

0

Rear

4

Rear

Samsung Galaxy S20+ 5G

0

Rear

4

Rear

Huawei Honor V20

0

Rear

0

Rear

Huawei P30 Pro

0

Rear

0

Rear

Huawei P40 Pro

0

Rear

0

Rear

Huawei P40 Pro

2

Rear

7

Rear

Huawei P40 Pro+

0

Rear

0

Rear

Huawei Mate30 Pro

0

Rear

0

Rear

Huawei Mate30 Pro

1

Front

1

Front

Huawei Mate30 Pro

2

Rear

0

Rear

Huawei Mate30 Pro

2

Rear

7

Rear

Huawei Mate30 Pro

3

Front

1

Front

Huawei Mate30 Pro

3

Front

5

Front

Huawei Mate30 Pro

4

Rear

0

Rear

Huawei Mate40 Pro

1

Front

1

Front

Huawei Mate40 Pro+

0

Rear

0

Rear

Huawei Mate40 Pro+

0

Rear

8

Rear

Huawei Mate40 Pro+

1

Front

1

Front

Huawei Mate40 Pro+

1

Front

5

Front

Huawei Mate40 Pro+

2

Rear

0

Rear

Huawei Mate40 Pro+

3

Front

1

Front

Huawei Mate40 Pro+

4

Rear

0

Rear

Huawei Mate40 Pro+

6

Rear

0

Rear

Huawei Mate40 Pro+

7

Rear

0

Rear

Honor Magic3 Pro

0

Rear

3

Front

Honor Magic3 Pro

1

Front

3

Front

Honor Magic3 Pro+

0

Rear

3

Front

Honor Magic3 Pro+

1

Front

3

Front

iPhoneX

1

Front

1

Front

iPhoneXS

1

Front

1

Front

iPhoneXR

1

Front

1

Front

iPhone11

1

Front

1

Front

iPhone11 Pro

1

Front

1

Front

iPhone11 Pro Max

1

Front

1

Front

iPhone12 mini

1

Front

1

Front

iPhone12

1

Front

1

Front

iPhone12 Pro

0

Rear

0

Rear

iPhone12 Pro

1

Front

1

Front

iPhone12 Pro Max

0

Rear

0

Rear

iPhone12 Pro Max

1

Front

1

Front

iPhone13 mini

1

Front

1

Front

iPhone13

1

Front

1

Front

iPhone13 Pro

0

Rear

0

Rear

iPhone13 Pro

1

Front

1

Front

iPhone13 Pro Max

0

Rear

0

Rear

iPhone13 Pro Max

1

Front

1

Front

Apple iPad Pro 11-inch(1st generation)

1

Front

1

Front

Apple iPad Pro 11-inch(2nd generation)

0

Rear

0

Rear

Apple iPad Pro 11-inch(2nd generation)

1

Front

1

Front

Apple iPad Pro 11-inch(3rd generation)

0

Rear

0

Rear

Apple iPad Pro 11-inch(3rd generation)

1

Front

1

Front

Apple iPad Pro 12.9-inch(3rd generation)

1

Front

1

Front

Apple iPad Pro 12.9-inch(4th generation)

0

Rear

0

Rear

Apple iPad Pro 12.9-inch(4th generation)

1

Front

1

Front

Apple iPad Pro 12.9-inch(5th generation)

0

Rear

0

Rear

Apple iPad Pro 12.9-inch(5th generation)

1

Front

1

Front

6.3. HandライブラリとRuntimeModeのデフォルト設定

Device NeuralNetworkLibrary RuntimeMode RuntimeModeAfter Fallback

Sony Xperia 1 II

TFLite

GPU

GPU

TFLite

Sony Xperia 1 III

TFLite

GPU

GPU

TFLite

Sony Xperia PRO I

TFLite

GPU

GPU

TFLite

Samsung Galaxy Note10+

TFLite

GPU

GPU

TFLite

Samsung Galaxy S10 5G

TFLite

CPU

CPU

TFLite

Samsung Galaxy S20 Ultra

TFLite

GPU

GPU

TFLite

Samsung Galaxy S20+ 4G

TFLite

GPU

GPU

TFLite

Samsung Galaxy S20+ 5G

TFLite

GPU

GPU

TFLite

Huawei Honor V20

TFLite

CPU

CPU

TFLite

Huawei P30 Pro

TFLite

CPU

CPU

TFLite

Huawei P40 Pro

TFLite

CPU

CPU

TFLite

Huawei P40 Pro+

TFLite

CPU

CPU

TFLite

Huawei Mate30 Pro

TFLite

CPU

CPU

TFLite

Huawei Mate40 Pro

TFLite

CPU

CPU

TFLite

Huawei Mate40 Pro+

TFLite

CPU

CPU

TFLite

Honor Magic3 Pro

TFLite

GPU

GPU

TFLite

Honor Magic3 Pro+

TFLite

GPU

GPU

TFLite

Apple iPhoneX

TFLite

GPU

GPU

TFLite

Apple iPhoneXS

TFLite

GPU

GPU

TFLite

Apple iPhoneXS Max

TFLite

GPU

GPU

TFLite

Apple iPhoneXR

TFLite

GPU

GPU

TFLite

Apple iPhone11

TFLite

GPU

GPU

TFLite

Apple iPhone11 Pro

TFLite

GPU

GPU

TFLite

Apple iPhone11 Pro Max

TFLite

GPU

GPU

TFLite

Apple iPhone12 mini

TFLite

GPU

GPU

TFLite

Apple iPhone12

TFLite

GPU

GPU

TFLite

Apple iPhone 12 Pro

TFLite

GPU

GPU

TFLite

Apple iPhone 12 Pro Max

TFLite

GPU

GPU

TFLite

Apple iPhone13 mini

TFLite

GPU

GPU

TFLite

Apple iPhone13

TFLite

GPU

GPU

TFLite

Apple iPhone 13 Pro

TFLite

GPU

GPU

TFLite

Apple iPhone 13 Pro Max

TFLite

GPU

GPU

TFLite

Apple iPad Pro 11-inch(1st generation)

TFLite

GPU

GPU

TFLite

Apple iPad Pro 11-inch(2nd generation)

TFLite

GPU

GPU

TFLite

Apple iPad Pro 11-inch(3rd generation)

TFLite

GPU

GPU

TFLite

Apple iPad Pro 12.9-inch(3rd generation)

TFLite

GPU

GPU

TFLite

Apple iPad Pro 12.9-inch(4th generation)

TFLite

GPU

GPU

TFLite

Apple iPad Pro 12.9-inch(5th generation)

TFLite

GPU

GPU

TFLite

7. 制限事項等

7.1. ToF AR v1.1.0

  • ToF AR v1.1.0には脆弱性があるOSS libxml2 v2.9.10が含まれている。

  • Hand認識機能で RecogMode→OneHandHldSmapho, ProcessLevel→HandCenterOnly とした場合、認識結果は常に右手と認識される。

  • Unity2021でソースコード変更後のコンパイルが行われる際、Unity Editor がクラッシュする場合がある。
    Unity EditorのSceneビューを非表示とすることでクラッシュを回避することができる。

7.1.1. iOS

  • AR Foundationを利用するアプリではSceneMesh機能がサポートされていない。

  • Plane、Modelingコンポーネントはサポートされていない。

  • TofARServerはiOSデバイスとのUSB接続に対応していない。

  • Handコンポーネントの認識モード(RecogMode)はFace2Faceのみ有効である。無効な認識モードを使用すると例外が発生する。

7.1.2. Android

  • ToF、ColorコンポーネントでFPSやExposureをデフォルト値から変更した場合、機種によってはCamera2 APIが停止し映像が更新されなくなる事がある。

  • Huawei P30 ProでRuntime ModeをCPUに設定する場合、HandLibraryのパフォーマンスが落ちる。

  • Coordinateコンポーネント等でToF映像とColor映像の重ね合わせを行う場合、機種によっては位置ずれが発生する事がある。

Appendix A: 用語集

AR

Augmented Realityの略称。現実の映像に、CG等のデジタル情報を重ね合わせる技術。

ToF

Time of Flightの略称。赤外光の反射時間に基づいて、カメラから物体までの距離を計測する方法。

ToF AR

本ソフトウェアの製品名称。ToFカメラの情報を利用し、AR用の認識データを生成する特徴に由来する。製品名称はToF ARであるが、フォルダ名やパッケージ名では、TofARやTofArを用いる。

Confidence

ToFカメラが受像した、赤外反射光の強度。この値をConfidence値と呼び、通常はConfidence値が大きいと測距距離の信頼性が高い。この値の情報について、画像として表示される情報をConfidence映像、処理される情報をConfidenceデータと表記している。

Depth映像とDepthデータ

ToFカメラからの三次元情報について、表示される情報をDepth映像、処理される情報をDepthデータと表記している。

Color映像とColorデータ

RGBカメラからのRGB情報について、表示される情報をColor映像、処理される情報をColorデータと表記している。

ストリームとストリームデータ

Depthデータを始めとするToF ARで扱うデータについて、このデータのI/Fをストリーム、またI/Fから取り出したデータをストリームデータと表記している。

Appendix B: PointCloud2ParticleSystem.cs

using System.Collections;
using System.Collections.Generic;
using TofAr.V0.Tof;
using UnityEngine;

public class PointCloud2ParticleSystem : MonoBehaviour
{
    private ParticleSystem particleSystem;
    private ParticleSystem.Particle[] particles;

    private object sync = new object();

    private bool updated = false;

    private Vector3[] vs;

    // Start is called before the first frame update
    void Start()
    {
        particleSystem = GetComponent<ParticleSystem>();
    }

    void OnEnable()
    {
        TofArTofManager.OnFrameArrived += OnTofFrameArrived;
    }
    private void OnDisable()
    {
        TofArTofManager.OnFrameArrived -= OnTofFrameArrived;
    }

    // Update is called once per frame
    void Update()
    {
        if (updated)
        {
            updated = false;

            lock (sync)
            {
                particles = new ParticleSystem.Particle[vs.Length];
                particleSystem.GetParticles(particles);

                for (int i = 0; i < vs.Length; i++)
                {
                    particles[i].position = vs[i];

                    float r = Mathf.Min(1, Mathf.Max(0, (vs[i].z) / 2));
                    float g = Mathf.Min(1, Mathf.Max(0, (vs[i].y + 1f) / 2));
                    float b = Mathf.Min(1, Mathf.Max(0, (vs[i].x + 1f) / 2));

                    particles[i].startColor = new Color(r, g, b);
                    particles[i].startSize = 0.02f;
                }

                particleSystem.SetParticles(particles);
            }
        }
    }

    private void OnTofFrameArrived(object stream)
    {
        if (!TofArTofManager.Instantiated)
        {
            return;
        }

        var pointCloudData = TofArTofManager.Instance.PointCloudData;
        if (pointCloudData == null || pointCloudData.Points == null)
        {
            return;
        }

        lock (sync)
        {
            vs = pointCloudData.Points;
        }
        updated = true;
    }
}

Appendix C: 変更履歴

Version Changes

v1.1.0

Colorコンポーネント
  • RGBAフォーマットの出力に対応

  • ColorのDelayパラメータのInspector上での設定に対応

Faceコンポーネント
  • 視線方向の認識に対応

  • ノイズ低減処理追加(Android)

  • FaceMeshがcolorと一致しない不具合を修正

Handコンポーネント
  • Hand Runtime のデフォルトを GPUに変更(iOS)

  • 手を近づけすぎるとHandを認識しなくなる不具合を修正

  • 端末の向きがLandscape Rightの時に認識出来なかった不具合を修正

Slamコンポーネント
  • 6DoFに対応(iOS)

Segmentationコンポーネント
  • 使用中のシーンを閉じる際にクラッシュすることがある不具合を修正

ToFコンポーネント
  • AutoExposureをOFF→ONにして、使用中のシーンを閉じる際にクラッシュすることがある不具合を修正

その他
  • 開発に必要なソフトウェアの推奨バージョンを更新

    Unity

    Unity2020.3.28f1 → Unity2020.3.36f1
    Unity2021.2.11f1 → Unity2021.3.5f1

    AR Foundation

    V4.2.2 → V4.2.3

    ARCore Extensions

    V1.29.0 → V1.32.0

  • SDK対応端末の追加(Xperia PRO-I、Xperia 1 IIIの一部のモデル)

  • FPSの動的変更対応(iOS)

  • ARFoundationConnector使用時、ARFoundationのOcclusionManagerを使用したオクリュージョンの品質を改善

  • Plane.StartPlayback()でストリーミング開始していない場合は、ストリーミング開始通知が呼ばれないように修正

  • iPadのフロントカメラでFaceとHandを表示するとモデルがDepthとColor映像より小さく表示される不具合を修正

  • TofArHandManager.RuntimeMode の値と異なる値が取得されることがある不具合を修正

  • TofArTofManager.processDepth/processConfidence/processPointCloudの設定が反映されないことがある不具合を修正

  • 特定バージョンのUnityとVisual Studioの組み合わせでクラッシュする不具合を修正

  • 手認識動作開始後にハンドのトラッキングモードの変更が反映されない不具合を修正

  • ToF AR Server使用時、SimpleARFoundationのModeling機能が使えない不具合を修正

  • その他不具合修正

v1.0.0

ToF AR 初版リリース