Share via


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:

Képernyőkép a HoloLens-projekt beállításairól a webkamera tulajdonság kiemelésével

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

A hozzáadott síkkal rendelkező színész képernyőképe

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

Anyag- és anyagminta tervrajza

A PV kameracsatorna renderelése

  • A CamCapture tervben kapcsolja be a PV-kamerát:

Az ARCapture kapcsoló funkció tervrajza, amelyen a PV kamera be van kapcsolva

  • Hozzon létre egy dinamikus anyagpéldányt a CamTextureMaterialból, és rendelje hozzá ezt az anyagot a színész síkjára:

A Dinamikus anyagpéldány létrehozása függvény tervrajza

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

A dinamikus anyaghoz rendelt kameracsatorna anyagmintázatának tervrajza

  • Végül skálázza a síkot a kamera képaránya szerint:

A kameraképek méretarányához képest skálázott sík tervrajza

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:

A Get PVCamera to World Transform függvény tervrajza

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 Világűrsugár lekérése a kamerapontról tervrajza

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:

A Get PVCamera Intrinsics függvény tervrajza

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:

A világűr sugarának tervrajza annak kiderítésére, hogy mi található a világűrben egy adott koordinátán

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:

Tervrajz egy 2 méteres sugár leadott a kamera lencséje a kamera-tér helyzet 1/4 a bal felső sarokban a keret

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 .

Lásd még