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 2021.3.18f1, Unity 2022.2.6f1 (Unity 2020以上が必要)
Androidビルド、iOSビルドのセットアップが行われていること。Androidのセットアップ方法は下記リンクを参照。 Android 環境の設定 -
AR Foundation 4.2.7
-
ARCore Extensions for AR Foundation 1.35.0
1.2. ToF ARの3D座標系
ToF ARの3D座標系をカメラ座標系と呼ぶ。 カメラ座標系はToFカメラを原点とした左手座標系で単位はメートルである。

1.3. Unityワールド座標系とToFカメラ映像座標系
Unityのワールド座標系は左手座標系である。
ToFカメラ映像座標系は端末の回転方向に依存した2次元座標系である。


2. ToF ARの概要
2.1. システム構成図
ToF ARは、下記の2つで構成されている
-
ToF AR コンポーネントライブラリ : RGBカメラやToFカメラなどのハードウェアへアクセスし、アルゴリズム等を実装する為のライブラリ。
-
ToF AR Unityツールキット : ToF AR コンポーネントライブラリのUnity用ラッパー。
これらのうちアプリケーション開発者が直接利用するのはToF AR Unityツールキットである。

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

-
ストリーム
各コンポーネントで処理されたデータの転送を指す。転送されるデータは、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パッケージである。
-
Base :
TofAR_Base_xxxx_yyyy.unitypackage
-
Hand :
TofAR_Hand_xxxx_yyyy.unitypackage
xxxxはバージョン番号、 yyyyはビルド対象のプラットフォーム
2.4. パッケージ構成
ToF ARのパッケージには下記のものが含まれる。 パッケージは任意の場所に展開し利用できる。

