UE4 绘制简单三角形(五)
使用FRawMesh
绘制两个三角形面片,并赋予不同的材质,生成本地资源StaticMesh
。
//设定模型名字
FString MeshName = "TestRawMesh";
//设定包的路径
FString PackageName = "/Game/" + MeshName;
//创建包
UPackage* MeshPackage = CreatePackage(nullptr, *PackageName);
//创建StaticMesh资源
UStaticMesh* StaticMesh = NewObject< UStaticMesh >(MeshPackage, FName(*MeshName), RF_Public | RF_Standalone);
//测试RawMesh
FRawMesh RawMesh;
//顶点位置数据,一个直角三角形
RawMesh.VertexPositions.Add(FVector(0, 0, 0));
RawMesh.VertexPositions.Add(FVector(100, 0, 0));
RawMesh.VertexPositions.Add(FVector(100, 100, 0));
RawMesh.VertexPositions.Add(FVector(0, 100, 0));
//索引数据
RawMesh.WedgeIndices.Add(0);
RawMesh.WedgeIndices.Add(2);
RawMesh.WedgeIndices.Add(1);
RawMesh.WedgeIndices.Add(0);
RawMesh.WedgeIndices.Add(3);
RawMesh.WedgeIndices.Add(2);
//接下来的数据并不重要,只是需要满足Array的长度以能通过 FRawMesh::IsValid()
RawMesh.WedgeTexCoords[0].Add(FVector2D(0, 0));
RawMesh.WedgeTexCoords[0].Add(FVector2D(1, 0));
RawMesh.WedgeTexCoords[0].Add(FVector2D(0, 1));
RawMesh.WedgeTexCoords[0].Add(FVector2D(0, 0));
RawMesh.WedgeTexCoords[0].Add(FVector2D(1, 1));
RawMesh.WedgeTexCoords[0].Add(FVector2D(1, 0));
//每一个face对应一个材质slot
RawMesh.FaceMaterialIndices.Add(0);
RawMesh.FaceMaterialIndices.Add(1);
RawMesh.FaceSmoothingMasks.Add(0);
RawMesh.FaceSmoothingMasks.Add(1);
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentX.Add(FVector(1, 0, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentY.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentZ.Add(FVector(0, 0, 1));
RawMesh.WedgeTangentZ.Add(FVector(0, 0, 1));
RawMesh.WedgeTangentZ.Add(FVector(0, 0, 1));
RawMesh.WedgeTangentZ.Add(FVector(0, 0, 1));
RawMesh.WedgeTangentZ.Add(FVector(0, 1, 0));
RawMesh.WedgeTangentZ.Add(FVector(0, 1, 0));
if (!RawMesh.IsValid())
return;
//创建StaticMeshSourceModel
StaticMesh->PreEditChange(nullptr);
FStaticMeshSourceModel& SrcModel = StaticMesh->AddSourceModel();
SrcModel.SaveRawMesh(RawMesh);
//对StaticMesh进行Build
TArray< FText > BuildErrors;
StaticMesh->Build(true, &BuildErrors);
//随后通知Asset创建
FAssetRegistryModule::AssetCreated(StaticMesh);