カメラの設定

カメラの構成は、アプリの基盤となるカメラセンサーのプロパティを記述します。Unity では、これらの構成には XRCameraConfiguration からアクセスできます。

Android プラットフォームでは、ARCore が XRCameraConfigurationExtensions を提供し、XRCameraConfiguration 内に ARCore 固有の追加プロパティを公開します。これらのプロパティを使用して、アプリに適したカメラ構成を設定できます。

カメラの拡張設定プロパティ(Android)

Android プラットフォームの ARCore では、次の拡張プロパティがサポートされています。

サポートされているカメラ構成にアクセスする

ARCameraManager.GetConfigurations() を使用して、特定のデバイスでサポートされているカメラ設定にアクセスします。これにより、XRCameraConfiguration の複数のインスタンスが含まれる NativeArray が返されます。各インスタンスは、深度使用、ターゲット キャプチャ フレームレート、解像度、テクスチャ サイズなどのプロパティを指定する個別のカメラ構成です。

アプリのシーンでカメラを構成する

アプリのシーンのカメラを構成する手順は次のとおりです。

  1. ARCameraManager.GetConfigurations()ARCameraManager を使用して、サポートされている XRCameraConfiguration のリストをクエリします。

  2. Android 用にビルドする場合は、XRCameraConfigurationExtensions の関数を組み合わせて、ARCore 固有のプロパティを取得します。

  3. cameraManager.currentConfiguration を使用して現在の構成を設定します。

using UnityEngine.XR.ARFoundation;


// Adds XRCameraConfigurationExtensions extension methods to XRCameraConfiguration.
// This is for the Android platform only.
using Google.XR.ARCoreExtensions;

// Must be set in the editor.
public ARCameraManager cameraManager;

// Use ARCameraManager to obtain the camera configurations.
using (NativeArray<XRCameraConfiguration> configurations = cameraManager.GetConfigurations(Allocator.Temp))
{
    if (!configurations.IsCreated || (configurations.Length <= 0))
    {
        return;
    }

    // Iterate through the list of returned configs to locate the config you want.
    var desiredConfig = configurations[0];
    for (int i = 1; i < configurations.Length; ++i)
    {
        // Choose a config for a given camera that uses the maximum
        // target FPS and texture dimension. If supported, this config also enables
        // the depth sensor.
        if (configurations[i].GetFPSRange().y > desiredConfig.GetFPSRange().y &&
            configurations[i].GetTextureDimensions().x > desiredConfig.GetTextureDimensions().x &&
            configurations[i].GetTextureDimensions().y > desiredConfig.GetTextureDimensions().y &&
            configurations[i].CameraConfigDepthSensorUsage() == CameraConfigDepthSensorUsage.RequireAndUse)
        {
            desiredConfig = configurations[i];
        }
    }

    // Set the configuration you want. If it succeeds, the session
    // automatically pauses and resumes to apply the new configuration.
    // If it fails, cameraManager.currentConfiguration throws an exception.
    if (desiredConfig != cameraManager.currentConfiguration)
    {
        cameraManager.currentConfiguration = desiredConfig;
    }
}

カメラ構成フィルタ

ARCoreExtensionsCameraConfigFilter を使用すると、アプリのニーズに基づいてフィルタリングすることで、特定のデバイスで実行時に使用可能なカメラ設定を絞り込むことができます。

カメラの撮影フレームレートを 30 FPS に制限

アプリで高速なカメラ フレームレートを必要としない場合は、30 FPS に制限できます。60 FPS のカメラ フレームレートをサポートするデバイスでは、ARCore はデフォルトでそのフレームレートをサポートするカメラ設定を優先します。60 FPS をサポートするすべてのカメラ構成を除外するには、Target Camera FramerateTarget 30FPS に設定されていることを確認します。

ARCore がデプス センサーを使用できないようにする

アプリに深度が不要な場合は、ARCore が深度センサーを使用しないようにできます。サポートされているデプス センサーを搭載したデバイスでは、ARCore はデプス センサーを使用するカメラ設定を優先します。深度センサーを使用するすべてのカメラ設定を除外するには、Depth Sensor UsageDo Not Use に設定されていることを確認します。

カメラ構成フィルタを使用する

アプリでカメラ設定をフィルタする手順は次のとおりです。

Assets > Create > XR > Camera Config Filter に移動して、新しいカメラ構成フィルタを作成します。

フィルタで使用する構成を選択します。

フィルタを作成したら、ARCoreExtensions コンポーネントで使用します。

実行時にカメラを構成する

コールバック イベント ARCoreExtensions.OnChooseXRCameraConfiguration を使用すると、デバイスの種類などの要素に基づいて、実行時にカメラを構成できます。

// Unity's Awake() method
public void Awake()
{
    …
    // If the return value is not a valid index (ex. the value if -1),
    // then no camera configuration will be set. If no previous selection exists, 
    // the ARCore session will use the previously selected camera configuration 
    // or a default configuration.
    arcoreExtensions.OnChooseXRCameraConfiguration = SelectCameraConfiguration;
    …
}

// A custom camera configuration selection function
int SelectCameraConfiguration(List<XRCameraConfiguration> supportedConfigurations)
{
    int index = 0;

    // Use custom logic here to choose the desired configuration from supportedConfigurations.

    return index;
}