Folder | Description |
---|---|
01_UnityProject |
ToF ARのUnityパッケージファイル |
2.5. Unityパッケージ内フォルダ構成
ToF ARをUnityにセットアップした場合のフォルダ構成は下記のようになる。

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ツールキットは下記手順でセットアップを行う。
-
Unityで新規プロジェクトを作成する
Unityプロジェクトは任意の場所を指定可能 -
メニューのFile / Build Settings… / Player Settings / Android Settings ボタンをクリックし、Other Settings内に下記設定を行う
-
Api Compatibility Level : .NET Framework ( Unity2020以前は .NET4.x )
-
Scripting Backend : IL2CPP
-
Target Architectures : ARM64のみチェックする
-
-
メニューのFile / Build Settings… / Player Settings / iOS Settings ボタンをクリックし、Other Settings内に下記設定を行う
-
Api Compatibility Level : .NET Framework ( Unity2020以前は .NET4.x )
-
Camera Usage Description : カメラの利用方法を説明する任意の文字列
-
-
メニューのAssets / ImportPackage / Custom Package…を選択し、TofAR_Base_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)をインポートする
-
Handコンポーネントを使用する時は、TofAR_Hand_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)も同じ手順でインポートする
|
3.1.2. ToF ARのアップグレード
既存プロジェクトのToF AR Unityツールキットをアップグレードする場合、下記の手順にて行う。
-
アップグレードするToF ARがサポートしているバージョンのUnityで既存プロジェクトを開く。これまでと異なるバージョンのUnityで開いた場合はダイアログが表示されるのでContinue を選択する。
-
Projectビューの TofAr フォルダを削除する。
-
メニューの Assets / ImportPackage / Custom Package… を選択し、TofAR_Base_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)をインポートする。
-
Handコンポーネントを使用する時は、TofAR_Hand_xxxx_yyyy.unitypackage (xxxxはバージョン番号, yyyyはビルド対象のプラットフォーム)も同じ手順でインポートする
|
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を使用する場合のインストール方法を以下に示す。
-
Window / Package Manager メニューより、Package Managerウィンドウを開く。
-
Package Managerウィンドウの Packages: Unity Registry を選択する。
-
表示されたパッケージのリストから AR Foundation を選択し、インストールする。
-
表示されたパッケージのリストから ARCore XR Plugin を選択し、インストールする。
ARCore Extensions for AR Foundation のインストール
ARCore Extensions for AR Foundationをインストールする。
-
GoogleのGitHubなどから arcore-unity-extensions-x.x.x.tgz(x.x.xはパッケージのバージョン)を Google AR GitHub から入手する。
-
Package Managerウィンドウの + ボタンから Add Package from tarball… を選択し、arcore-unity-extensions-x.x.x.tgz をインストールする。
3.2.2. ARFoundationConnectorのインポート
-
Assets-Import Package-Custom Package… メニューを選択し、TofAR.ThirdParty.ARFoundationConnector-vx.x.x.unitypackage(vx.x.xはパッケージのバージョン)を開くと、Import Unity Packageウィンドウが開く。
-
Import Unity Packageウィンドウの Import ボタンを選択し、パッケージをインポートする。
ToF ARのセットアップも参照。
3.2.3. ARCoreの設定
AR FoundationのプラグインとしてARCoreを使用する場合、次の設定を行う必要がある。
-
Assets/Plugins/Android/AndroidManifest.xml
のapplication
タグでandroid:extractNativeLibs="true"
を設定する。AndroidManifest.xml
が存在しない場合、ProjectSettings / Publishing Settings / Build の CustomMainManifest のチェックボックスをONにすることで、自動生成される。
3.3. Android SDK Platform の API Level 31 以上に対応するためのビルド設定
3.3.1. Unity2021の場合
Gradle設定
Android SDK Platform の API Level 31 以上に対応するためにはGradle6.7.1以上を使用する必要がある。
-
https://gradle.org/releases/ よりgradleをダウンロードし、インストールを行う。
-
UnityのPreferences / External Tools にてインストールしたGradleのパスを指定する。
プロジェクト設定変更
-
Player Settings / Publishing Settings / Custom Main Manifest と Player Settings / Publishing Settings / Custom Base Gradle Template のチェックをオンにする。
-
Assets/Plugins/Android/AndroidManifest.xml ファイル内の<application>タグ配下に下記3つの<uses-native-library>タグを追加する。
<uses-native-library android:name="libOpenCL.so" android:required="false" /> <uses-native-library android:name="libOpenCL-car.so" android:required="false" /> <uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />
-
Assets/Plugins/Android/baseProjectTemplate.gradle ファイル内com.android.tools.build:gradle:のバージョンを4.2.0以上とする。
-
Player Settings / Other Settings / Target API Levelを31以上に設定する。
3.3.2. Unity2022の場合
Gradle設定
Android SDK Platform の API Level 31 以上に対応するためにはGradle6.7.1以上を使用する必要がある。
-
Preferences / External Tools にある Gradle Installed with Unity のチェックをオンにする。
プロジェクト設定変更
-
Player Settings / Publishing Settings / Custom Main Manifest のチェックをオンにする。
-
Assets/Plugins/Android/AndroidManifest.xml ファイル内の<application>タグ配下に下記3つの<uses-native-library>タグを追加する。
<uses-native-library android:name="libOpenCL.so" android:required="false" /> <uses-native-library android:name="libOpenCL-car.so" android:required="false" /> <uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />
-
Player Settings / Other Settings / Target API Levelを31以上に設定する。
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クラスの公開データフィールドを参照することで任意のタイミングで最新のデータを取得することができる。

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. ストリームデータの保存
パラメータを指定した RecordProperty
を SetProperty
することで、ストリームデータをファイルに保存することができる。
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の有効化
-
TofAr.ThirdParty / ARFoundationConnector / Prefabs / ARFoundationConnector Prefabをシーンに配置する
-
配置した ARFoundationConnector オブジェクトの
ARFoundationConnectorManager.autoStart
を off に設定する -
シーン内に ARFoundationConnector / AR Session Origin / AR Camera 以外のCameraが存在する場合は、そのカメラのTagを MainCamera 以外に設定する
-
Project Settings / XR Plug-in Management で使用する ARKit Plug-inを有効化する
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
こちらのAR Foundationを使用したアプリケーションのDebugを参照。
4.4. TofARServerを用いたDebug
TofARServerをデバイス上で実行すると、ToFカメラから取得したデータを用いて、Unity
Editor上で実行したアプリケーションのデバッグを行うことができる。
Unity Editor上で使用しているToF ARのバージョンとToF AR Serverで使用されているToF ARのバージョンは、同じバージョンにする必要がある。 |
4.4.1. TofARServerのセットアップ
環境設定
TofARServerをAndroidデバイス上で使用する場合、PCにインストールされたAndroid
SDKのadb(Android Debug Bridge)コマンドを使用する。
TofARServerへの接続ができない場合はUnity
Editorの Preference メニューの External Toolsを確認し下記設定を行う。
-
Android SDK Tools Installed with Unity (recommended) をオフにする。
-
SDK パス入力欄にインストール済みのAndroid SDKパスを指定する。
TofARServerのビルド、および接続設定
-
ToF ARのパッケージに含まれる、TofAR_Server Unityプロジェクトをオープンし、ToF ARのセットアップを行う。
セットアップは、ToF ARのセットアップを参照のこと。また、BaseとHand両方のUnityパッケージが必要。ToF ARのセットアップ前にプロジェクトを開くと、設定によってはセーフモードへの移行確認メッセージが表示される。 セーフモードに移行した場合、セーフモードメニューなどからセーフモードを終了してインポートを行う。 -
アプリケーションをビルドし、端末にインストールする。
-
Unity Editorとデバイスの接続設定を行う。
-
接続先のOS指定
TofArManagerのInspectorで Debug Server Device で接続先のOSを指定する。
接続先がAndroidの場合は、Play時に自動的にadb forward
コマンドが実行され、接続のセットアップが行われる。 -
USB接続 / ネットワーク接続の切り替え
TofArManagerのInspectorで Enable network debugging にチェックを入れ選択することで切り替えることができる。
ネットワーク接続の場合は接続先のIPアドレスおよびポート番号を指定する。
通信タイムアウト時間を Server Connection Timeout にミリ秒単位で指定することができる。設定変更を行った場合はUnity Editorの再起動が必要である。
-
-
TofARServer画面上のポート番号をタップし、サーバー側受信ポートを変更する。
設定変更を行った場合はTofARServerの再起動が必要である。
Debug実行
-
Unity Editorで Play を実行する。
4.4.2. AR Foundationを使用したアプリケーションのDebug
ARFoundationConnectorをTofARServerへインポートしてビルドすると、 Unity Editor上でAR Foundationが出力するデータを用いたアプリケーションを実行、デバッグを行うことができる。
TofARServerに対するARFoundationConnectorのセットアップ
-
TofARServer Unityプロジェクトをオープンし、ToF ARとAR Foundation のセットアップを行う。
-
ARFoundationConnector のセットアップを行う。
-
/Assets/Samples/Scenes/Main.unity
シーンをオープンする。 -
/Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ARFoundationConnector
をシーンに配置する。 -
配置した
ARFoundationConnector
オブジェクトのARFoundationConnectorManager.autoStart
を on に設定する。 -
配置した
ARFoundationConnector
オブジェクトのDont Destroy On Load (Script)
のチェックを off (非アクティブ)に設定する。 -
シーン内に
ARFoundationConnector/AR Session Origin/AR Camera
以外のCameraが存在する場合は、そのカメラのTagを"MainCamera"以外に設定する。 -
(iOSのみ)
/Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ToggleARFoundationBodyUsage
をシーンのDebugServerCanvas
に配置する。ToggleARFoundationBodyUsage
AR FoundationのBody認識機能の有効性を切り替えることができるUIパーツ -
(iOSのみ) 配置した
ToggleARFoundationBodyUsage
オブジェクトのToggleARFoundationBodyUsage.ConnectorManager
にシーン内のARFoundationConnector
オブジェクトを指定する。 -
/Assets/TofAr.ThirdParty/ARFoundationConnector/Prefabs/ToggleARFoundationFaceUsage
をシーンのDebugServerCanvas
に配置する。ToggleARFoundationFaceUsage
AR FoundationのFace認識機能の有効性を切り替えることができるUIパーツ -
配置した
ToggleARFoundationFaceUsage
オブジェクトのToggleARFoundationFaceUsage.ConnectorManager
にシーン内のARFoundationConnector
オブジェクトを指定する。 -
(iOSのみ) Unity Package Manager で ARKit Face Tracking パッケージをインストールする。バージョンはARKit XR Pluginと同じとする。
-
Project Settings / XR Plug-in Management で使用するPlug-inを有効化する。
-
(iOSのみ) Project Settings / XR Plug-in Management / ARKit で FaceTracking を有効化する。
-
アプリケーションをビルドし、端末にインストールする。
Debug実行を行う時は、Unity Editorで Play を実行する前に、本手順で追加したTofARServer画面上の ToggleARFoundation を切り替える必要がある。 |
4.5. ToF ARデバイスプロファイル設定
4.5.1. ToF ARデバイス設定
ToF ARはToFカメラ固有の設定をデバイス内の設定ファイルで定義している。 標準的な設定は自動的に適用されるが、特殊な設定を行いたい場合は下記手順で設定ファイルをデバイスに書き込むことができる。
-
デバイスをPCにUSB接続する。端末はUSBデバッグが可能な状態である必要がある。
-
UnityでToF ARを利用するプロジェクトを開く。
-
TofArManager の Inspector を開く。
-
Device Profile に適切な設定ファイルを設定する。
設定ファイルはUnityプロジェクト内の TofAr\TofAr\V0\Resources\DeviceProfiles
フォルダに格納されている。 -
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
2021.3.18f1を使用している。 |
-
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データなど)を取得する。
-
Projectウィンドウの
TofAr/TofAr/TofArManager
をHierarchyウィンドウへドロップする。 -
Projectウィンドウの
TofAr/TofArTof/TofArTofManager
をHierarchyへドロップする。
TofArTofManagerのプロパティ設定
アプリケーションを起動した時に、自動でToFカメラのデータ取得を開始するように設定する。
-
HierarcyウィンドウでTofArTofManagerを選択する。
-
InspectorウィンドウでAuto Startプロパティをチェックする。
取得したデータの可視化設定
取得したデータを表示するために、DepthViewRawImage
をインスタンス化する。
DepthViewRawImage
は、Depthデータを自動的に表示してくれるクラスで、Prefabとして定義されている。
シーンに配置すると、シングルトンであるTofArTofManagerのインスタンスのストリームにアクセスしてDepthデータを取得し、TofArTofManagerのストリーム開始/終了に自動連携し表示を行う。
-
HierarchyウィンドウのCreateメニューからUI / Panelを選択する。 Panelがインスタンス化され、Canvasの下に配置される。
-
HierarchyウィンドウでPanelを選択する。
-
InspectorウィンドウのRect TransformのAnchor Presetsで、Panel が全画面を覆うように設定する。 デフォルトでは全画面表示に設定されている。
-
Projectウィンドウの
TofAr/TofArTof/V0/Resources/Prefabs/DepthViewRawImage
を、HierarchyウィンドウのPanel上にドロップする。 これにより、DepthViewRawImageはPanelの子オブジェクトとして追加される。 -
HierarchyウィンドウでDepthViewRawImageを選択する。
-
InspectorウィンドウのRect Transformなどを使って、画像の表示レイアウトを適宜修正する。
5.1.2. アプリケーションの実行
作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。
準備
開発用のPCと対象となるデバイスをUSBで接続する。
手順
アプリケーションを実行するデバイスの選択
-
File / Build Settings… メニューよりビルド設定画面を開く。
-
アプリケーションを実行するデバイスのプラットフォーム(OS) として、AndroidまたはiOSを選択しSwitch Platformボタンをクリックする。
アプリケーションパッケージの設定
-
Player Settings…をクリックする。
-
Inspectorに表示されたPlayerSettings上で、Package Nameなど任意の設定を行う。
アプリケーションの実行
-
Build And Runボタンをクリックする。 アプリケーションのビルドとデバイスへのインストールが行われる。
この時、Androidではアプリが直接デバイスにインストールされるが、iOSではXcodeプロジェクトが出力されるので、Xcodeでアプリの署名設定などを行った後、Build And Runボタンをクリックし実行する。
-
インストール後、デバイス上でアプリケーションが実行される。
5.1.3. アプリケーションのデバッグ
ToF ARはPC(Windows 10 /
macOS 11)とデバイスをUSBまたはネットワーク接続することにより、Unity
Editor上でアプリケーションを実行し、デバッグを行うことが出来る。
この時、ビルドを実施する必要はない。
ここでは、Androidデバイス用のアプリケーションのデバッグ設定について記述する。 |

