카메라 구성하기

카메라 구성은 앱의 기본 카메라 센서 속성을 설명합니다. Unity에서는 XRCameraConfiguration를 통해 이러한 구성에 액세스할 수 있습니다.

Android 플랫폼에서 ARCore는 XRCameraConfiguration 내에 추가 ARCore 관련 속성을 노출하기 위한 XRCameraConfigurationExtensions를 제공합니다. 이러한 속성을 사용하여 앱에 적절한 카메라 구성을 설정할 수 있습니다.

확장 카메라 구성 속성 (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를 사용하면 앱의 요구사항에 따라 필터링하여 런타임 시 특정 기기에서 사용할 수 있는 카메라 구성 범위를 좁힐 수 있습니다.

카메라 캡처 프레임 속도를 30FPS로 제한

앱에 더 빠른 카메라 프레임 속도가 필요하지 않다면 30FPS로 제한할 수 있습니다. 60FPS 카메라 프레임 속도를 지원하는 기기에서 ARCore는 기본적으로 이 프레임 속도를 지원하는 카메라 구성에 우선순위를 둡니다. 60FPS를 지원하는 모든 카메라 구성을 필터링하려면 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;
}