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:

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

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

PV Kamera Akışı İşleme
- CamCapture şemasında PV Kamerayı aç:

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

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

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

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:

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

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:

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

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:

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.




