BlueRoseNote/03-UnrealEngine/Rendering/RenderFeature/UE5 3DGaussians 插件笔记.md

2.8 KiB

title, date, excerpt, tags, rating
title date excerpt tags rating
UE5 3DGaussians 插件笔记 2023-12-22 11:44:33

c++

插件的c++部分主要实现了

  • FThreeDGaussians——可以理解为一个场景或者根节点
    • FThreeDGaussiansTree——类似BVH的空间切分树
    • FThreeDGaussiansData——具体数据

相关代码

struct FThreeDGaussiansData
{
	GENERATED_BODY()
public:
	FThreeDGaussiansData() {}
	FThreeDGaussiansData(const TArray<UTexture2D*>& textures, const FVector3f& in_minPos, const FVector3f& in_maxPos)
	{
		minPos = in_minPos;
		maxPos = in_maxPos;
		textureWidth = textures[0]->GetSizeX();
		position = textures[0];
		rotation = textures[1];
		scaleAndOpacity = textures[2];

		for (int i = 3; i < textures.Num(); i++)
		{
			sh.Add(textures[i]);
		}
	}

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") FVector3f minPos = FVector3f::Zero();
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") FVector3f maxPos = FVector3f::Zero();
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") int32 textureWidth = -1;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* position;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* rotation;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") UTexture2D* scaleAndOpacity;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<UTexture2D*> sh;
};

/** 类似BVH的控件数据结构 */
USTRUCT(BlueprintType)
struct FThreeDGaussiansTree
{
	GENERATED_BODY()
public:
	FThreeDGaussiansTree() {}

	// Axis for split (x=0, y=1, z=2)
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	int32 splitAxis = -1;
	// max value of the position of gaussian in child0 or leaf0 in "splitAxis" axis
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	float splitValue = 0.0f;

	// index of child tree node (Index of TArray<FThreeDGaussiansTree> tree)
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	int32 childIndex0 = -1;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	int32 childIndex1 = -1;

	// index of child data node (Index of TArray<FThreeDGaussiansData> data)
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	int32 leafIndex0 = -1;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians")	int32 leafIndex1 = -1;
};

/* 作为3D高斯数据的载荷 */
USTRUCT(BlueprintType)
struct FThreeDGaussians
{
	GENERATED_BODY()
public:
	FThreeDGaussians() {}

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<FThreeDGaussiansData> data;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "3D Gaussians") TArray<FThreeDGaussiansTree> tree;
};