カメラの設定

カメラ構成では、アプリの基盤となるカメラセンサーのプロパティを記述します。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;
}