配置相机

相机配置用于描述应用底层相机传感器的属性。在 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 Framerate 设置为 Target 30FPS

阻止 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;
}