Как работать с ProceduralMeshComponent

Салют, DTF! Довелось мне недавно поработать с процедурными мешами в UE4, и я понял, что нет простых туториалов по этой теме. Таких, чтобы на пару строк. А ведь простое решение есть. Поэтому решил написать туториал сам.

Как работать с ProceduralMeshComponent

Итак, начнем с простого C++ класса. Назовем его `AProcMesh` и отнаследуем от `AActor`:

#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ProceduralMeshComponent.h" #include "ProcMesh.generated.h" UCLASS() class PROCEDURALMESH_API AProcMesh : public AActor { GENERATED_BODY() TArray<FVector> Vertices; TArray<int32> Triangles; TArray<FVector2D> UVs; UPROPERTY() UProceduralMeshComponent* ProcMesh; void CreateMesh(); public: // Sets default values for this actor's properties AProcMesh(); protected: UPROPERTY(EditAnywhere) UMaterialInterface* Material; // Called when the game starts or when spawned virtual void BeginPlay() override;

`Vertices`, `Triangles` и `UV` – поля, в которых мы будем хранить данные процедурного меша. `ProcMesh` – это `ProceduralMeshComponent`. И `Material` – ссылка на материал, чтобы наложить на меш текстуру.

Реализация:

#include "ProcMesh.h" AProcMesh::AProcMesh() { ProcMesh = CreateDefaultSubobject<UProceduralMeshComponent>("ProcMesh"); RootComponent = ProcMesh; } void AProcMesh::CreateMesh() { Vertices.Add(FVector(-50, 0, 50)); Vertices.Add(FVector(-50, 0, -50)); Vertices.Add(FVector(50, 0, 50)); Vertices.Add(FVector(50, 0, -50)); UVs.Add(FVector2D(0, 0)); UVs.Add(FVector2D(0, 1)); UVs.Add(FVector2D(1, 0)); UVs.Add(FVector2D(1, 1)); //Triangle1 Triangles.Add(0); Triangles.Add(1); Triangles.Add(2); //Triangle2 Triangles.Add(2); Triangles.Add(1); Triangles.Add(3); ProcMesh->CreateMeshSection(0, Vertices, Triangles, TArray<FVector>(), UVs, TArray<FColor>(), TArray<FProcMeshTangent>(), true); if (Material) { ProcMesh->SetMaterial(0, Material); } } // Called when the game starts or when spawned void AProcMesh::BeginPlay() { Super::BeginPlay(); CreateMesh(); }

Запустим и получим вот такую плоскость:

Процедурная плоскость
Процедурная плоскость

А теперь немного деталей.

Меш состоит из faces (не знаю правильный технический перевод) и вершин. Массив `Vertices` в нашем классе как раз и хранит все вершины:

Вершины
Вершины

Faces хранятся в массиве `Triangles`:

Треугольники.
Треугольники.

И последнее - это UV-маппинг. Он нужен для того, чтобы правильно наложить текстуру:

UV-маппинг
UV-маппинг

Теперь мы можем спокойно использовать материалы:

Voila!

p.s. Это перевод моей же статьи из англоязычного блога, который я веду:

Заглядывайте на огонек!

2020
2 комментария

Face - это грань

1
Ответить

Точно! Спасибо 

1
Ответить