HoloLens-/videocamera in Unreal

De HoloLens heeft een PV-camera (Photo/Video) op het visor die kan worden gebruikt voor zowel Vastleggen in mixed reality (MRC) als het zoeken naar objecten in de Ruimte van de Onwerkelijke wereld op basis van pixelcoördinaten in het cameraframe.

Belangrijk

De PV-camera wordt niet ondersteund met Holographic Remoting, maar het is mogelijk om een webcam te gebruiken die is gekoppeld aan uw pc om de functionaliteit van HoloLens PV Camera te simuleren.

Installatie van PV-camerafeed

Belangrijk

De PV-camera is geïmplementeerd in zowel Windows Mixed Reality als OpenXR-invoegvoegingen. OpenXR heeft echter de Microsoft OpenXR-invoeging nodig om te worden geïnstalleerd. OpenXR voor Unreal 4.26 heeft ook een beperking: de camera kan werken met DirectX11 RHI. Deze beperking is opgelost in Unreal 4.27.1 of hoger.

  • Schakel in Project Instellingen HoloLensde mogelijkheid Webcam in:

Schermopname van de HoloLens projectinstellingen met de eigenschap Webcam gemarkeerd

  • Maak een nieuwe actor met de naam 'CamCapture' en voeg een vlak toe om de camerafeed weer te geven:

Schermopname van een actor met een toegevoegde vlak

  • Voeg de actor toe aan uw scène, maak een nieuw materiaal met de naam CamTextureMaterial met een patroonobjectparameter en een patroonvoorbeeld. Verzend de rgb-gegevens van het patroon naar de uitvoerkleur:

Blauwdruk van een materiaal- en patroonvoorbeeld

De PV-camerafeed weergeven

  • Schakel in de blauwdruk CamCapture de PV-camera in:

Blauwdruk van de functie Toggle ARCapture met de PV-camera ingeschakeld

  • Maak een exemplaar van dynamisch materiaal van CamTexture Material en wijs dit materiaal toe aan het vlak van de actor:

Blauwdruk van de functie Dynamisch materiaal-exemplaar maken

  • Haal het patroon op uit de camerafeed en wijs het toe aan het dynamische materiaal als dit geldig is. Als het patroon niet geldig is, start u een timer en probeert u het opnieuw na de time-out:

Blauwdruk van het patroon van de camerafeed die is toegewezen aan het dynamische materiaal

  • Schaal ten slotte het vlak op de aspectverhouding van de cameraafbeelding:

Blauwdruk van het vlak dat is geschaald ten opzichte van de beeldverhouding van de camera-afbeeldingen

Cameraposities in de wereldruimte zoeken

De camera op de HoloLens 2 wordt verticaal verschoven van de head tracking van het apparaat. Er bestaan enkele functies om de camera in de wereldruimte te vinden om de offset te verantwoorden.

GetPVCameraToWorldTransform haalt de transformatie op in de wereldruimte van de PV-camera en wordt op de cameralens geplaatst:

Blauwdruk van de functie GET PVCamera to World Transform

GetWorldSpaceRayFromCameraPoint cast een straal van de cameralens in de scène in de Ruimte van Unreal om de inhoud van een pixel in het cameraframe te vinden:

Blauwdruk van de Get World Space Ray van camerapunt

GetPVCameraIntrinsics retourneert de intrinsieke waarden van de camera, die kunnen worden gebruikt bij het verwerken van Computer Vision in een cameraframe:

Blauwdruk van PvCamera Intrinsieke functies krijgen

Als u wilt weten wat er in de wereldruimte op een bepaalde pixelcoördinaat bestaat, gebruikt u een lijnlijn met de ruimte ray world:

Blauwdruk van de ruimtefoto van de wereld die wordt gebruikt om erachter te komen wat er in de wereldruimte op een bepaalde coördinaat bestaat

Hier casten we een 2-meter ray van de cameralens naar de positie van de cameraruimte 1/4 vanaf de linkerbovenhoek van het frame. Gebruik vervolgens het trefferresultaat om iets weer te geven waarin het object zich in de wereldruimte bevindt:

Blauwdruk van een 2-meter ray cast van de cameralens naar de positie van de cameraruimte 1/4 vanaf de linkerbovenhoek van het frame

Wanneer u ruimtelijke toewijzing gebruikt, komt deze trefferpositie overeen met het oppervlak dat de camera ziet.

De PV-camerafeed weergeven in C++

  • Maak een nieuwe C++-actor met de naam CamCapture
  • Voeg in build.cs van het project 'AugmentedReality' toe aan de lijst PublicDependencyModuleNames:
PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "AugmentedReality"
});
  • Neem in CamCapture.h ARBlueprintLibrary.h op
#include "ARBlueprintLibrary.h"
  • U moet ook lokale variabelen toevoegen voor de mesh en het materiaal:
private:
    UStaticMesh* StaticMesh;
    UStaticMeshComponent* StaticMeshComponent;
    UMaterialInstanceDynamic* DynamicMaterial;
    bool IsTextureParamSet = false;
  • Werk in CamCapture.cpp de constructor bij om een statisch mesh toe te voegen aan de scène:
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);
}

Maak in BeginPlay een exemplaar van dynamisch materiaal op basis van het cameramateriaal van het project, pas dit toe op het onderdeel static mesh en start de HoloLens camera.

Klik in de editor met de rechtermuisknop op CamTextureMaterial in de inhoudsbrowser en selecteer Referentie kopiëren om de tekenreeks voor CameraMatPath op te halen.

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);
}

Stel in Tik het patroon van de camera op, stel deze in op de patroonparameter in het CamTexture Material-materiaal en schaal het statische mesh-onderdeel op basis van de beeldverhouding van het cameraframe:

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));
    }
}

Volgende controlepunt voor ontwikkeling

Als u het Ontwikkelingsproces van Unreal volgt dat we hebben bespraken, bent u bezig met het verkennen van de mogelijkheden en API's van Mixed Reality platform. Hier kunt u doorgaan naar het volgende onderwerp:

Of ga rechtstreeks naar het implementeren van uw app op een apparaat of emulator:

U kunt altijd op elk moment teruggaan naar de controlepunten voor Ontwikkeling van Unreal.

Zie ook