Unreal Engine C++ 类:生成随机高度的二维区域网格
使用 C++ 编写一个可以在 Unreal Engine 中使用的类,它具有以下功能:
- 有两个浮点数输入接口,分别是坐标 x 和坐标 y,可以根据输入的值定义一个二维区域。
- 根据定义的二维区域,生成与整数坐标值对应的点。
- 为生成的点添加随机的高度值,范围是 0~255。
- 根据调整后的点生成 mesh。
- 要提供完整代码,包括 cpp 和头文件代码内容:
头文件代码:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ProceduralMeshComponent.h"
#include "MyProceduralMeshActor.generated.h"
UCLASS()
class YOURPROJECT_API AMyProceduralMeshActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyProceduralMeshActor();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
float XSize;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
float YSize;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
int32 NumX;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
int32 NumY;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
bool bSmoothNormals;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = 'Procedural Mesh')
UMaterialInterface* Material;
UFUNCTION(BlueprintCallable, Category = 'Procedural Mesh')
void GenerateMesh();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = 'Procedural Mesh')
UProceduralMeshComponent* Mesh;
private:
TArray<FVector> Vertices;
TArray<int32> Triangles;
TArray<FVector2D> UVs;
TArray<FVector> Normals;
void AddTriangle(int32 V1, int32 V2, int32 V3);
};
实现代码:
#include "MyProceduralMeshActor.h"
// Sets default values
AMyProceduralMeshActor::AMyProceduralMeshActor()
{
XSize = 100.0f;
YSize = 100.0f;
NumX = 10;
NumY = 10;
bSmoothNormals = false;
Mesh = CreateDefaultSubobject<UProceduralMeshComponent>('ProceduralMesh');
RootComponent = Mesh;
}
// Called when the game starts or when spawned
void AMyProceduralMeshActor::BeginPlay()
{
Super::BeginPlay();
}
void AMyProceduralMeshActor::GenerateMesh()
{
Vertices.Empty();
Triangles.Empty();
UVs.Empty();
Normals.Empty();
// Generate vertices
for (int32 Y = 0; Y <= NumY; ++Y)
{
for (int32 X = 0; X <= NumX; ++X)
{
FVector Vertex((float)X / (float)NumX * XSize, (float)Y / (float)NumY * YSize, 0.0f);
Vertex.Z = FMath::RandRange(0.0f, 255.0f);
Vertices.Add(Vertex);
FVector2D UV((float)X / (float)NumX, (float)Y / (float)NumY);
UVs.Add(UV);
Normals.Add(FVector(0.0f, 0.0f, 1.0f));
}
}
// Generate triangles
for (int32 Y = 0; Y < NumY; ++Y)
{
for (int32 X = 0; X < NumX; ++X)
{
int32 V1 = Y * (NumX + 1) + X;
int32 V2 = (Y + 1) * (NumX + 1) + X;
int32 V3 = V1 + 1;
int32 V4 = V2 + 1;
AddTriangle(V1, V2, V3);
AddTriangle(V3, V2, V4);
}
}
Mesh->CreateMeshSection(0, Vertices, Triangles, Normals, UVs, TArray<FColor>(), TArray<FProcMeshTangent>(), bSmoothNormals);
Mesh->SetMaterial(0, Material);
}
void AMyProceduralMeshActor::AddTriangle(int32 V1, int32 V2, int32 V3)
{
Triangles.Add(V1);
Triangles.Add(V2);
Triangles.Add(V3);
}
该代码创建了一个名为 AMyProceduralMeshActor 的类,该类继承自 AActor 类,并包含生成随机高度的二维区域网格的必要功能。
代码中的 GenerateMesh 函数首先清空 Vertices、Triangles、UVs 和 Normals 数组。然后,它循环遍历每个点,根据 XSize、YSize 和 NumX、NumY 计算点的位置,并添加随机的高度值。最后,它生成三角形,并使用 CreateMeshSection 函数创建网格。
该类提供了一个可配置的接口,可以调整网格的大小、密度和材质。它也可以轻松地扩展以支持其他功能,例如生成纹理或使用其他方法生成高度值。
注意: 在使用该类之前,需要确保您的项目中已包含 ProceduralMeshComponent 类。
原文地址: https://www.cveoy.top/t/topic/nal8 著作权归作者所有。请勿转载和采集!