プレイバック用データセットの作成方法
Lightshipのレコーディング機能を使えば、ARアプリケーションの実際の位置を記録して、Unityエディタでプレイバックしたりテストしたりできます。 プレイバックデータセットの作成は、レコーディング サンプルプロジェクトを使用するか、APIを使用して録画することができます。
前提条件
レコーディングサンプル・プロジェクトを使用してスキャンするには、それをダウンロードし、お使いのデバイスにビルドする必要があります。 詳しくは、 サンプルプロジェクトをご覧ください。
独自の録画アプリを作成するには、Lightship ARを有効にしたUnityプロジェクトが必要です。 詳細については、 ARDK 3.0 のインストールを参照してください。
スキャニングサンプルを使って記録する
サンプルを使ってプレイバックデータセットを記録します:
- レコーディングサンプルをデバイスで開きます。 データセットを記録する準備ができたら、 Startをタップします。
- デバイスのカメラを使って環境を記録します。 次のことに留意してください:
- デバイスを ポートレートモードにしておきます。
- データセットの誤差を減らすため、できるだけ安定してデバイスを持つこと。
- このサンプルには、 データセットを記録するための1分間のタイムリミット があります。
- Stop をタップして録音を終了します。
- 準備ができたら、 Export をタップして、最新の録画を再生データセットに変換します。
- エクスポートが完了すると、サンプルにはアーカイブされたデータセットへのパスが表示されます。 このパスを覚えておくと、後でエディターでデータセットを探すときに便利です。
APIを使ってデータセットを記録する
レコーディング・サンプルがあなたのプロジェクトにとって限定的すぎる場合、代わりに独自のスキャナーを作成することができます。
Unityでロケーションスキャナーを作成するには:
- Lightship Settingsでスキャンを有効にします:
- Lightship トップメニューで、 Settingsを選択します。
- Inspector ウィンドウで、 Scanningというラベルの付いたボックスをチェックしま す。
- AR Sceneで、 AR Scanning Manager をシーンに追加し、無効にします:
- ARSession
GameObject
を選択する。 - Inspector ウィンドウで、 Add Componentをクリックし、 AR Scanning Manager を追加します。
AR Scanning Manager (Script)
の横にあるチェックボックスをオフにして、無効にします。
- ARSession
- シーンに2つのボタンを作成します。1つは録画を開始するボタン、もう1つは録画を停止するボタンです。
- Hierarchyで右クリックし、 UI メニューで、 ボタンを選択する。 ボタンの名前を"Record"に変更する。
- 前のステップを繰り返し、新しいボタンに "Stop "という名前を付ける。
- 各ボタンについて、その
GameObject
を展開し、Text
サブオブジェクトを選択し、Text
フィールドを、必要に応じて "Record "または "Stop "に変更します。 - シーンビューのボタンを好きな場所に移動する。
- レコーディングを起動するスクリプトを作成し、それをボタンに接続する:
- Assets ウィンドウで右クリックし、 Create メニューから C# Script を選択します。 新しいスクリプトの名前は
StartScript
。 これをもう2回繰り返し、スクリプト名をRecordButton
とStopButton
とする。 - Hierarchyで右クリックし、 Create Emptyを選択する。 新しい
GameObject
"Startup "と名付ける。 1.Startup
を選択した状態で、 Inspector ウィンドウで、 Add Component をクリックし、StartScript
をStartup
に追加します。 - Hierarchyで各ボタンを選択し、 Inspectorの
OnClick
フィールドに適切なスクリプトを追加します。
- Assets ウィンドウで右クリックし、 Create メニューから C# Script を選択します。 新しいスクリプトの名前は
- このページの最後にあるコードを適切なスクリプトに追加し、あなたのデバイスにビルドしてテストしてください!
レコードデータのエクスポート
お使いのデバイスのオペレーティングシステムの指示に従ってください:
iOSからのエクスポート
- デバイスをXcodeに接続し、開発者モードを有効にする。
- Device and Simulatorsで、サンプルアプリを見つけてください。
- ドットメニューを使って、 Download Containerをタップする。
- コンテナがマシンにダウンロードされたら、パッケージを右クリックし、 Show Package Contentsをクリックする。
- 録画出力からパスに移動します(例:
AppData/Documents/scankit/(ID of your scan)/chunk_0.tgz
). - アーカイブをマシンにコピーし、Unityプロジェクトの
Assets/StreamingAssets
ディレクトリに解凍します。
アンドロイドからのエクスポート
- デバイスを開発マシンに接続する。
- デバイスからファイルを取得します:
- iOS: Android File Transferを開いて、レコーディング出力からパスに移動してください。
- Windows:何をするか尋ねるダイアログがポップアップ表示されたら、 File Tansferを選択し、レコーディングのパスに移動します。
- アーカイブをマシンにコピーし、Unityプロジェクトの
Assets/StreamingAssets
ディレクトリに解凍します。
Unityでプレイバックデータを使う
プレイバックデータセットをUnityに追加する:
- Edit メニューから Project Settings を開き、 XR Plugin Management までスクロールダウンし、 Niantic Lightship SDKを選択する。
- Editor Playbackを有効にし、 Dataset Path フィールドにデータセットの絶対パスを入力する。
StartScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartScript :MonoBehaviour
{
public void Start() {
// Androidの場合は位置情報の使用許可を得る
// 次に位置情報とコンパスサービスを有効にする
#if UNITY_ANDROID
if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
{
var androidPermissionCallbacks = new PermissionCallbacks();
androidPermissionCallbacks.PermissionGranted += permissionName =>
{
if (permissionName == "android.permission.ACCESS_FINE_LOCATION")
{
Start();
}.
};
Permission.RequestUserPermission(Permission.FineLocation, androidPermissionCallbacks);
return;
}.
#endif
Input.compass.enabled = true;
Input.location.Start();
}.
}
レコードボタ ン.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RecordButton : MonoBehaviour
{
// 録画を開始するためにスキャンマネージャーを有効にする
public void StartRecording() {
ARScanningManager.enabled = true;
}.
}
停止ボタン.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StopButton : MonoBehaviour
{
public async void StopRecordingAndExport() {
// SaveScan()で録画を保存
// ScanStore()で参照を取得し、ScanArchiveBuilder()でエクスポート
// 再生録画へのパスをデバッグメッセージとして出力
string scanId = ARScanningManager.GetCurrentScanId();
await ARScanningManager.SaveScan();
var savedScan = ARScanningManager.GetScanStore().GetSavedScan().Find(scan => scan.ScanId == scanId);
ScanArchiveBuilder builder = new ScanArchiveBuilder(savedScan, new UploadUserInfo());
while (builder.HasMoreChunks())
{
var task = builder.CreateTaskToGetNextChunk();
task.Start();
await task;
Debug.Log(task.Result); // <- これが再生録画へのパスです。
}
ARScanningManager.enabled = false;
}.
}