カメラの設定

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

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

拡張カメラ構成プロパティ(Android)

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

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

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

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

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

  1. ARCameraManagerARCameraManager.GetConfigurations() を使用して、サポートされている 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 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;
}