準備
開発用のPCと対象となるデバイスをUSBで接続し、デバイスがUSBデバッグ可能な設定になっていることを確認しておく。
環境設定
TofARServerをAndroidデバイス上で使用する場合、PCにインストールされたAndroid
SDKの adb
(Android Debug Bridge)コマンドを使用する。
TofARServerへの接続ができない場合はUnity
EditorのPreferenceメニューのExternal Toolsを確認し下記設定を行う。
-
Android SDK Tools Installed with Unity (recommended)をオフにする。
-
SDKパス入力欄にインストール済みのAndroid SDKパスを指定する。
接続設定
-
TofArManagerのInspectorで、Unity Editorとデバイスの接続設定を行う。(以下、例)
-
TofArManagerのInspectorでDebug Server Deviceで接続先のOSを指定する。
接続先がAndroidの場合は、Play時に自動的にadb forward
コマンドが実行され、接続のセットアップが行われる。 -
TofArManagerのInspectorでEnable network debuggingを選択、または非選択することで、ネットワーク接続とUSB接続を切り替えることができる。
-
ネットワーク接続の場合は接続先のIPアドレスおよびポート番号を指定する。
-
通信タイムアウト時間をServer Connection Timeoutにミリ秒単位で指定することができる。
設定変更を行った場合はUnity Editorの再起動が必要である。
-
-
TofARServer画面上で、サーバー側の受信ポート番号をタップし、編集を行う。
設定変更を行った場合はTofARServerの再起動が必要である。
手順
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のセットアップを参照。
手順
アプリケーションを実行するデバイスの選択
-
File / Build Settings… メニューよりビルド設定画面を開く。
-
アプリケーションを実行するデバイスのPlatform(OS)を選択する。このチュートリアルでは、Androidを選択し、Switch Platformボタンを選択する。
ビルド設定
-
ビルド設定画面のPlayer Settings…を選択する。
-
Project SettingsウィンドウのPlayer設定で以下の設定を行う。
-
Other Settings / Graphics APIsにVulkanが表示されていた場合、Vulkanを選択し、- ボタンで削除する。
ARCoreがVulkanに対応していないため。
-
Other Settings / Identification / Minimum API Levelを"Android 7.0"以上に設定する。
-
Other Settings / Configuration / Scripting Backendを"IL2CPP"に設定する。
-
Other Settings / Configuration / API Compatibility Levelを".NET 4.x"に設定する。
-
Other Settings / Configuration / Target Architecturesを"ARM64"に設定する。
-
Publishing Settings / Build / Custom Main Manifestにチェックを入れる。
これによりAssets\Plugins\Android\AndroidManifest.xml
ファイルが作成される。 -
作成された
AndroidManifest.xml
ファイルの<application>
タグ内で、attributeとしてandroid:extractNativeLibs="true"
を設定する。 -
Project SettingsウィンドウのXR Plug-in Management設定でARCoreを有効にする。
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は、ToF ARで共通に使われる機能を提供するクラスで、Prefabとして定義されている。
これはToF ARを利用するアプリケーションに必ず必要となる。
-
Projectウィンドウの
TofAr/TofAr/TofArManager
をHierarchyウィンドウのシーン上へ配置する。
-
Projectウィンドウの
TofAr/TofArTof/TofArTofManager
をHierarchyウィンドウのシーン上へ配置する。TofArTofManagerは、デバイスとの接続を管理するクラスである。 -
Projectウィンドウの
TofAr/TofArColor/TofArColorManager
をHierarchyウィンドウのシーン上へ配置する。TofArColorManagerは、RGBカメラとの接続を管理するクラスである。 -
Projectウィンドウの
TofAr/TofArHand/TofArHandManager
をHierarchyウィンドウのシーン上へ配置する。TofArHandManagerは、Tof AR Handコンポーネントとの接続を管理するクラスである。
ARFoundationConnectorを利用したAR Foundation Prefabとスクリプトの配置
Unityの提供するAR FoundationとToF ARの機能を同時に利用するために、ARFoundationConnectorを利用する。
-
Projectウィンドウの
TofAr.ThirdParty/ARFoundationConnector/Prefabs/ARFoundationConnector
をHierarchyウィンドウのシーン上へ配置する。 -
配置したARFoundationConnectorのInspectorウィンドウ上でARFoundationConnectorManagerのAuto Startをoffに設定する。
-
ARFoundationConnectorはAR Cameraを持っているので、Hierarchyウィンドウのシーン上からMain Cameraを削除する。
ARFoundationConnector配下にあるAR Session OriginにAR Plane Managerコンポーネントを追加することにより、AR平面の検出が可能になる。
-
Hierarchyウィンドウ上でAR Session Originを選択する。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。
-
Searchウィンドウ上で、AR Plane Managerを検索し、追加する。
AR Plane ManagerにAR Default Planeをセットすることで、検出時に画面にAR平面を表示することが出来る。
-
ProjectウィンドウのAssetsフォルダにPrefabsフォルダを作成する。
-
Unity Editor上部のメニュー、GameObject / XR / AR Default Planeを選択し、Hierarchyウィンドウのシーン上に追加する。
-
HierarchyウィンドウのAR Default PlaneをPrefabsフォルダに配置し、Prefab化する。
-
Hierarchyウィンドウ上にある、元となったAR Default Planeは削除する。
-
Hierarchyウィンドウ上でAR Session Originを選択し、前の操作で作成したAR Default Plane Prefabを、Inspectorウィンドウに表示されているAR Plane ManagerのPlane Prefabへ設定する。
-
Inspectorウィンドウ上に表示されているAR Plane ManagerのDetection ModeをHorizontalに設定する。
画面上でタッチしたAR平面上の位置を特定するためにAR Raycast Managerを使用する。
-
Hierarchyウィンドウ上でAR Session Originを選択する。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。
-
Searchウィンドウ上で、AR Raycast Managerを検索し、追加する。
AR平面の画面上でタッチした位置にCubeを配置するC#スクリプトを作成し、AR Session Originにコンポーネントとして追加する。
-
ProjectウィンドウのAssetsフォルダにScriptsフォルダを作成する。
-
Hierarchyウィンドウ上でAR Session Originを選択する。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択し、New scriptメニューから"ObjectPlacement"というスクリプトを作成する。
-
Projectウィンドウで、作成したスクリプトをScriptsフォルダに移動する。
-
Inspectorウィンドウ上で、AR Session Originに追加した
ObjectPlacement.cs
をEdit Scriptから開く。 -
以下のように実装し、スクリプトを保存する。
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); } } } } } }
上記で作成したObjectPlacementコンポーネントに対して、以下のような設定を行う。
-
表示するCubeの設定として、そのCubeについて、大きさの設定、および当たり判定のためにRigidbodyの機能を追加する。
-
画面でタッチした平面上の位置を特定するために、AR Camera、およびAR Raycast Managerを追加する。
-
Unity Editor上部のメニュー、GameObject / 3D Object / Cubeを選択し、Hierarchyウィンドウのシーン上へ追加する。
-
Hierarchyウィンドウ上のCubeを選択し、Inspectorウィンドウ上でCubeのTransformを以下の図のように設定する。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択するとSearchウィンドウが表示される。
-
Searchウィンドウ上で、Rigidbodyを検索し、追加する。
-
Hierarchyウィンドウ上のCubeをPrefabsフォルダに配置し、Prefab化する。
-
Hierarchyウィンドウ上にある、元となったCubeは削除する。
-
Inspectorウィンドウ上で、AR Session Originに追加したObjectPlacementのPropertyを以下のように設定する。
-
Main Camera: HierarchyウィンドウからAR Cameraを設定する。
-
Spawn Object Prefab: Prefabフォルダに移動したCubeを設定する。
-
Ar Raycast Manager: HierarchyウィンドウからAR Session Originを設定する。
-
表示するSkeleton Handの設定
画面に表示された手を認識し、表示するための設定を行う。
-
Hierarchyウィンドウ上でAR Cameraを選択後、Unity Editor上部のメニュー、GameObject / Create Empty Childを選択し、HierarchyウィンドウのAR Camera上へGameObjectを追加する。
-
AR Camera上へ追加したGameObjectを選択し、Inspectorウィンドウ上で名前を"RelativePositionContainer"に変更する。
-
Projectウィンドウの
TofAr/TofArHand/V0/Resources/Prefabs/HandModel
をHierarchyウィンドウのRelativePositionContainer上へ配置する。 -
RelativePositionContainer上へ配置したHandModelを選択し、Inspectorウィンドウ上で名前を"RightHandModel"に変更、またHandModelのLr Handの設定を"Right Hand"に設定する。
-
Projectウィンドウから、二つめの
TofAr/TofArHand/V0/Resources/Prefabs/HandModel
をHierarchyウィンドウのRelativePositionContainer上へ配置する。 -
RelativePositionContainer上へ配置したHandModelを選択し、Inspectorウィンドウ上で名前を"LeftHandModel"に変更、またHandModelのLr Handの設定を"Left Hand"に設定する。
-
Projectウィンドウの
TofAr/TofArHand/V0/Resources/Prefabs/HandCollider
をHierarchyウィンドウのRelativePositionContainer上へ配置する。 -
RelativePositionContainer上へ配置したHandColliderを選択し、Inspectorウィンドウ上で名前を"RightHandCollider"に変更、またHandColliderのLr Handの設定を"Right Hand"に設定する。
この時、TransformのPositionがすべて 0 になっていることを確認する。 -
Projectウィンドウから、二つめの
TofAr/TofArHand/V0/Resources/Prefabs/HandCollider
をHierarchyウィンドウのRelativePositionContainer上へ配置する。 -
RelativePositionContainer上へ配置したHandColliderを選択し、Inspectorウィンドウ上で名前を"LeftHandCollider"に変更、またHandColliderのLr Handの設定を"Left Hand"に設定する。
この時、TransformのPositionがすべて 0 になっていることを確認する。 -
画面の向きとSkeleton handの表示向きを合わせるため、RelativePositionContainerに"Reorient Relative Color Camera"コンポーネントを追加する。
-
Hierarchyウィンドウ上でAR Cameraを選択し、Inspectorウィンドウ上でTarget Textureに"None"を設定する。
5.2.3. アプリケーションの実行
作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。
準備
開発用のPCと対象となるデバイスをUSBで接続する。
手順
アプリケーションのビルド、およびデバイス上での実行
-
Build And Runボタンを選択する。
アプリケーションのビルドとデバイスへのインストールが行われる。 Androidではアプリが直接デバイスにインストールされる。 インストール後、デバイス上でアプリケーションが実行される。

