У меня есть 2 проблемы при использовании PhotoCapture на Hololens 2, которые, вероятно, связаны. Они не встречались на Hololens 1.
- Единственное доступное разрешение - 3904x2196
- Получение CameraToWorldMatrix всегда дает сбой
Как видно на docs , это разрешение не связано с частотой кадров. Я предполагаю, что CameraToWorldMatrix можно получить только для профилей камер с более низким разрешением.
Как я могу изменить разрешение и получить матрицу в Unity?
Пример минимальной воспроизводимости
Я использую Unity 2019.2.19f1 и Visual Studio 2019 Community (16.4.5)
- Создайте новый проект Unity, выполнив шаги здесь , за исключением использования IL2 CPP в качестве серверного сценария вместо. NET
- В Настройки проигрывателя: Возможности включить InternetClient , InternetClientServer , PrivateNetworkClientServer , Веб-камера , Микрофон и SpatialPerception , в Настройки проигрывателя: Поддерживаемые семейства устройств выберите Голография c
Создайте новый пустой игровой объект и добавьте следующий скрипт:
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();
}
}
- Изменить настройки сборки:
- Построить, открыть VS решение, установить build t arget для ARM64 , Отладка и развертывание на Устройство