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:

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

- 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:

De PV-camerafeed weergeven
- Schakel in de blauwdruk CamCapture de PV-camera in:

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

- 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:

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

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:

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:

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

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

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:

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.