5.3. PointCloudデータをParticle Systemを使って表示するアプリケーション
Unityに備わっている機能であるParticle Systemを利用して、ToF ARで取得したPointCloudデータを表示するアプリケーションを作成する手順を示す。
このチュートリアルを実施することにより、ToF ARデータやTofAR_Samples_Basicで提供されているツールバーの使用法について学ぶことが出来る。
本チュートリアルでは、iOSデバイス上で、以下のような機能を持ったアプリケーションを動作させることを想定している。
-
PointCloudデータをParticle Systemを使って表示する。
-
Particleを各PointCloudデータの位置に基づいて色付けして表示する。
-
GUIで各種表示設定を変更可能。
5.3.1. ビルドの設定
アプリケーションをビルドするための環境を設定する。
準備
TofAR_Base_vx.x.x_iOS.unitypackageがUnityプロジェクトにセットアップ済みであること。 インポート方法については、ToF ARのセットアップを参照。 本チュートリアルでは、Baseコンポーネントパッケージのみを使用する。
ToF AR サンプルプログラムとして提供されているプロジェクト、TofAR_Samples_Basic ProjectがUnityプロジェクトにセットアップ済みであること。 セットアップ方法については下記を参照。
-
TofAR_Samples_Basicプロジェクトの
Assets
フォルダから、TofArSamplesBasic
フォルダとTofArSettings
フォルダを本プロジェクトのAssets
フォルダ内にコピーする。 -
TofArSamplesBasic
フォルダ内のHand
、およびMarkRecog
フォルダを削除する。 -
TofArSettings
フォルダ内のScripts/Hand
、およびScripts/MarkRecog
フォルダを削除する。
手順
アプリケーションを実行するデバイスの選択
-
File / Build Settings…メニューよりビルド設定画面を開く。
-
アプリケーションを実行するデバイスのPlatform(OS) を選択する。 本チュートリアルでは、iOSを選択し、Switch Platformボタンを選択する。
ビルドの設定
-
メニューのFile / Build Settings… / Player Settings / iOS Settingsボタンをクリックする。
-
Other Settings / Configuration / Api COmpatibility Levelに、".NET 4.x"をセットする。
-
Other Settings / Configuration / Camera Usage Descriptionに、"ToF Camera"、またはToFカメラの利用方法を説明する任意の文字列をセットする。
5.3.2. アプリケーションの作成
UnityのParticle SystemとToF ARを使って、PointCloudデータを表示するプログラムを作成する。
準備
ToF ARに関連するソフトウェアは、Unityプロジェクトにセットアップ済みであること。
手順
PointCloudデータ表示機能作成
ToFカメラで取得したPointCloudデータをParticle Systemを使って表示する機能を作成する。
TofArManagerは、ToF ARで共通に使われる機能を提供するクラスで、ToFカメラからPointCloudデータを取得する機能を持っている。 このクラスはPrefabとして定義されており、ToF ARを利用するアプリケーションに必ず必要となる。
-
Projectウィンドウの
TofAr/TofAr/TofArManager
をHierarchyウィンドウのシーン上へ配置する。
TofArTofManagerは、デバイスとの接続を管理するクラスで、Prefabとして定義されており、DepthやConfidenceデータをを取得する機能を提供する。本アプリケーションでは、PointCloudデータを取得するために使用する。
-
Projectウィンドウの
TofAr/TofArTof/TofArTofManager
をHierarchyウィンドウのシーン上へ配置する。 -
Hierarchyウィンドウ上でTofArTofManagerを選択する。
-
Inspectorウィンドウ上でAuto StartをOffにし、アプリケーション起動時には処理をスタートしないようにする。
ToFカメラから取得するToFデータのFPS値やDelay値の変更、および録画、再生機能の制御を行うための設定を行う。 TofArSettingsでPrefabとして提供されているTofControllerを使うことで、TofArTofManager経由で、ToFデータに関する制御を行うことが出来る。
-
Unity Editor上部のメニュー、GameObject / Create Emptyを選択し、Hierarchyウィンドウのシーン上に新規GameObjectを配置する。
-
配置したGameObjectを選択し、Inspectorウィンドウ上で名前を"Controllers"に変更する。
-
Projectウィンドウの
TofArSettings/Prefabs/Controllers/TofController
をHierarchyウィンドウのControllers
上へ配置する。
Unityが持つParticle System機能を使用し、PointCloudデータの表示設定を行う。
-
Unity Editor上部のメニュー、GameObject / Effect / Particle Systemを選択し、Hierarchyウィンドウのシーン上にParticle Systemを配置する。
-
配置したParticle Systemを選択し、Inspectorウィンドウ上で名前を"PointCloud2ParticleSystem"に変更する。
-
Transformコンポーネントを、下図のように設定する。
-
Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle Systemメインモジュールを設定する(下図参照)。
-
Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle System Rendererモジュール以外をOffにする。
-
Inspectorウィンドウ上でPointCloud2ParticleSystemのParticle System Rendererモジュールを選択し、設定する(下図参照)。
これにより、PointCloudデータを三次元的に表示すること出来る。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択し、New scriptメニューから"PointCloud2ParticleSystem"というスクリプトを作成する。
-
Inspectorウィンドウ上で、PointCloud2ParticleSystemオブジェクトに追加した
PointCloud2ParticleSystem.cs
をEdit Scriptから開く。 -
PointCloudデータをParticle Systemにセットするように実装し、保存する。
このスクリプトでは、PointCloudデータを元にしてParticleを生成し、Particle Systemにセットする処理を行っている。
以下に、コードの詳細を説明する。 コード全体は、PointCloud2ParticleSystem.csを参照。-
処理に必要な変数を定義する。
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データの配列
-
-
OnEnable()
: オブジェクトがアクティブになった際に呼び出され、フレームデータ受信時のコールバックを設定する。void OnEnable() { TofArTofManager.OnFrameArrived += OnTofFrameArrived; }
-
OnDisable()
: オブジェクトが無効になった際に呼び出され、フレームデータ受信時のコールバックを解除する。private void OnDisable() { TofArTofManager.OnFrameArrived -= OnTofFrameArrived; }
-
Start()
: スクリプト開始時に呼び出され、ParticleSystemコンポーネントを取得する。void Start() { particleSystem = GetComponent<ParticleSystem>(); }
-
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; }
-
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); } } }
-
-
作成したスクリプトを保存する。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。
-
Reorient With Deviceを検索し、追加する。
機能設定GUI作成
画面端にツールバー表示し、ユーザーがToFカメラの設定や録画、再生機能の実行を行えるようにボタンを配置する。

