ue4读取灰度图生成三维地形mesh

摘要:
转移自:https://www.cnblogs.com/gucheng/p/10116857.html创建新的uec++项目。在Build Cs中添加“ProceduralMeshComponent”模块。在子项目中添加“ProceduralMeshComponent”模块。创建材质,将灰度贴图导入灰度贴图资源,创建从Actor继承的ATerrainCreateActor类,并创建蓝图类对

转自:https://www.cnblogs.com/gucheng/p/10116857.html

新建ue c++工程。
在Build.cs中添加"ProceduralMeshComponent"模块。
ue4读取灰度图生成三维地形mesh第1张
在 uproject中添加"ProceduralMeshComponent"模块。
ue4读取灰度图生成三维地形mesh第2张
创建材质,传入grass贴图
ue4读取灰度图生成三维地形mesh第3张
导入灰度图资源
ue4读取灰度图生成三维地形mesh第4张
创建继承自Actor的类 ATerrainCreateActor,并创建蓝图类对象
将蓝图对象拖入场景,设置其灰度贴图参数、Z值缩放比例参数、材质参数
ue4读取灰度图生成三维地形mesh第5张
最终效果
ue4读取灰度图生成三维地形mesh第6张
ue4读取灰度图生成三维地形mesh第7张
ATerrainCreateActor类代码如下
 
头文件
#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<UProceduralMeshComponent>(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<FColor*>(RawImageData->Lock(LOCK_READ_ONLY));
    uint32 TextureWidth = MyMipMap->SizeX, TextureHeight = MyMipMap->SizeY;
    //mesh基础信息
    TArray<FVector> vertices;
    TArray<int32> Triangles;
    TArray<FVector> normals;
    TArray<FVector2D> UV0;
    TArray<FProcMeshTangent> tangents;
    TArray<FLinearColor> 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);
}

免责声明:文章转载自《ue4读取灰度图生成三维地形mesh》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vmware 下找不到ifcfg-eth0的问题CImagelist 基本用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UE4 Subsystems

  《InsideUE4》GamePlay架构(十一)Subsystems - 知乎 (zhihu.com) 引言 非常惭愧,自从我更新完GamePlay架构十篇之后,我就断更了许久。如今说再多缘由也是借口,借着假期,在家继续重操旧业,继续写写技术文章。 UE在4.22版本的时候,开始引入Subsystems,然后在4.24完善。写本篇文章的一个原因是S...

c语言实现灰度图转换为二值图

将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置为255,为得到更好的效果不同图片应采用不同的值 1 /* 2 2015年6月2日11:16:22 3 灰度图转换为二值图 4 blog:http://www.cnblogs.com/wd1001/ 5 */ 6 #include<stdio.h>...

UE4/Unity绘制地图基础元素-面和体

前言 绘制地图基础元素-线(上篇) 绘制地图基础元素-线(下篇) 搞定地图画线之后,接下来就是绘制面和体了: 面作为地图渲染的基本元素之一,在地图中可以代表各种形式的区域,例如海面、绿地等。面数据通常以离散点串形式存储,因此渲染时最关注的是如何将其展现为闭合的图形。 体可以理解为带有高度的面,在地图中代表各种建筑,通常是由其顶部面数据和高度数据处理得到。...

matlab画3维meshgrid/plot3/mesh/surf的用法

MATLAB三维绘图基础meshgrid函数的用法解析:见参考网址1   介绍3类(plot3/mesh/surf)7种三维图像绘制的方法。见参考网址2 plot3 三维曲线图; mesh 三维网格图; meshc 除了生成网格图外,还在xy平面生成曲面的等高线; meshz 除了生成网格图外,还在曲线下面加上个矩形垂帘; surf 三维着色曲面图; su...

UE4 VR 模式下全屏解决办法

方法步骤: 1、打开关卡蓝图添加如下代码: 2、设置配置文件在工程目录里面找到 Config 文件夹在里面添加一个配置文件并命名为 DefaultGameUserSettings.ini 把如下内容贴到刚刚创建的配置文件里面: [/Script/Engine.GameUserSettings]bUseVSync=False//ResolutionSize...

UE4渲染笔记

Lightmass 实时渲染光影效果对性能有很大影响,可利用lightmass预先生成光影贴图,然后在游戏中使用。将场景光照结果完全烘焙到模型贴图上,从而完完全全的假冒现实光照效果。文档上是 lightmass global illumination,可见生成的是全局光照贴图。 光源的移动性 静态照明仅使用光照贴图,阴影在游戏前烘焙。 固定光源的直接光照...