Configuración de la cámara

Las configuraciones de la cámara describen las propiedades del sensor de cámara subyacente de una app. En Unity, puedes acceder a estas configuraciones a través de XRCameraConfiguration.

En la plataforma de Android, ARCore proporciona XRCameraConfigurationExtensions para exponer propiedades adicionales específicas de ARCore dentro de XRCameraConfiguration. Puedes usar estas propiedades para configurar la configuración de cámara adecuada para tu app.

Propiedades de configuración de cámara extendidas (Android)

ARCore admite las siguientes propiedades extendidas en la plataforma de Android.

Accede a las configuraciones de cámara compatibles

Usa ARCameraManager.GetConfigurations() para acceder a las configuraciones de cámara compatibles de un dispositivo determinado. Esto muestra un NativeArray que contiene varias instancias de XRCameraConfiguration. Cada instancia es una configuración de cámara individual que especifica propiedades como el uso de profundidad, la velocidad de fotogramas de captura objetivo, la resolución y las dimensiones de la textura.

Configura la cámara en la escena de tu app

Sigue estos pasos para configurar la cámara en la escena de tu app.

  1. Usa ARCameraManager con ARCameraManager.GetConfigurations() para consultar la lista de XRCameraConfiguration admitidos.

  2. Si compilas para Android, usa cualquier combinación de las funciones de XRCameraConfigurationExtensions para obtener propiedades específicas de ARCore.

  3. Usa cameraManager.currentConfiguration para establecer la configuración actual.

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

Filtros de configuración de la cámara

Puedes usar ARCoreExtensionsCameraConfigFilter para reducir las configuraciones de cámara disponibles para un dispositivo determinado en el tiempo de ejecución filtrando según las necesidades de tu app.

Limita la velocidad de fotogramas de captura de la cámara a 30 FPS

Si tu app no necesita una velocidad de fotogramas de la cámara más rápida, puedes limitarla a 30 FPS. En los dispositivos que admiten una velocidad de fotogramas de 60 FPS, ARCore priorizará las configuraciones de cámara que admitan esa velocidad de fotogramas de forma predeterminada. Para filtrar todas las configuraciones de la cámara que admiten 60 FPS, asegúrate de que Target Camera Framerate esté configurado como Target 30FPS.

Evita que ARCore use el sensor de profundidad

Si tu app no requiere profundidad, puedes evitar que ARCore use el sensor de profundidad. En los dispositivos que tienen un sensor de profundidad compatible, ARCore prioriza las configuraciones de la cámara que usan el sensor de profundidad. Para filtrar todas las configuraciones de la cámara que usan el sensor de profundidad, asegúrate de que Depth Sensor Usage esté configurado como Do Not Use.

Usa filtros de configuración de la cámara

Sigue estos pasos para permitir que tu app filtre las configuraciones de la cámara.

Ve a Assets > Create > XR > Camera Config Filter para crear un nuevo filtro de configuración de la cámara.

Selecciona las configuraciones que deseas que use tu filtro.

Una vez que hayas creado el filtro, úsalo en un componente ARCoreExtensions.

Cómo configurar la cámara durante el tiempo de ejecución

Puedes usar el evento de devolución de llamada ARCoreExtensions.OnChooseXRCameraConfiguration para configurar la cámara durante el tiempo de ejecución, según factores como el tipo de dispositivo.

// 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;
}