Cámara de foto y vídeo HoloLens en Unreal

HoloLens tiene una cámara de fotos y vídeo en el visor que se puede usar tanto en la Captura de realidad mixta (MRC) como para localizar objetos de un espacio global de Unreal desde coordenadas de píxeles en el enfoque de la cámara.

Importante

La cámara de foto y vídeo no es compatible con el control remoto de holografías, pero es posible usar una cámara web conectada a su equipo para simular la funcionalidad de dicha cámara de HoloLens.

Configuración de la fuente de la cámara de fotos y vídeo

Importante

La cámara de fotos y vídeo se implementa en los complementos de Windows Mixed Reality y OpenXR. Sin embargo, OpenXR requiere que el complemento OpenXR de Microsoft esté instalado. Además, OpenXR para Unreal 4.26 tiene una limitación: la cámara puede funcionar con DirectX11 RHI. Esta limitación se ha corregido en la versión 4.27.1 o posterior de Unreal.

  • En Configuración del proyecto > HoloLens, habilite la funcionalidad Cámara web:

Captura de pantalla de la configuración del proyecto de HoloLens con la propiedad Cámara web resaltada

  • Cree un nuevo actor llamado "CamCapture" y agregue un plano para representar la fuente de la cámara:

Captura de pantalla de un actor con un plano agregado

  • Agregue el actor a la escena, cree un nuevo material denominado CamTextureMaterial con un parámetro de objeto de textura y un ejemplo de textura. Envíe los datos RGB de la textura al color emisor de salida:

Plano de un ejemplo de material y textura

Representación de la fuente de la cámara de fotos y vídeo

  • En el plano técnico CamCapture, active la cámara de fotos y vídeo:

Plano técnico de la función Toggle ARCapture con la cámara de fotos y vídeo activada

  • Cree una instancia de material dinámico a partir de CamTextureMaterial y asigne este material al plano del actor:

Plano técnico de la función Create Dynamic Material Instance

  • Obtenga la textura de la fuente de la cámara y asígnela al material dinámico si es válida. Si la textura no es válida, inicie un temporizador y vuelva a intentarlo después del tiempo de espera:

Plano técnico de la textura de la fuente de la cámara asignada al material dinámico

  • Por último, escale el plano mediante la relación de aspecto de la imagen de la cámara:

Plano técnico del plano escalado asociado a la relación de aspecto de las imágenes de la cámara

Búsqueda de posiciones de la cámara en el espacio global

La cámara de HoloLens 2 se desplaza verticalmente desde el seguimiento del cabezal del dispositivo. Existen algunas funciones que permiten ubicar la cámara en el espacio global para tenerlo en cuenta para el desplazamiento.

GetPVCameraToWorldTransform obtiene la transformación en el espacio global de la cámara PV y se coloca en la lente de la cámara:

Plano técnico de la función Get PVCamera to World Transform

GetWorldSpaceRayFromCameraPoint envía un rayo desde la lente de la cámara en la escena del espacio global de Unreal a fin de buscar el contenido de un píxel del encuadre de la cámara:

Plano técnico de la obtención del rayo del espacio global desde el punto de mira de la cámara

GetPVCameraIntrinsics devuelve los valores intrínsecos de la cámara, que se pueden usar al realizar el procesamiento de Computer Vision en un encuadre de la cámara:

Plano técnico de la obtención de las funciones intrínsecas de la cámara de fotos y vídeo

Para buscar lo que hay en el espacio global de una coordenada de píxeles determinada, use un seguimiento de líneas con el rayo del espacio global:

Plano técnico del rayo de espacio global que se usa para averiguar qué hay en el espacio global de una coordenada determinada

Aquí enviamos un rayo de 2 metros desde la lente de la cámara a la posición de un cuarto del espacio de la cámara de la parte superior izquierda del encuadre. A continuación, use el resultado de posicionamiento para representar un sitio en que el objeto exista en el espacio global:

Plano técnico de un envío de un rayo de 2 metros de la lente de la cámara a la posición de un cuarto del espacio de la cámara desde la parte superior izquierda del encuadre.

Cuando se use la asignación espacial, este posicionamiento coincidirá con la superficie que enfoca la cámara.

