HoloLens/Video Kamera ile Unreal

Bu HoloLens, hem Karma Gerçeklik Yakalama (MRC) hem de Unreal world alanında nesneleri kamera çerçevesindeki piksel koordinatlarından bulmak için kullanılmaktadır.

Önemli

PV Kamera Holographic Remoting ile desteklenememektedir, ancak HoloLens PV Camera işlevinin benzetimini yapmak için bilgisayarınıza bağlı bir web kamerasını kullanabilirsiniz.

PV Kamera Akışı Kurulumu

Önemli

PV kamerası hem Windows Mixed Reality OpenXR eklentisinde uygulanır. Ancak OpenXR için Microsoft OpenXR eklentisinin yüklü olması gerekir. Ayrıca, Unreal 4.26 için OpenXR'nin bir sınırlaması vardır: kamera DirectX11 RHI ile birlikte çalışır. Bu sınırlama Unreal 4.27.1 veya sonraki bir yıl içinde düzeltilmiştir.

  • Bu Project Ayarlar HoloLensWeb Kamerası özelliğini etkinleştirin:

Web kamerası HoloLens vurgulanmış şekilde proje ayarlarının ekran görüntüsü

  • "CamCapture" adlı yeni bir aktör oluşturun ve kamera beslemesini işlemek için bir düzlem ekleyin:

Eklenen düzleme sahip aktörün ekran görüntüsü

  • Aktörü sahnenize ekleyin, Doku Nesnesi Parametresiyle CamTextureMaterial adlı yeni bir malzeme ve doku örneği oluşturun. Dokuyu rgb verilerini çıkış emissive rengine gönderin:

Malzeme ve doku örneğinin şeması

PV Kamera Akışı İşleme

  • CamCapture şemasında PV Kamerayı aç:

PV Kamerası açıkken ARCapture geçiş işlevinin şeması

  • CamTextureMaterial'den dinamik bir malzeme örneği oluşturun ve bu malzemeyi aktörün düzleme atfedin:

Dinamik Malzeme Örneği Oluştur işlevinin şeması

  • Kamera akışından dokuyu elde etmek ve geçerli olması için dinamik malzemeye atamak. Doku geçerli değilse zamanlayıcıyı başlatarak zaman aşımı sonrasında yeniden deneyin:

Dinamik malzemeye atanan kamera akışı dokusu şeması

  • Son olarak, düzlemi kamera görüntüsünün en boy oranına göre ölçeklendirin:

Kamera görüntülerinin en boy oranına göre ölçeklendirilen düzlem şeması

Dünya Boşluğunda Kamera Konumlarını Bulma

2. HoloLens kamera, cihazın baş izleme cihazından dikey olarak uzaklığı gösterir. Dünya boşluğunda kamerayı bulmak ve uzaklığı hesaba eklemek için birkaç işlev vardır.

GetPVCameraToWorldTransform, PV Kamerasının dünya alanı dönüştürmeyi alır ve kamera lensi üzerinde yer alır:

GET PVCamera to World Transform işlevinin şeması

GetWorldSpaceRayFromCameraPoint, kamera çerçevesinde piksel içeriğini bulmak için Unreal world space'te kamera lenslerinden bir rayı sahneye taşır:

Kamera Noktasından Get World Space Ray Şeması

GetPVCameraIntrinsics, kamera iç değerlerini döndürür ve bu değerler bir kamera çerçevesinde görüntü işleme sırasında kullanılabilir:

PVCamera Iç işlevlerini al şeması

Dünya uzayda belirli bir piksel koordinatı üzerinde nelerin olduğunu bulmak için dünya uzayı ışığıyla bir çizgi izlemesi kullanın:

Belirli bir koordinatta dünya uzayda neler olduğunu bulmak için kullanılan dünya uzay grafisi şeması

Burada kamera lensini, çerçevenin sol üst kısmından 1/4 kamera alanı pozisyonuna 2 ölçümle attırıyoruz. Ardından isabet sonucu kullanarak nesnenin dünya uzayda var olduğu bir şeyi işebilirsiniz:

Kamera lenslerinden, çerçevenin sol üst kısmından 1/4 kamera-alan pozisyonuna 2 ölçüm grafitı şeması

Uzamsal eşleme kullanılırken, bu isabet konumu kameranın görmeye devam eder.

C++ içinde PV Kamera Akışı İşleme

  • CamCapture adlı yeni bir C++ aktörü oluşturma
  • Projenin build.cs'sinde PublicDependencyModuleNames listesine "AugmentedReality" ekleyin:
PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "AugmentedReality"
});
  • CamCapture.h içinde ARBlueprintLibrary.h'yi dahil etmek
#include "ARBlueprintLibrary.h"
  • Ayrıca örgü ve malzeme için yerel değişkenler de eklemeniz gerekir:
private:
    UStaticMesh* StaticMesh;
    UStaticMeshComponent* StaticMeshComponent;
    UMaterialInstanceDynamic* DynamicMaterial;
    bool IsTextureParamSet = false;
  • CamCapture.cpp'de oluşturucusu güncelleştirin ve sahneye statik bir örgü ekleyin:
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);
}

BeginPlay'de projenin kamera malzemelerinden dinamik bir malzeme örneği oluşturun, bunu statik örgü bileşenine uygulayabilir ve HoloLens başlatebilirsiniz.

Düzenleyicide, içerik tarayıcısında CamTextureMaterial'e sağ tıklayın ve CameraMatPath dizesini almak için "Başvuru Kopyala"yı seçin.

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

Onay işaretinde dokuyu kameradan al, CamTextureMaterial malzemesinde doku parametresine ayarlayın ve statik örgü bileşenini kamera çerçevesinin en boy oranına göre ölçeklendirin:

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

Sonraki Geliştirme Denetim Noktası

Ortaya konan Unreal geliştirme yolculuğunu takip ediyorsanız Karma Gerçeklik platformu özelliklerini ve API'lerini keşfetmenin tam ortasındayız. Buradan bir sonraki konuya devam edersiniz:

Veya doğrudan uygulamanızı bir cihaza veya öykünücüye dağıtmaya atlayın:

Her zaman Unreal geliştirme kontrol noktalarına herhangi bir zamanda geri dönabilirsiniz.

Ayrıca bkz.