HoloLens fénykép-/videokamera az Unrealben
A HoloLens a kép/videó (PV) kamerával rendelkezik a viszoron, amely Mixed Reality Rögzítés (MRC) és az Irreális világűrben lévő objektumok kereséséhez használható a kamerakeret képpontkoordinátáiból.
Fontos
A PV kamera nem támogatott a Holographic Remoting funkcióval, de a számítógéphez csatlakoztatott webkamerával szimulálható a HoloLens PV Kamera funkció.
PV kameracsatorna beállítása
Fontos
A PV kamera Windows Mixed Reality és OpenXR beépülő modulokban is implementálva van. Az OpenXR-nek azonban telepítenie kell a Microsoft OpenXR beépülő modult . Az Unreal 4.26-hoz készült OpenXR-nek is van egy korlátja: a kamera együttműködhet a DirectX11 RHI-vel. Ez a korlátozás az Unreal 4.27.1-ben vagy újabb verzióiban van javítva.
- A Project Settings > HoloLensben engedélyezze a Webkamera funkciót:
- Hozzon létre egy "CamCapture" nevű új szereplőt, és adjon hozzá egy síkot a kamera hírcsatornájának megjelenítéséhez:
- Adja hozzá a színészt a jelenethez, hozzon létre egy CamTextureMaterial nevű új anyagot egy Textúraobjektum-paraméterrel és egy textúramintával. Küldje el a textúra rgb-adatait a kimeneti megengedő színre:
A PV kameracsatorna renderelése
- A CamCapture tervben kapcsolja be a PV-kamerát:
- Hozzon létre egy dinamikus anyagpéldányt a CamTextureMaterialból, és rendelje hozzá ezt az anyagot a színész síkjára:
- Szerezze be az anyagmintát a kameracsatornából, és rendelje hozzá a dinamikus anyaghoz, ha érvényes. Ha a textúra érvénytelen, indítsa el az időzítőt, és próbálkozzon újra az időtúllépés után:
- Végül skálázza a síkot a kamera képaránya szerint:
Kamerapozíciók keresése a világűrben
A HoloLens 2 kamerája függőlegesen eltolódik az eszköz fejkövetésétől. Néhány függvény létezik a kamera világűrben való megkereséséhez, hogy figyelembe vegyék az eltolást.
GetPVCameraToWorldTransform lekéri az átalakítást a világűrben a PV kamera, és lesz elhelyezve a kamera objektív:
GetWorldSpaceRayFromCameraPoint egy sugarat vet a kamera lencséjéből a jelenetbe az Unreal world space-ben, hogy megtalálja a képpont tartalmát a kamerakeretben:
A GetPVCameraIntrinsics visszaadja a kamera belső értékeit, amelyek a kamerakereten végzett számítógépes látásfeldolgozás során használhatók:
Ha meg szeretné találni, hogy mi található a világűrben egy adott képpontkoordinátával, használjon egy vonalkövetést a világűr sugarával:
Itt leadott egy 2 méter sugarú a kamera objektív a kamera-tér pozíció 1/4 a bal felső sarokban a keret. Ezután a találat eredményével megjeleníthet valamit, ahol az objektum létezik a világűrben:
Térbeli leképezés használatakor ez a találati pozíció megegyezik a kamera által látott felülettel.
A PV kameracsatorna renderelése c++ nyelven
- Hozzon létre egy új C++ aktort CamCapture néven
- A projekt build.cs fájljában adja hozzá az "AugmentedReality" kifejezést a PublicDependencyModuleNames listához:
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"AugmentedReality"
});
- A CamCapture.h fájlban adja meg az ARBlueprintLibrary.h elemet
#include "ARBlueprintLibrary.h"
- Helyi változókat is hozzá kell adnia a hálóhoz és az anyaghoz:
private:
UStaticMesh* StaticMesh;
UStaticMeshComponent* StaticMeshComponent;
UMaterialInstanceDynamic* DynamicMaterial;
bool IsTextureParamSet = false;
- A CamCapture.cpp-ben frissítse a konstruktort, hogy statikus hálót adjon hozzá a jelenethez:
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);
}
A BeginPlayben hozzon létre egy dinamikus anyagpéldányt a projekt kameraanyagából, alkalmazza azt a statikus háló összetevőre, és indítsa el a HoloLens kamerát.
A szerkesztőben kattintson a jobb gombbal a CamTextureMaterial elemre a tartalomböngészőben, és válassza a "Hivatkozás másolása" lehetőséget a CameraMatPath sztringjének lekéréséhez.
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);
}
A Tickben szerezze be az anyagmintát a kamerából, állítsa be a CamTextureMaterial anyag textúraparaméterére, és skálázza a statikus háló összetevőt a kamerakeret méretarányával:
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));
}
}
Következő fejlesztési ellenőrzőpont
Ha az Általunk ismertetett Unreal fejlesztési folyamatot követi, akkor a Mixed Reality platform képességeinek és API-jainak felfedezésének közepén jár. Innen folytathatja a következő témakört:
Vagy közvetlenül az alkalmazás eszközre vagy emulátorra való üzembe helyezéséhez:
Bármikor visszatérhet az Unreal fejlesztési ellenőrzőpontjaihoz .