LocatableCamera (PhotoCapture) на Hololens 2 - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть 2 проблемы при использовании PhotoCapture на Hololens 2, которые, вероятно, связаны. Они не встречались на Hololens 1.

  • Единственное доступное разрешение - 3904x2196
  • Получение CameraToWorldMatrix всегда дает сбой

Как видно на docs , это разрешение не связано с частотой кадров. Я предполагаю, что CameraToWorldMatrix можно получить только для профилей камер с более низким разрешением.

Как я могу изменить разрешение и получить матрицу в Unity?


Пример минимальной воспроизводимости

Я использую Unity 2019.2.19f1 и Visual Studio 2019 Community (16.4.5)

  1. Создайте новый проект Unity, выполнив шаги здесь , за исключением использования IL2 CPP в качестве серверного сценария вместо. NET
  2. В Настройки проигрывателя: Возможности включить InternetClient , InternetClientServer , PrivateNetworkClientServer , Веб-камера , Микрофон и SpatialPerception , в Настройки проигрывателя: Поддерживаемые семейства устройств выберите Голография c
  3. Создайте новый пустой игровой объект и добавьте следующий скрипт:

    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using UnityEngine.Windows.WebCam;
    
    public class PhotoCaptureController : MonoBehaviour
    {
        PhotoCapture photoCaptureObject = null;
    
        bool isRunning = false;
    
        void Start()
        {
            StartCoroutine(StartCameraCapture());
        }
    
        private IEnumerator StartCameraCapture()
        {
            if (!Application.HasUserAuthorization(UserAuthorization.WebCam))
            {
                yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
            }
            if (Application.HasUserAuthorization(UserAuthorization.WebCam))
            {
                Debug.Log("Creating PhotoCapture");
                PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
            }
            else
            {
                Debug.Log("Webcam Permission not granted");
            }
        }
    
        private void Update()
        {
            if (isRunning)
            {
                photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
            }
        }
    
        void OnPhotoCaptureCreated(PhotoCapture captureObject)
        {
            photoCaptureObject = captureObject;
    
            IEnumerable<Resolution> availableResolutions = PhotoCapture.SupportedResolutions;
    
            foreach (var res in availableResolutions)
            {
                Debug.Log("PhotoCapture Resolution: " + res.width + "x" + res.height);
            }
    
            Resolution cameraResolution = availableResolutions.OrderByDescending((res) => res.width * res.height).First();
    
            CameraParameters c = new CameraParameters();
            c.hologramOpacity = 0.0f;
            c.cameraResolutionWidth = cameraResolution.width;
            c.cameraResolutionHeight = cameraResolution.height;
            c.pixelFormat = CapturePixelFormat.BGRA32;
    
            captureObject.StartPhotoModeAsync(c, OnPhotoModeStarted);
        }
    
        private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
        {
            if (result.success)
            {
                isRunning = true;
                photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
            }
        }
    
        void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame frame)
        {
            if (result.success)
            {
                if (frame.TryGetCameraToWorldMatrix(out Matrix4x4 cameraToWorldMatrix))
                {
                    Debug.Log("Successfully obtained CameraToWorldMatrix: " + cameraToWorldMatrix.ToString());
    
                }
                else
                {
                    Debug.Log("Failed to obtain CameraToWorldMatrix");
                }
            }
            frame.Dispose();
        }
    }
    
  4. Изменить настройки сборки: enter image description here
  5. Построить, открыть VS решение, установить build t arget для ARM64 , Отладка и развертывание на Устройство

1 Ответ

1 голос
/ 09 марта 2020

Этот CameraCapture плагин может работать для вас. Это родной плагин для Unity. Файл readme.txt содержит информацию о его создании. По сути, вам нужно создать собственные варианты плагинов, прежде чем пытаться открыть образец Unity. Если вы не создали компоненты C ++ / WinRT, вам может потребоваться go с помощью шагов установки здесь . Файл SpatialCameraTracker.cs показывает, как получать матрицы камер.

Эта поддержка минимальна, но весь код находится в репо

...