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.31f1, Unity 2022.3.11f1 (Unity 2020以上が必要です)
Androidビルド、iOSビルドのセットアップを行ってください。Androidのセットアップ方法は下記リンクを参照してください。 Android 環境の設定 -
AR Foundation 4.2.8
-
ARCore Extensions for AR Foundation 1.40.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 ) または .Net Standard 2.1
-
Scripting Backend : IL2CPP
-
Target Architectures : ARM64のみチェックします
-
-
メニューのFile / Build Settings… / Player Settings / iOS Settings ボタンをクリックし、Other Settings内に下記設定を行います
-
Api Compatibility Level : .NET Framework ( Unity2020以前は .NET4.x ) または .Net Standard 2.1
-
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 から入手します。
ToF AR開発で推奨するソフトウェアバージョンも参照してください。
-
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以上に設定します。
3.4. App Store アプリ申請時の TrueDepth API の除外方法
ToF AR を用いて作成したアプリで App Store にアプリ申請する際、「TrueDepth API を使用していなければ除去すべきである」という理由により申請が却下されるケースがあります。
これは、LiDAR センサーのみを使用して TrueDepth カメラを使用しない場合でも、ToF AR 内で TrueDepth API を使用しているために発生します。
この場合、下記方法によりTrueDepth API を使用している部分を削除して対応できます。
-
Assets/TofAr/TofAr/Plugins/iOS フォルダ内の2つのファイルを削除します。
-
component_tofar_true_depth.framework
-
component_tofar_true_depth.framework.meta
-
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.31f1を使用しています。 |
-
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.4.0.json |
Sony Xperia 1 II |
SO-51A |
sony_xperia1-2_v1.4.0.json |
Sony Xperia 1 II |
XQ-AT42 |
sony_xperia1-2_v1.4.0.json |
Sony Xperia 1 II |
XQ-AT51 |
sony_xperia1-2_v1.4.0.json |
Sony Xperia 1 II |
XQ-AT52 |
sony_xperia1-2_v1.4.0.json |
Sony Xperia 1 II |
XQ-AT72 |
sony_xperia1-2_v1.4.0.json |
Sony Xperia 1 III |
A101SO |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
SO-51B |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
SOG03 |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
XQ-BC42 |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
XQ-BC52 |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
XQ-BC62 |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 III |
XQ-BC72 |
sony_xperia1-3_v1.4.0.json |
Sony Xperia 1 IV |
A201SO |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
SO-51C |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
SOG06 |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
XQ-CT44 |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
XQ-CT54 |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
XQ-CT62 |
sony_xperia1-4_v1.4.0.json |
Sony Xperia 1 IV |
XQ-CT72 |
sony_xperia1-4_v1.4.0.json |
Sony Xperia PRO |
XQ-AQ52 |
sony_xperiaPRO_v1.4.0.json |
Sony Xperia PRO |
XQ-AQ62 |
sony_xperiaPRO_v1.4.0.json |
Sony Xperia PRO I |
XQ-BE42 |
sony_xperiaPRO-I_v1.4.0.json |
Samsung Galaxy Note10+ |
SC-01M |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SCV45 |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N9750 |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N9750/DS |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975C |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975N |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975U |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975U1 |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975W |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975F |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N975F/DS |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N976B |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N976N |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N9760 |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N976Q |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N976V |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy Note10+ |
SM-N976U |
samsung_galaxy_note_10+_v1.4.0.json |
Samsung Galaxy S10 5G |
SC-03L |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SCV41 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973F |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973N |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9730 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9738 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973C |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973U |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973U1 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G973W |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G977B |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G977N |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G977P |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G977T |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G977U |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G770F |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G770U1 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SC-04L |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SCV42 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G975F |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G975N |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9750 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9758 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G975U |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G975U1 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G975W |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SC-05L |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G970F |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G970N |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9700 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9708 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G970U |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G970U1 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G970W |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S10 5G |
SM-G9770 |
samsung_galaxy_s10_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SCG03 |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G9880 |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988N |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988Q |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988U |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988U1 |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988W |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Ultra |
SM-G988B |
samsung_galaxy_s20_ultra_v1.4.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985 |
samsung_galaxy_s20_plus_4G_v1.4.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985F |
samsung_galaxy_s20_plus_4G_v1.4.0.json |
Samsung Galaxy S20 Plus 4G |
SM-G985F/DS |
samsung_galaxy_s20_plus_4G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SC-52A |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SCG02 |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986 |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G9860 |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986N |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986U |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986U1 |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986W |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Samsung Galaxy S20 Plus 5G |
SM-G986B/DS |
samsung_galaxy_s20_plus_5G_v1.4.0.json |
Huawei P30 Pro |
HW-02L |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-AL00 |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-AL10 |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-L04 |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-L09 |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-L29 |
huawei_p30_pro_v1.4.0.json |
Huawei P30 Pro |
VOG-TL00 |
huawei_p30_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-NX9 |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-AN00 |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-TN00 |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-N04 |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-N29 |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro |
ELS-N29D |
huawei_p40_pro_v1.4.0.json |
Huawei P40 Pro+ |
ELS-AN10 |
huawei_p40_pro_plus_v1.4.0.json |
Huawei P40 Pro+ |
ELS-TN10 |
huawei_p40_pro_plus_v1.4.0.json |
Huawei P40 Pro+ |
ELS-N39 |
huawei_p40_pro_plus_v1.4.0.json |
Huawei Mate30 Pro |
TAS-AN00 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
TAS-TN00 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-N29 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-L09 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-AL00 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-TL00 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-AL10 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-TL10 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-AN00P |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate30 Pro |
LIO-AN00 |
huawei_mate30_pro_5g_v1.4.0.json |
Huawei Mate40 Pro |
NOH-NX9 |
huawei_mate40_pro_v1.4.0.json |
Huawei Mate40 Pro |
NOH-AN00 |
huawei_mate40_pro_v1.4.0.json |
Huawei Mate40 Pro+ |
NOP-NX9 |
huawei_mate40_pro_plus_v1.4.0.json |
Huawei Mate40 Pro+ |
NOP-AN00 |
huawei_mate40_pro_plus_v1.4.0.json |
Huawei Honor V20 |
PCT-TL10 |
huawei_honor_v20_v1.4.0.json |
Huawei Honor V20 |
PCT-AL10 |
huawei_honor_v20_v1.4.0.json |
Huawei Honor V20 |
PCT-L29 |
huawei_honor_v20_v1.4.0.json |
Honor Magic3 Pro |
ELZ-AN10 |
honor_magic3_pro_v1.4.0.json |
Honor Magic3 Pro+ |
ELZ-AN20 |
honor_magic3_pro_plus_v1.4.0.json |
Honor Magic5 Pro |
PGT-N19 |
honor_magic5_pro_v1.4.0.json |
Apple iPhone X |
iPhone10,3 |
iphone_X_v1.4.0.json |
Apple iPhone X |
iPhone10,6 |
iphone_X_v1.4.0.json |
Apple iPhone XS |
iPhone11,2 |
iphone_XS_v1.4.0.json |
Apple iPhone XS Max |
iPhone11,4 |
iphone_XS_max_v1.4.0.json |
Apple iPhone XS Max |
iPhone11,6 |
iphone_XS_max_v1.4.0.json |
Apple iPhone XR |
iPhone11,8 |
iphone_XR_v1.4.0.json |
Apple iPhone 11 |
iPhone12,1 |
iphone_11_v1.4.0.json |
Apple iPhone 11 Pro |
iPhone12,3 |
iphone_11_pro_v1.4.0.json |
Apple iPhone 11 Pro Max |
iPhone12,5 |
iphone_11_pro_max_v1.4.0.json |
Apple iPhone 12 mini |
iPhone13,1 |
iphone_12_mini_v1.4.0.json |
Apple iPhone 12 |
iPhone13,2 |
iphone_12_v1.4.0.json |
Apple iPhone 12 Pro |
iPhone13,3 |
iphone_12_pro_v1.4.0.json |
Apple iPhone 12 Pro Max |
iPhone13,4 |
iphone_12_pro_max_v1.4.0.json |
Apple iPhone 13 mini |
iPhone14,4 |
iphone_13_mini_v1.4.0.json |
Apple iPhone 13 |
iPhone14,5 |
iphone_13_v1.4.0.json |
Apple iPhone 13 Pro |
iPhone14,2 |
iphone_13_pro_v1.4.0.json |
Apple iPhone 13 Pro Max |
iPhone14,3 |
iphone_13_pro_max_v1.4.0.json |
Apple iPhone 14 |
iPhone14,7 |
iphone_14_v1.4.0.json |
Apple iPhone 14 Plus |
iPhone14,8 |
iphone_14_plus_v1.4.0.json |
Apple iPhone 14 Pro |
iPhone15,2 |
iphone_14_pro_v1.4.0.json |
Apple iPhone 14 Pro Max |
iPhone15,3 |
iphone_14_pro_max_v1.4.0.json |
Apple iPhone 15 |
iPhone15,4 |
iphone_15_v1.4.0.json |
Apple iPhone 15 Plus |
iPhone15,5 |
iphone_15_plus_v1.4.0.json |
Apple iPhone 15 Pro |
iPhone16,1 |
iphone_15_pro_v1.4.0.json |
Apple iPhone 15 Pro Max |
iPhone16,2 |
iphone_15_pro_max_v1.4.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,1 |
ipad_pro_11_gen1_v1.4.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,2 |
ipad_pro_11_gen1_v1.4.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,3 |
ipad_pro_11_gen1_v1.4.0.json |
Apple iPad Pro 11-inch(1st generation) |
iPad8,4 |
ipad_pro_11_gen1_v1.4.0.json |
Apple iPad Pro 11-inch(2nd generation) |
iPad8,9 |
ipad_pro_11_gen2_v1.4.0.json |
Apple iPad Pro 11-inch(2nd generation) |
iPad8,10 |
ipad_pro_11_gen2_v1.4.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,4 |
ipad_pro_11_gen3_v1.4.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,5 |
ipad_pro_11_gen3_v1.4.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,6 |
ipad_pro_11_gen3_v1.4.0.json |
Apple iPad Pro 11-inch(3rd generation) |
iPad13,7 |
ipad_pro_11_gen3_v1.4.0.json |
Apple iPad Pro 11-inch(4th generation) |
iPad14,3 |
ipad_pro_11_gen4_v1.4.0.json |
Apple iPad Pro 11-inch(4th generation) |
iPad14,4 |
ipad_pro_11_gen4_v1.4.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,5 |
ipad_pro_12_9_gen3_v1.4.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,6 |
ipad_pro_12_9_gen3_v1.4.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,7 |
ipad_pro_12_9_gen3_v1.4.0.json |
Apple iPad Pro 12.9-inch(3rd generation) |
iPad8,8 |
ipad_pro_12_9_gen3_v1.4.0.json |
Apple iPad Pro 12.9-inch(4th generation) |
iPad8,11 |
ipad_pro_12_9_gen4_v1.4.0.json |
Apple iPad Pro 12.9-inch(4th generation) |
iPad8,12 |
ipad_pro_12_9_gen4_v1.4.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,8 |
ipad_pro_12_9_gen5_v1.4.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,9 |
ipad_pro_12_9_gen5_v1.4.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,10 |
ipad_pro_12_9_gen5_v1.4.0.json |
Apple iPad Pro 12.9-inch(5th generation) |
iPad13,11 |
ipad_pro_12_9_gen5_v1.4.0.json |
Apple iPad Pro 12.9-inch(6th generation) |
iPad14,5 |
ipad_pro_12_9_gen6_v1.4.0.json |
Apple iPad Pro 12.9-inch(6th generation) |
iPad14,6 |
ipad_pro_12_9_gen6_v1.4.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 |
Honor Magic5 Pro |
0 |
Rear |
3 |
Front |
Honor Magic5 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 |
iPhone 15 |
1 |
Front |
1 |
Front |
iPhone 15 Plus |
1 |
Front |
1 |
Front |
iPhone 15 Pro |
0 |
Rear |
0 |
Rear |
iPhone 15 Pro |
1 |
Front |
1 |
Front |
iPhone 15 Pro Max |
0 |
Rear |
0 |
Rear |
iPhone 15 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 |
Honor Magic5 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 iPhone 15 |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 15 Plus |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 15 Pro |
TFLite |
GPU |
GPU |
TFLite |
Apple iPhone 15 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.4.0
-
Hand認識機能で RecogMode→OneHandHldSmapho, ProcessLevel→HandCenterOnly とした場合、認識結果は常に右手と認識されます。
7.1.1. iOS
-
AR Foundationを利用するアプリではSceneMesh機能がサポートされていません。
-
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.4.0 |
|
v1.3.0 |
|
v1.2.0 |
|
v1.1.0 |
|
v1.0.0 |
ToF AR 初版リリース |