Representación de la fuente de la cámara de fotos y vídeo en C++

  • Cree un nuevo actor de C++ llamado CamCapture.
  • En el archivo build.cs del proyecto, agregue "AugmentedReality" en la lista de PublicDependencyModuleNames:
PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "AugmentedReality"
});
  • En CamCapture.h, incluya ARBlueprintLibrary.h.
#include "ARBlueprintLibrary.h"
  • También debe agregar variables locales para la malla y el material:
private:
    UStaticMesh* StaticMesh;
    UStaticMeshComponent* StaticMeshComponent;
    UMaterialInstanceDynamic* DynamicMaterial;
    bool IsTextureParamSet = false;
  • En CamCapture.cpp, actualice el constructor para agregar una malla estática a la escena:
ACamCapture::ACamCapture()
{
    PrimaryActorTick.bCanEverTick = true;

    // Load a mesh from the engine to render the camera feed to.
    StaticMesh = LoadObject<UStaticMesh>(nullptr, TEXT("/Engine/EngineMeshes/Cube.Cube"), nullptr, LOAD_None, nullptr);

    // Create a static mesh component to render the static mesh
    StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("CameraPlane"));
    StaticMeshComponent->SetStaticMesh(StaticMesh);

    // Scale and add to the scene
    StaticMeshComponent->SetWorldScale3D(FVector(0.1f, 1, 1));
    this->SetRootComponent(StaticMeshComponent);
}

En BeginPlay, cree una instancia de material dinámico a partir del material de la cámara del proyecto, aplíquela al componente de la malla estática e inicie la cámara HoloLens.

En el editor, haga clic con el botón derecho en CamTextureMaterial en el explorador de contenido y seleccione "Copiar referencia" para obtener la cadena de CameraMatPath.

void ACamCapture::BeginPlay()
{
    Super::BeginPlay();

    // Create a dynamic material instance from the game's camera material.
    // Right-click on a material in the project and select "Copy Reference" to get this string.
    FString CameraMatPath("Material'/Game/Materials/CamTextureMaterial.CamTextureMaterial'");
    UMaterial* BaseMaterial = (UMaterial*)StaticLoadObject(UMaterial::StaticClass(), nullptr, *CameraMatPath, nullptr, LOAD_None, nullptr);
    DynamicMaterial = UMaterialInstanceDynamic::Create(BaseMaterial, this);

    // Use the dynamic material instance when rendering the camera mesh.
    StaticMeshComponent->SetMaterial(0, DynamicMaterial);

    // Start the webcam.
    UARBlueprintLibrary::ToggleARCapture(true, EARCaptureType::Camera);
}

En Tic, obtenga la textura de la cámara, establézcala en el parámetro Texture en el material de CamTextureMaterial y escale el componente de malla estática con la relación de aspecto del encuadre de la cámara:

void ACamCapture::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // Dynamic material instance only needs to be set once.
    if(IsTextureParamSet)
    {
        return;
    }

    // Get the texture from the camera.
    UARTexture* ARTexture = UARBlueprintLibrary::GetARTexture(EARTextureType::CameraImage);
    if(ARTexture != nullptr)
    {
        // Set the shader's texture parameter (named "Param") to the camera image.
        DynamicMaterial->SetTextureParameterValue("Param", ARTexture);
        IsTextureParamSet = true;

        // Get the camera instrincs
        FARCameraIntrinsics Intrinsics;
        UARBlueprintLibrary::GetCameraIntrinsics(Intrinsics);

        // Scale the camera mesh by the aspect ratio.
        float R = (float)Intrinsics.ImageResolution.X / (float)Intrinsics.ImageResolution.Y;
        StaticMeshComponent->SetWorldScale3D(FVector(0.1f, R, 1));
    }
}

Siguiente punto de control de desarrollo

Si sigue el recorrido de desarrollo de Unreal que hemos diseñado, significa que ya se encuentra en proceso de explorar las API y funcionalidades de la plataforma de realidad mixta. Desde aquí, puede continuar con el siguiente tema:

O bien puede ir directamente a la implementación de la aplicación en un dispositivo o emulador:

Puede volver a los puntos de control de desarrollo de Unreal en cualquier momento.

Consulta también