[UE4]UProceduralMeshComponent

官方链接如下:https://docs.unrealengine.com/en-US/API/Plugins/ProceduralMeshComponent/UProceduralMeshComponent/index.html

官方配置链接如下:https://wiki.unrealengine.com/Procedural_Mesh_Component_in_C++:Getting_Started

这里只是简单介绍一下

中文解释:程序网格

特点:可任意变形(当然变形之后的有关参数需要update)

创建:CreateMeshSection或者CreateMeshSection_LinearColor();(推荐后者)

CreateMeshSection_LinearColor
(
    int32 SectionIndex,//编号默认为0
    const TArray< FVector >& Vertices,//所有网格顶点的坐标最好按照顺序排列
    const TArray< int32 >& Triangles,//组成三角面的顶点顺序,最好顺时针,与前一个参数关联很大
    const TArray< FVector >& Normals,//每个顶点的法线,与第二个参数顺序一致,数组大小一致(可以不填)
    const TArray< FVector2D >& UV0,//顶点的UV坐标,与第二个参数顺序一致,数组大小一样(可以不填)
    const TArray< FLinearColor >& Vert...,//不做讲解,可以不写,直接填一个空的数组
    const TArray< FProcMeshTangent >& ...,//不做讲解,可以不写,直接填一个空的数组
    bool bCreateCollision//是否具有碰撞
)

创建时,需要的最少的参数为四个SectionIndex、 Vertices、Triangles、bCreateCollision,其余都可以填写空的数组,接下来稍微分析一下几个参数

1.编号:略

2.网格顶点顺序

   需要事先将每个顶点XYZ的坐标,按照一定的顺序排列好,这个顺序直接影响后面几个参数的顺序

3.三角面的顺序

   学过OpenGL的同学应该对这部分比较熟悉,任何面都可以由很多的三角面组成,三角面的顶点名称相当于网格顶点数组的下标,一般从0开始,三角面是一个一维数组,每三个为一个面,数组的长度必定是三的倍数。函数会按照三个一组的策略,把每个顶点的名称填入网格顶点坐标数组,然后利用实际的坐标生成三角面。这样一点一点填满整个面。

4.顶点法线

    这部分可以不填,但会影响光照。当你必须要计算反光效果时候,这些参数必须计算。顶点的法线一般可以理解为:在该点所在的三角面上由该点与另外的两个点组成的两个向量的叉乘(一般向量方向由右手法则来确定),叉乘结果再归一化。

   在这里又会有一个问题:每个顶点所在的三角面不止一个,而且数量不固定,那么当一个顶点有多个面的时候,就需要计算多个面的法线然后再相加,最后归一化,这个的计算量非常大。这里给出一种比较简单的解决办法。

    1)先创建一个法线数组,数组的大小等于网格顶点坐标的数量

    2)对三角面进行循环,计算每个三角面的顶点的法线,计算完成后,按照每个顶点的名称加入数组(加入:加减乘除的加)(数组的下标就是顶点的名称)

   3)计算完成后对每个法线进行归一化

5.UV坐标

    如果你的网格不需要贴图,这步可以忽略。UV都是0-1,具体的就是用一去除以行数和列数得到每个坐标的距离,然后自己稍微写个循环乘一下就好

先写到这里,等有时间再多些几个公式,最后附上一部分官方的数据

UE4 中设置 Procedural Mesh 的颜色,同样可以使用 Material。但是在 UE4 中,我们一般使用 Material Instance(材质实例)来设置 Procedural Mesh 的颜色,这样可以方便地在游戏中动态地修改颜色。 下面是一个使用 Material Instance 设置 Procedural Mesh 颜色的示例: 1. 创建一个 Material,设置其颜色为红色。 2. 创建一个 Material Instance,并将其 Parent(父级)设置为上一步创建的 Material。 3. 在 Material Instance 中修改颜色为你想要的颜色。 4. 在代码中获取 Material Instance,并将其赋值给 Procedural MeshMeshComponent。 下面是示例代码: ```c++ // 获取 Material Instance UMaterialInstance* MaterialInstance = LoadObject<UMaterialInstance>(nullptr, TEXT("MaterialInstance'/Game/Materials/RedMaterialInstance.RedMaterialInstance'")); // 获取 Procedural MeshMeshComponent UProceduralMeshComponent* ProceduralMeshComponent = GetProceduralMeshComponent(); // 将 Material Instance 赋值给 MeshComponent ProceduralMeshComponent->SetMaterial(0, MaterialInstance); ``` 在这个示例中,我们首先通过 LoadObject 函数获取了一个 Material Instance,然后获取了 Procedural MeshMeshComponent,并将 Material Instance 赋值给了 MeshComponent。 需要注意的是,在 UE4 中,Procedural Mesh 的 Material Index 默认是 0,因此我们使用 SetMaterial 函数将 Material Instance 赋值给了 Index 为 0 的 Material。如果你的 Procedural Mesh 中有多个 Material,则需要指定不同的 Material Index。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值