ツールバーなど、機能を設定するGUI部品を配置し必要な設定を行う。
TofArSettingsで提供されているSettings Prefabには、Toolbar PrefabのようなGUI部品が含まれている。
このSettings Prefabをインスタンス化し、各種機能(ToFカメラ設定/録画機能/再生機能/一般設定)が使用可能になるように設定を行う。
Toolbar Prefabには、デフォルトで各種機能を起動するためのボタンが配置されている。本チュートリアルに不要な機能は非アクティブにする。
-
Projectウィンドウの
TofArSettings/Prefabs/Settings
をHierarchyウィンドウのシーン上へ配置する。 -
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / CameraSettingsを選択し、Inspectorウィンドウ上でCamera SettingsのUse ComponentでTofを選択する。
-
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / RecordSettingsを選択し、Inspectorウィンドウ上でRecord SettingsのUse ComponentでTofを選択する。
-
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / RecPlayerSettingsを選択し、Inspectorウィンドウ上でRec Player SettingsのUse ComponentでTofを選択する。
-
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / Panels / GeneralSettingsを選択し、Inspectorウィンドウ上でGeneral SettingsのUse ComponentでTofを選択する。
-
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / DebugInfo / FpsPanelを選択し、Inspectorウィンドウ上でこのオブジェクトをアクティブにする(下図参照)。
-
Hierarchyウィンドウ上でSettings / Canvas / SafeArea / DebugInfo / FpsPanel /TxFpsTofを選択し、Inspectorウィンドウ上でこのオブジェクトをアクティブにする(下図参照)。
-
FpsPanelの他のオブジェクトがアクティブだった場合は、非アクティブにする。
ToFカメラ設定
画面の向き、およびユーザーの操作によって、表示画像の向きを変更するための設定を行う。 ToFカメラの画面の向き、およびユーザーが画面に触れて指をスライドすることによって、表示画像の視点を変えて表示することが出来る。
-
Hierarchyウィンドウ上でMain Cameraを選択し、Inspectorウィンドウ上でTransformコンポーネントを設定する(下図参照)。
-
同じInspcetorウィンドウ上で、Cameraコンポーネントを設定する(下図参照)。
-
Inspectorウィンドウ下部にあるAdd Componentボタンを選択すると、Searchウィンドウが表示される。
-
Searchウィンドウ上で、Camera Controllerを検索し、追加する。
-
Inspectorウィンドウ上で、Camera Controllerコンポーネントの設定を行う。
ライト設定
-
Hierarchyウィンドウ上でDirectional Lightを選択し、Inspectorウィンドウ上でLightコンポーネントのModeを"Realtime"に設定する。
5.3.3. アプリケーションの実行
作成したアプリケーションをターゲットとなるデバイスで実行可能な形式にビルドする。
その実行ファイルをデバイス上にインストールし実行する。
準備
開発用のPCと対象となるデバイスをUSBで接続する。
手順
-
アプリケーションをビルドするために、Build And Runボタンを選択する。iOSではXcodeプロジェクトが出力される。
-
Xcodeでアプリの署名設定などを行い、Build And Runボタンをクリックすると、アプリケーションのビルドとデバイスへのインストールが行われる。 インストール後、デバイス上でアプリケーションが実行される。
以下に機能の概要を説明する。
-
画面左下部のCameraボタンを押下し、使用するToFカメラとそのDepthデータサイズを選択する。
-
画面左下部のRecordボタンを押下すると、表示画像を録画することが出来る。
-
画面左下部のPlayボタンを押下すると、録画した画像を再生することが出来る。
-
画面右下部のSettingsボタンを押下すると、機能の設定のためのパネルが表示される。
-
画面上を指でタッチしてスライドすると、表示されているParticleデータを三次元的に回転させることが出来る。
-
6. ToF AR対応端末モデル名リスト
ToF AR対応端末モデルのリスト、端末モデル毎のカメラIDとデフォルト設定については下記のリストを参照
6.1. SDK対応端末モデル名リスト
ModelGroup | Model | Json file |
---|---|---|
Sony Xperia 1 II |
SOG01 |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 II |
SO-51A |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 II |
XQ-AT42 |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 II |
XQ-AT51 |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 II |
XQ-AT52 |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 II |
XQ-AT72 |
sony_xperia1-2_v1.2.0.json |
Sony Xperia 1 III |
A101SO |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
SO-51B |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
SOG03 |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
XQ-BC42 |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
XQ-BC52 |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
XQ-BC62 |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 III |
XQ-BC72 |
sony_xperia1-3_v1.2.0.json |
Sony Xperia 1 IV |
A201SO |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
SO-51C |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
SOG06 |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
XQ-CT44 |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
XQ-CT54 |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
XQ-CT62 |
sony_xperia1-4_v1.2.0.json |
Sony Xperia 1 IV |
XQ-CT72 |
sony_xperia1-4_v1.2.0.json |
Sony Xperia PRO |
XQ-AQ52 |
sony_xperiaPRO_v1.2.0.json |
Sony Xperia PRO |
XQ-AQ62 |
sony_xperiaPRO_v1.2.0.json |
Sony Xperia PRO I |
XQ-BE42 |
sony_xperiaPRO-I_v1.2.0.json |
Samsung Galaxy Note10+ |
SC-01M |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SCV45 |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N9750 |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N9750/DS |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975C |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975N |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975U |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975U1 |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975W |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975F |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N975F/DS |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N976B |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N976N |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N9760 |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N976Q |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N976V |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy Note10+ |
SM-N976U |
samsung_galaxy_note_10+_v1.2.0.json |
Samsung Galaxy S10 5G |
SC-03L |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SCV41 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973F |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973N |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9730 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9738 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973C |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973U |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973U1 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G973W |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G977B |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G977N |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G977P |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G977T |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G977U |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G770F |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G770U1 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SC-04L |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SCV42 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G975F |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G975N |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9750 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9758 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G975U |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G975U1 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G975W |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SC-05L |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G970F |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G970N |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9700 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9708 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G970U |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G970U1 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G970W |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S10 5G |
SM-G9770 |
samsung_galaxy_s10_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SCG03 |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G9880 |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988N |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988Q |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988U |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988U1 |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988W |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Ultra |
SM-G988B |
samsung_galaxy_s20_ultra_v1.2.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985 |
samsung_galaxy_s20_plus_4G_v1.2.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985F |
samsung_galaxy_s20_plus_4G_v1.2.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985F/DS |
samsung_galaxy_s20_plus_4G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SC-52A |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SCG02 |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986 |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G9860 |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986N |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986U |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986U1 |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986W |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986B/DS |
samsung_galaxy_s20_plus_5G_v1.2.0.json |
Huawei P30 Pro |
HW-02L |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-AL00 |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-AL10 |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-L04 |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-L09 |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-L29 |
huawei_p30_pro_v1.2.0.json |
Huawei P30 Pro |
VOG-TL00 |
huawei_p30_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-NX9 |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-AN00 |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-TN00 |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-N04 |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-N29 |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro |
ELS-N29D |
huawei_p40_pro_v1.2.0.json |
Huawei P40 Pro+ |
ELS-AN10 |
huawei_p40_pro_plus_v1.2.0.json |
Huawei P40 Pro+ |
ELS-TN10 |
huawei_p40_pro_plus_v1.2.0.json |
Huawei P40 Pro+ |
ELS-N39 |
huawei_p40_pro_plus_v1.2.0.json |
Huawei Mate30 Pro |
TAS-AN00 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
TAS-TN00 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-N29 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-L09 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-AL00 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-TL00 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-AL10 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-TL10 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-AN00P |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate30 Pro |
LIO-AN00 |
huawei_mate30_pro_5g_v1.2.0.json |
Huawei Mate40 Pro |
NOH-NX9 |
huawei_mate40_pro_v1.2.0.json |
Huawei Mate40 Pro |
NOH-AN00 |
huawei_mate40_pro_v1.2.0.json |
Huawei Mate40 Pro+ |
NOP-NX9 |
huawei_mate40_pro_plus_v1.2.0.json |
Huawei Mate40 Pro+ |
NOP-AN00 |
huawei_mate40_pro_plus_v1.2.0.json |
Huawei Honor V20 |
PCT-TL10 |
huawei_honor_v20_v1.2.0.json |
Huawei Honor V20 |
PCT-AL10 |
huawei_honor_v20_v1.2.0.json |
Huawei Honor V20 |
PCT-L29 |
huawei_honor_v20_v1.2.0.json |
Honor Magic3 Pro |
ELZ-AN10 |
honor_magic3_pro_v1.2.0.json |
Honor Magic3 Pro+ |
ELZ-AN20 |
honor_magic3_pro_plus_v1.2.0.json |
Apple iPhone X |
iPhone10,3 |
iphone_X_v1.3.0.json |
Apple iPhone X |
iPhone10,6 |
iphone_X_v1.3.0.json |
Apple iPhone XS |
iPhone11,2 |
iphone_XS_v1.3.0.json |
Apple iPhone XS Max |
iPhone11,4 |
iphone_XS_max_v1.3.0.json |
Apple iPhone XS Max |
iPhone11,6 |
iphone_XS_max_v1.3.0.json |
Apple iPhone XR |
iPhone11,8 |
iphone_XR_v1.3.0.json |
Apple iPhone 11 |
iPhone12,1 |
iphone_11_v1.3.0.json |
Apple iPhone 11 Pro |
iPhone12,3 |
iphone_11_pro_v1.3.0.json |
Apple iPhone 11 Pro Max |
iPhone12,5 |
iphone_11_pro_max_v1.3.0.json |
Apple iPhone 12 mini |
iPhone13,1 |
iphone_12_mini_v1.3.0.json |
Apple iPhone 12 |
iPhone13,2 |
iphone_12_v1.3.0.json |
Apple iPhone 12 Pro |
iPhone13,3 |
iphone_12_pro_v1.2.0.json |
Apple iPhone 12 Pro Max |
iPhone13,4 |
iphone_12_pro_max_v1.2.0.json |
Apple iPhone 13 mini |
iPhone14,4 |
iphone_13_mini_v1.3.0.json |
Apple iPhone 13 |
iPhone14,5 |
iphone_13_v1.3.0.json |
Apple iPhone 13 Pro |
iPhone14,2 |
iphone_13_pro_v1.2.0.json |
Apple iPhone 13 Pro Max |
iPhone14,3 |
iphone_13_pro_max_v1.2.0.json |
Apple iPhone 14 |
iPhone14,7 |
iphone_14_v1.3.0.json |
Apple iPhone 14 Plus |
iPhone14,8 |
iphone_14_plus_v1.3.0.json |
Apple iPhone 14 Pro |
iPhone15,2 |
iphone_14_pro_v1.2.0.json |
Apple iPhone 14 Pro Max |
iPhone15,3 |
iphone_14_pro_max_v1.2.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,1 |
ipad_pro_11_gen1_v1.3.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,2 |
ipad_pro_11_gen1_v1.3.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,3 |
ipad_pro_11_gen1_v1.3.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,4 |
ipad_pro_11_gen1_v1.3.0.json |
Apple iPad Pro 11-inch(2nd generation) |
iPad8,9 |
ipad_pro_11_gen2_v1.2.0.json |
Apple iPad Pro 11-inch(2nd generation) |
iPad8,10 |
ipad_pro_11_gen2_v1.2.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,4 |
ipad_pro_11_gen3_v1.2.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,5 |
ipad_pro_11_gen3_v1.2.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,6 |
ipad_pro_11_gen3_v1.2.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,7 |
ipad_pro_11_gen3_v1.2.0.json |
Apple iPad Pro 11-inch(4th generation) |
iPad14,3 |
ipad_pro_11_gen4_v1.2.0.json |
Apple iPad Pro 11-inch(4th generation) |
iPad14,4 |
ipad_pro_11_gen4_v1.2.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,5 |
ipad_pro_12_9_gen3_v1.3.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,6 |
ipad_pro_12_9_gen3_v1.3.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,7 |
ipad_pro_12_9_gen3_v1.3.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,8 |
ipad_pro_12_9_gen3_v1.3.0.json |
Apple iPad Pro 12.9-inch(4th generation) |
iPad8,11 |
ipad_pro_12_9_gen4_v1.2.0.json |
Apple iPad Pro 12.9-inch(4th generation) |
iPad8,12 |
ipad_pro_12_9_gen4_v1.2.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,8 |
ipad_pro_12_9_gen5_v1.2.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,9 |
ipad_pro_12_9_gen5_v1.2.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,10 |
ipad_pro_12_9_gen5_v1.2.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,11 |
ipad_pro_12_9_gen5_v1.2.0.json |
Apple iPad Pro 12.9-inch(6th generation) |
iPad14,5 |
ipad_pro_12_9_gen6_v1.2.0.json |
Apple iPad Pro 12.9-inch(6th generation) |
iPad14,6 |
ipad_pro_12_9_gen6_v1.2.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 1 IV |
0 |
Rear |
5 |
Rear |
Sony Xperia PRO |
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 |
iPhone X |
1 |
Front |
1 |
Front |
iPhone XS |
1 |
Front |
1 |
Front |
iPhone XR |
1 |
Front |
1 |
Front |
iPhone 11 |
1 |
Front |
1 |
Front |
iPhone 11 Pro |
1 |
Front |
1 |
Front |
iPhone 11 Pro Max |
1 |
Front |
1 |
Front |
iPhone 12 mini |
1 |
Front |
1 |
Front |
iPhone 12 |
1 |
Front |
1 |
Front |
iPhone 12 Pro |
0 |
Rear |
0 |
Rear |
iPhone 12 Pro |
1 |
Front |
1 |
Front |
iPhone 12 Pro Max |
0 |
Rear |
0 |
Rear |
iPhone 12 Pro Max |
1 |
Front |
1 |
Front |
iPhone 13 mini |
1 |
Front |
1 |
Front |
iPhone 13 |
1 |
Front |
1 |
Front |
iPhone 13 Pro |
0 |
Rear |
0 |
Rear |
iPhone 13 Pro |
1 |
Front |
1 |
Front |
iPhone 13 Pro Max |
0 |
Rear |
0 |
Rear |
iPhone 13 Pro Max |
1 |
Front |
1 |
Front |
iPhone 14 |
1 |
Front |
1 |
Front |
iPhone 14 Plus |
1 |
Front |
1 |
Front |
iPhone 14 Pro |
0 |
Rear |
0 |
Rear |
iPhone 14 Pro |
1 |
Front |
1 |
Front |
iPhone 14 Pro Max |
0 |
Rear |
0 |
Rear |
iPhone 14 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 11-inch(4th generation) |
0 |
Rear |
0 |
Rear |
Apple iPad Pro 11-inch(4th 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 |
Apple iPad Pro 12.9-inch(6th generation) |
0 |
Rear |
0 |
Rear |
Apple iPad Pro 12.9-inch(6th 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 1 IV |
TFLite |
GPU |
GPU |
TFLite |
Sony Xperia PRO |
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 iPhone X |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone XS |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone XS Max |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone XR |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 11 |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 11 Pro |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 11 Pro Max |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 12 mini |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 12 |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 12 Pro |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 12 Pro Max |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 13 mini |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 13 |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 13 Pro |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 13 Pro Max |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 14 |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 14 Plus |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 14 Pro |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 14 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 11-inch(4th 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 |
Apple iPad Pro 12.9-inch(6th generation) |
TFLite |
GPU |
GPU |
TFLite |
7. 制限事項等
7.1. ToF AR v1.3.0
-
ToF AR v1.3.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.3.0 |
|
v1.2.0 |
|
v1.1.0 |
|
v1.0.0 |
ToF AR 初版リリース |