PLY 生成 StaticMesh

65 篇文章 10 订阅
21 篇文章 1 订阅
文章介绍了如何将PLY格式的3D模型文件解析并转换为UnrealEngine的StaticMesh资源。通过读取PLY文件的顶点和面信息,创建并初始化顶点数组、法线、纹理坐标等,然后构建三角面,最终实现模型的转换。
摘要由CSDN通过智能技术生成

PLY 生成 StaticMesh

PLY

PLY,多边形文件格式,表示存储描述为多边形集合的图形对象的 3D 文件格式。这种文件格式的目的是建立一种简单易用的文件类型,该文件类型足够通用,可用于各种模型。 PLY 文件格式有 ASCII 和二进制格式,用于紧凑存储和快速保存和加载。

PLY 格式的对象由一组顶点、面和其他元素以及可以附加到这些元素的颜色和法线方向等属性来描述。

由 PLY 格式表示的对象可以是各种来源的结果,例如手动数字化对象、建模应用程序中的多边形对象、范围数据、立方体中的三角形、地形数据和辐射模型。

ply
format ascii 1.0           { ascii/binary, format version number }
comment made by Greg Turk  { comments keyword specified, like all lines }
comment this file is a cube
element vertex 8           { define "vertex" element, 8 of them in file }
property float x           { vertex contains float "x" coordinate }
property float y           { y coordinate is also a vertex property }
property float z           { z coordinate, too }
element face 6             { there are 6 "face" elements in the file }
property list uchar int vertex_index { "vertex_indices" is a list of ints }
end_header                 { delimits the end of the header }
0 0 0                      { start of vertex list }
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3                  { start of face list }
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0

在这里插入图片描述

PLY2StaticMesh

	if (inMeshPath.Len() <= 3)
	{
		return;
	}
	FString FileName=FPaths::GetBaseFilename(inMeshPath);
	FString RawData;
	TArray<FString> DataLineArr;
	int32 EndHeaderIndex = 0;
	int32 VertexCount = 0;
	int32 TriangleCount = 0;

	TArray<uint8> FileData;
	bool isOk = FFileHelper::LoadFileToArray(FileData, *inMeshPath);
	if (!isOk)
	{
		return;
	}
	FFileHelper::BufferToString(RawData, FileData.GetData(), FileData.Num());
	RawData.ParseIntoArray(DataLineArr, TEXT("\n"));

	FVector3f newVertex;
	FIntVector newTriangle;
	TArray<uint8> LineData;
	int32 LineNum = 0;
	FString strData;

	if (DataLineArr.Num() < 15)
	{
		return;
	}

	for (size_t i = 0; i < DataLineArr.Num(); ++i)
	{
		if (DataLineArr[i].StartsWith(TEXT("element vertex")))
		{
			VertexCount = FCString::Atoi(*DataLineArr[i].RightChop(14));
		}
		else if (DataLineArr[i].StartsWith(TEXT("element face")))
		{
			TriangleCount = FCString::Atoi(*DataLineArr[i].RightChop(12));
		}
		else if (DataLineArr[i].StartsWith(TEXT("end_header")))
		{
			EndHeaderIndex = i + 1;
			break;
		}
	}


	TArray<FVector3f>Normals,Tangents;
	TArray<int32>Triangles;
	TArray<FVector2f>UV;
	TArray<FVector3f>Vertices;

	for (size_t i = EndHeaderIndex; i < EndHeaderIndex + VertexCount; i++)
	{
		TArray<FString> Items;
		DataLineArr[i].ParseIntoArray(Items, TEXT(" "));

		newVertex.X = FCString::Atod(*Items[0]) - WorldCenterLocation.X;
		newVertex.Y = FCString::Atod(*Items[1]) - WorldCenterLocation.Y;
		newVertex.Z = FCString::Atod(*Items[2]) - WorldCenterLocation.Z;

		newVertex *= FVector3f(100, -100, 100);

		Vertices.Add(newVertex);
		UV.Add(FVector2f::Zero());
		Normals.Add(FVector3f::UpVector);
		Tangents.Add(FVector3f::ForwardVector);
	}

	for (size_t i = EndHeaderIndex + VertexCount; i < EndHeaderIndex + VertexCount + TriangleCount; i++)
	{
		TArray<FString> Items;
		DataLineArr[i].ParseIntoArray(Items, TEXT(" "));

		newTriangle.X = FCString::Atoi(*Items[1]);
		newTriangle.Y = FCString::Atoi(*Items[2]);
		newTriangle.Z = FCString::Atoi(*Items[3]);

		Triangles.Add(newTriangle.X);
		Triangles.Add(newTriangle.Y);
		Triangles.Add(newTriangle.Z);
	}
	//to static mesh asset->见参考链接
	

在这里插入图片描述

参考

  1. OpenCTM Mesh 转换为UE4 静态资源Asset
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值