スキャン設定

スキャンの視覚化をカスタマイズする方法やスキャン処理、 IScanner インターフェイスの概要について説明します。

注釈

この機能はパブリックベータ版であり、機能性は将来のリリースで変更される可能性があります。ARDK機能のローンチタイプ(パブリックベータ版など)に関する詳細については、Lightshipのローンチタイプをご参照ください。

スキャンの視覚化

Scanning Frameworkには、ユーザーがスキャン中の内容を視覚化しやすいように複数のスキャンビジュアライザーが付属しています。

スキャン中、Scanning Frameworkに付属しているの2組の生スキャンデータセット(画面空間のレイキャストバッファとワールド空間のボクセルバッファ)を使用して視覚化することができます。

The raycast buffer is computed by raycasts from the current camera pose to produce a 2D texture that contains the color, depth, and normal information of the visible voxels from the current position. The Scanning Framework returns this data via the IRaycastBuffer interface in an IScanner.VisualizationUpdated callback.

The voxel buffer is a representation of all the voxels that lie on the boundary of detected surfaces. The Scanning Framework returns this data via the IVoxelBuffer interface in an IScanner.VisualizationUpdated callback.

非常に古いデバイスの場合、Scanning Frameworkはパフォーマンス上の理由から視覚化データが返らないようにフォールバックすることがあります。

If you're using ARScanManager, you can use the following provided implementations of IScanVisualizer (instead of using the raw IRaycastBuffer or IVoxelBuffer data) to easily add visualizers to your scan:

  • PointCloudVisualizer - uses the voxel buffer to render a point-cloud representation of the current scan.

  • RaycastScanVisualizer - スキャンのレイキャストバッファの色を画面上に描画します。この機能はUnityカメラに追加する必要があります。通常は ARSceneCamera のコンポーネントとして追加されます。

  • WorldSpaceScanVisualizer - uses the raycast buffer to render normal and depth aware discs of the current scan.

The following image shows a basic example use of the WorldSpaceScanVisualizer.

WorldSpaceVisualization

これらのビジュアライザーを有効化するには、 ARScanManager.SetVisualizer()StartScanning() の順に呼び出してビジュアライザーを設定します。

using Niantic.ARDK.AR;
using Niantic.ARDK.AR.Scanning;
using Niantic.ARDK.Extensions;
using Niantic.ARDK.Extensions.Scanning;

PointCloudVisualizer _pointCloudVisualizer;
//...
_arScanManager.SetVisualizer(_pointCloudVisualizer);
_arScanManager.StartScanning();
//...

スキャンの処理

Scanning Frameworkでスキャンの処理方法を設定するには、スキャンモード、メッシュの品質、テクスチャの品質を設定します。スキャンの最大距離を設定することもできます。使用例に応じて、以下の設定を使用することをお勧めします。

使用例

スキャンモード

メッシュの品質

テクスチャの品質

スキャンの最大距離(メートル単位)

小さなオブジェクト(半径約1m以下)の3Dモデルを作成する

DETAIL

VERY_HIGH

HIGH

2

大きなオブジェクトやシーンの3Dモデルを作成する

AREA

VERY_HIGH

VERY_HIGH

5

VPSマッピング用にWayspotをスキャンする

AREA

LOW

LOW

5

注釈

DETAIL モードでは、特にAndroidデバイスにおいて、 AREA モードよりもスキャン処理が遅くなります。個々の使用例に応じて、「メッシュ品質」の各設定をお試しの上、速度や品質のトレードオフ(妥協点)を確認することをお勧めします。

スキャン距離を設定するには、スキャンする前に ScanningOptions.MaxScanningDistance を設定します。スキャンモード、メッシュの品質、テクスチャの品質を設定するには、スキャンを処理する前に ReconstructionOptions を設定します。

ARScanManager を使用している場合は、 ARScanManager.StartProcessing() を呼び出す前に ARScanManager の reconstructionModemeshQualitytextureQuality プロパティを設定してください。

using Niantic.ARDK.AR.Scanning;

private ARScanManager _scanManager;

// ...

_scanManager.reconstructionMode = ReconstructionOptions.ReconstructionMode.AREA;
_scanManager.meshQuality = ReconstructionOptions.Quality.HIGH;
_scanManager.textureQuality = ReconstructionOptions.Quality.HIGH;

_scanManager.StartProcessing();

If you’re using IScanner, pass in the desired ReconstructionOptions settings to IScanner.StartProcessing().

using Niantic.ARDK.AR.Scanning;

private IScanner _scanner;

// ...

_scanner.StartProcessing(new ReconstructionOptions(ReconstructionOptions.ReconstructionMode.AREA, ReconstructionOptions.Quality.HIGH, ReconstructionOptions.Quality.HIGH));

ARScanManagerの代わりにIScannerを使用する

ARScanManager を使用できない場合は、 ScannerFactory を使用して独自の IScanner インスタンスを作成できます。

using Niantic.ARDK.AR.Scanning;
_scanner = ScannerFactory.Create(ARSession);

Use IScanner scanning and processing methods as needed. You'll need to provide handlers for VisualizationUpdated and ScanCompleted to update your scan visualizer and receive scan results.

_scanner.OnVisualizationUpdate += (IVoxelBuffer voxelBuffer, IRaycastBuffer raycastBuffer) =>
{
    // Forward buffers to a IScanVisualizer implementation like
    // RaycastScanVisualizer, or to your own implementation of
    // IScanVisualizer
    visualizer?.OnScanProgress(voxelBuffer, raycastBuffer);
};

_scanner.OnProcessScanComplete += (TexturedMesh texturedMesh, IScanner.State state) =>
_scanner.OnProcessScanComplete += (TexturedMesh texturedMesh, IScanner.State state, Vector3 centerPosition) =>
{
    // ...handle TexturedMesh as needed...
};

また、処理したスキャンを保存し、管理するためのメカニズムを用意する必要があります。 ARScanManager.SaveCurrentScan() や、 ScanStore を使用してスキャンを管理するその他のメソッドを複製することができます。

ARScanManager を使用していない場合は、スキャンを開始する前に、アプリで 深度推定を有効にする 必要があります。

スキャンのステータス

ARScanManagerIScanner を使用した場合の スキャンのステータス は次のようになります。

IScannerのステータス

  • ScanState を確認せずに、図の ARScanManagerIScanner のメソッドを呼び出すと、予測できない結果が生じることがあります。