2023-12-22 11:46:53 +08:00
|
|
|
---
|
|
|
|
title: UE5 3DGaussians 插件笔记
|
|
|
|
date: 2023-12-22 11:44:33
|
|
|
|
excerpt:
|
|
|
|
tags:
|
|
|
|
rating: ⭐
|
|
|
|
---
|
|
|
|
|
|
|
|
# c++
|
|
|
|
插件的c++部分主要实现了
|
2023-12-22 12:52:20 +08:00
|
|
|
- FThreeDGaussians——可以理解为一个场景或者根节点
|
|
|
|
- FThreeDGaussiansTree——类似BVH的空间切分树
|
|
|
|
- FThreeDGaussiansData——具体数据
|
|
|
|
-
|
2023-12-22 11:46:53 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 相关代码
|
|
|
|
```c++
|
|
|
|
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;
|
|
|
|
};
|
2023-12-22 12:52:20 +08:00
|
|
|
|
|
|
|
/** 类似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;
|
|
|
|
};
|
2023-12-22 11:46:53 +08:00
|
|
|
```
|