Настройка камеры

Конфигурации камеры описывают свойства базового датчика камеры приложения. В Unity эти конфигурации доступны через XRCameraConfiguration .

На платформе Android ARCore предоставляет XRCameraConfigurationExtensions для предоставления дополнительных свойств, специфичных для ARCore, в XRCameraConfiguration . Вы можете использовать эти свойства, чтобы настроить соответствующую конфигурацию камеры для вашего приложения.

Расширенные свойства конфигурации камеры (Android)

Следующие расширенные свойства поддерживаются ARCore на платформе Android.

Доступ к поддерживаемым конфигурациям камеры

Используйте ARCameraManager.GetConfigurations() для доступа к поддерживаемым конфигурациям камеры для данного устройства. Это возвращает NativeArray , содержащий несколько экземпляров XRCameraConfiguration . Каждый экземпляр представляет собой отдельную конфигурацию камеры, определяющую такие свойства, как использование глубины, целевую частоту кадров захвата, разрешение и размеры текстуры.

Настройте камеру в сцене вашего приложения

Выполните следующие действия, чтобы настроить камеру в сцене вашего приложения.

  1. Используйте ARCameraManager с ARCameraManager.GetConfigurations() для запроса списка поддерживаемых XRCameraConfiguration s.

  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 кадров в секунду.

Если вашему приложению не требуется более высокая частота кадров камеры, вы можете ограничить ее до 30 кадров в секунду. На устройствах, поддерживающих частоту кадров камеры 60 кадров в секунду, ARCore будет отдавать приоритет конфигурациям камеры, поддерживающим эту частоту кадров по умолчанию. Чтобы отфильтровать все конфигурации камеры, поддерживающие частоту кадров 60 кадров в секунду, убедитесь, что для 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;
}