HoloLens Fénykép/videó kamera az Unrealben

A HoloLens rendelkezik egy fénykép/videó (PV) kamerával a vizoron, amely használható az Vegyes valóság rögzítése (MRC) és az objektumok Irreális világtérben való megkeresése 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 is szimulálható a HoloLens PV Camera funkció.

PV kameracsatorna beállítása

Fontos

A PV kamera a két Windows Mixed Reality OpenXR beépülő modulban van megvalósítva. Az OpenXR-nek azonban telepítenie kell a Microsoft OpenXR beépülő modult. Az Unreal 4.26-ra vonatkozó OpenXR-nek is van egy korlátja: a kamera képes a DirectX11 PEDIG a HASZNÁLATRA. Ez a korlátozás az Unreal 4.27.1-es vagy újabb ában van kijavítva.

  • A Project Gépház > HoloLens engedélyezheti a Webkamerás képességet:

Képernyőkép a HoloLens beállításairól, kiemelt Webkamerás tulajdonsággal

  • Hozzon létre egy "CamCapture" nevű új szereplőt, és adjon hozzá egy síkot a kameracsatorna megjelenítéséhez:

Képernyőkép az aktorról hozzáadott síkkal

  • Adja hozzá a színészt a jelenethez, hozzon létre egy CamTextureMaterial nevű új anyagot egy Textúra objektumparaméterrel és egy textúramintával. Küldje el a textúra rgb-adatait a kimeneti megengedő színnek:

Anyag- és textúraminta terve

A PV kameracsatorna renderelése

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

A Toggle ARCapture függvény terve bekapcsolt PV kamerával

  • Hozzon létre egy dinamikus anyagpéldányt a CamTextureMaterial tulajdonságból, és rendelje hozzá ezt az anyagot az aktor síkhoz:

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

  • Szerezze be a textúra mintázatát a kameracsatornából, és rendelje hozzá a dinamikus anyaghoz, ha az érvényes. Ha a textúra nem érvényes, indítson el egy időzítőt, és próbálkozzon újra az időtúllépés után:

A dinamikus anyaghoz rendelt kameracsatorna textúra tervét

  • Végül skálázja a síkot a kamera képaránya alapján:

A kameraképek méretarányához viszonyítottan skálázható sík terv

Kamerapozíciók megkeresi a világűrben

A 2. HoloLens kamera függőlegesen el van tolva az eszköz fejkövetéséhez. Néhány függvény létezik a kamera megkeresése a világűrben, hogy figyelembe tudja venni az eltolást.

A GetPVCameraToWorldTransform a PV kamera világűrében kapja meg az átalakítást, és a kamera objektívén lesz elpozícióban:

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

A GetWorldSpaceRayFromCameraPoint átképzi a kamerás objektívről a sugarat az Unreal világűrben található jelenetbe, hogy megkeressen egy képpont tartalmát a kamerakeretben:

A Get World Space Ray terve a kamerapontról

A GetPVCameraIntrinsics visszaadja a kamera belső értékeit, amelyek akkor használhatók, ha számítógépes látásfeldolgozást végzünk egy kamerakereten:

A Get PVCamera Intrinsics függvények terve

Ha meg kell találnia, hogy mi létezik a világűrben egy adott képpont koordinátán, használjon vonalnyomot a világűri sugárhoz:

A világűri sugár tervét, amely egy adott koordináta alapján kideríti, hogy mi létezik a világűrben

Itt egy kétmérős sugarat a kamera objektívről a képkeret bal felső oldalának 1/4-es állású kamerahelyi helyzetébe dobunk. Ezután a találati eredmény használatával renderelje azt, ahol az objektum létezik a világűrben:

A kamera objektívből a képkeret bal felső oldalának 1/4-es pozíciójába ékezetes, 2 mérőműveletes sugárművelet terve

Térbeli leképezés használata esetén ez a találati pozíció megegyezik a kamera által látott felülettel.

A PV kameracsatorna renderelése C++ módban

  • Új, CamCapture nevű C++ aktor létrehozása
  • A projekt build.cs fájlában adja hozzá a "AugmentedReality" et a PublicDependencyModuleNames listához:
PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "AugmentedReality"
});
  • A CamCapture.h-ban foglalja bele az ARBlueprintLibrary.h et
#include "ARBlueprintLibrary.h"
  • A hálóhoz és az anyaghoz helyi változókat is hozzá kell adni:
private:
    UStaticMesh* StaticMesh;
    UStaticMeshComponent* StaticMeshComponent;
    UMaterialInstanceDynamic* DynamicMaterial;
    bool IsTextureParamSet = false;
  • A CamCapture.cpp fájlban frissítse a konstruktort, hogy statikus hálót adjon 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ában, alkalmazza azt a statikus háló összetevőre, és indítsa el HoloLens a kamerát.

A szerkesztőben a tartalomböngészőben kattintson a jobb gombbal a CamTextureMaterial elemre, és válassza a "Hivatkozás másolása" lehetőséget a CameraMatPath sztringjének lekért értékhez.

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 Tick függvényben szerezze be a textúra mintázatát a kamerától, állítsa be a CamTextureMaterial anyag textúraparaparaméterére, és méretezd a statikus háló összetevőt a kamera képaránya alapján:

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 a már kifektetett Unreal-fejlesztési utat követi, akkor most ismerkedik az Mixed Reality platform képességeivel és API-ásával. Innen folytathatja a következő témakört:

Vagy közvetlenül is üzembe helyezheti az alkalmazást egy eszközön vagy emulátoron:

Bármikor visszamehet az Unreal fejlesztési ellenőrzőpontjaira.

Lásd még