設定相機

相機設定會說明應用程式基礎相機感應器的屬性。在 Unity 中,您可以透過 XRCameraConfiguration 存取這些設定。

在 Android 平台上,ARCore 會提供 XRCameraConfigurationExtensions,在 XRCameraConfiguration 中公開其他 ARCore 專屬屬性。您可以使用這些屬性為應用程式設定適當的相機設定。

擴充相機設定屬性 (Android)

Android 平台上的 ARCore 支援下列擴充屬性。

存取支援的相機設定

使用 ARCameraManager.GetConfigurations() 即可存取特定裝置支援的相機設定。這會傳回 NativeArray,其中包含多個 XRCameraConfiguration 例項。每個執行個體都是個別的攝影機設定,可指定深度用途、目標擷取影格率、解析度和紋理尺寸等屬性。

在應用程式的場景中設定攝影機

請按照下列步驟,在應用程式場景中設定相機。

  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 Framerate 已設為 Target 30FPS

禁止 ARCore 使用深度感應器

如果您的應用程式不需要深度,可以防止 ARCore 使用深度感應器。在支援深度感應器的裝置上,ARCore ARCore 會優先使用深度感應器的相機設定。如要篩除所有使用深度感應器的相機設定,請確認 Depth Sensor Usage 已設為 Do 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;
}