ue4网格转地形_ue4读取灰度图生成三维地形mesh

该博客介绍了如何在Unreal Engine中利用灰度图像生成3D地形。通过读取图像像素信息,计算每个点的高度值,并创建对应的顶点、法线、纹理坐标等,最终构建出地形的网格模型。文章详细展示了`ATerrainCreateActor`类的实现过程,包括`BeginPlay`和`Tick`函数,以及如何设置材质和进行异步烹饪。
摘要由CSDN通过智能技术生成

#pragma once

#include "CoreMinimal.h"

#include "GameFramework/Actor.h"

#include "ProceduralMeshComponent.h"

#include "TerrainCreateActor.generated.h"

UCLASS()

class UETERRAIN_API ATerrainCreateActor : public AActor

{

GENERATED_BODY()

public:

ATerrainCreateActor();

private:

UPROPERTY(VisibleAnywhere)

UProceduralMeshComponent * mesh;//自定义mesh

UPROPERTY(EditAnywhere)

UTexture2D * grayTexture;//传入灰度图

UPROPERTY(EditAnywhere)

float zScale;//z值系数

UPROPERTY(EditAnywhere)

UMaterial* meshMat;//材质

protected:

virtual void BeginPlay() override;

public:

virtual void Tick(float DeltaTime) override;

};

源文件

#include "TerrainCreateActor.h"

ATerrainCreateActor::ATerrainCreateActor()

{

PrimaryActorTick.bCanEverTick = true;

mesh = CreateDefaultSubobject(TEXT("terrainMesh"));

RootComponent = mesh;

mesh->bUseAsyncCooking = true;

}

void ATerrainCreateActor::BeginPlay()

{

Super::BeginPlay();

//读取灰度图像素信息

FTexture2DMipMap* MyMipMap = &grayTexture->PlatformData->Mips[0];

FByteBulkData* RawImageData = &MyMipMap->BulkData;

FColor* FormatedImageData = static_cast(RawImageData->Lock(LOCK_READ_ONLY));

uint32 TextureWidth = MyMipMap->SizeX, TextureHeight = MyMipMap->SizeY;

//mesh基础信息

TArray vertices;

TArray Triangles;

TArray normals;

TArray UV0;

TArray tangents;

TArray vertexColors;

for (size_t i = 0; i < TextureWidth; i++)

{

for (size_t j = 0; j < TextureHeight; j++)

{

//根据颜色设定顶点z值

FColor PixelColor = FormatedImageData[j * TextureWidth + i];

float tempZ = (PixelColor .B* 299 + PixelColor .G* 587 + PixelColor.R * 114 + 500) / 1000;//rgb转灰度

tempZ *= zScale;

vertices.Add(FVector(i*5, j*5, tempZ)); //顶点

normals.Add(FVector(0, 0, 1));//法线

UV0.Add(FVector2D((float)i/(float)TextureWidth, (float)j/(float)TextureHeight));//uv

//UV0.Add(FVector2D(i,j));//uv

tangents.Add(FProcMeshTangent(1, 0, 0));//切线

vertexColors.Add(FLinearColor(0.75, 0.75, 0.75, 1.0)); //顶点颜色

if (j < TextureHeight - 1 && i < TextureWidth - 1)

{

//三角索引 此处按照vertice的添加顺序确定索引

Triangles.Add(i*TextureHeight + j);

Triangles.Add(i*TextureHeight + j + 1);

Triangles.Add(i*TextureHeight + j + TextureHeight);

Triangles.Add(i*TextureHeight + j + TextureHeight);

Triangles.Add(i*TextureHeight + j + 1);

Triangles.Add(i*TextureHeight + j + TextureHeight + 1);

}

}

}

RawImageData->Unlock();

//创建mesh

mesh->CreateMeshSection_LinearColor(0, vertices, Triangles, normals, UV0, vertexColors, tangents, true);

mesh->ContainsPhysicsTriMeshData(true);

mesh->SetMaterial(0, meshMat);

}

void ATerrainCreateActor::Tick(float DeltaTime)

{

Super::Tick(DeltaTime);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值