UE4实验观察FRawMesh的数据结构

目标

一个StaticMesh的顶点数据,可以从其FRawMesh中得到。

本篇的目标是:

  • 写工具可以输出StaticMesh中FRawMesh的数据信息
  • 总结其数据结构。

FRawMesh定义

/**
 * Raw mesh data used to construct optimized runtime rendering streams.
 *
 * A note on terminology. Information is stored at various frequencies as defined here:
 *     Face - A single polygon in the mesh. Currently all code assumes this is a triangle but
 *            conceptually any polygon would do.
 *     Corner - Each face has N corners. As all faces are currently triangles, N=3.
 *     Wedge - Properties stored for each corner of each face. Index with FaceIndex * NumCorners + CornerIndex.
 *     Vertex - Properties shared by overlapping wedges of adjacent polygons. Typically these properties
 *              relate to position. Index with VertexIndices[WedgeIndex].
 *
 * Additionally, to ease in backwards compatibility all properties should use only primitive types!
 */
struct FRawMesh
{
    
    
	/** Material index. Array[FaceId] = int32 */
	TArray<int32> FaceMaterialIndices;
	/** Smoothing mask. Array[FaceId] = uint32 */
	TArray<uint32> FaceSmoothingMasks;

	/** Position in local space. Array[VertexId] = float3(x,y,z) */
	TArray<FVector> VertexPositions;

	/** Index of the vertex at this wedge. Array[WedgeId] = VertexId */
	TArray<uint32> WedgeIndices;
	/** Tangent, U direction. Array[WedgeId] = float3(x,y,z) */
	TArray<FVector>	WedgeTangentX;
	/** Tangent, V direction. Array[WedgeId] = float3(x,y,z) */
	TArray<FVector>	WedgeTangentY;
	/** Normal. Array[WedgeId] = float3(x,y,z) */
	TArray<FVector>	WedgeTangentZ;
	/** Texture coordinates. Array[UVId][WedgeId]=float2(u,v) */
	TArray<FVector2D> WedgeTexCoords[MAX_MESH_TEXTURE_COORDS];
	/** Color. Array[WedgeId]=float3(r,g,b,a) */
	TArray<FColor> WedgeColors;

	/**
	 * Map from material index -> original material index at import time. It's
	 * valid for this to be empty in which case material index == original
	 * material index.
	 */
	TArray<int32> MaterialIndexToImportIndex;
	
	...

实验

待实验模型

我在Houdini中生成了一个测试模型(使用Houdini不是必须的,只是我这里觉得用它比较方便生成,并方便观察顶点与面序号)

顶点序号与面序号:
在这里插入图片描述
在这里插入图片描述

工具代码

做一个Actor,可以设定StaticMesh并打印信息:

RawMeshLogger.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"

#include"RawMeshLogger.generated.h"

UCLASS()
class ARawMeshLogger : public AActor
{
    
    
	GENERATED_UCLASS_BODY()

public:
	UPROPERTY(Category = "RawMeshLogger", EditAnywhere)
		UStaticMesh* StaticMesh;

	UFUNCTION(Category = "RawMeshLogger", CallInEditor)
		void LogRawMesh();
};

RawMeshLogger.cpp

#include "RawMeshLogger.h"

#include "Engine/StaticMesh.h"
#include "RawMesh.h"

DEFINE_LOG_CATEGORY_STATIC(LogLearnRawMesh, Log, All);

ARawMeshLogger::ARawMeshLogger(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
    
    
}

template<typename T>
void LogIntArray(TArray<T>& Arr, FString Name)
{
    
    
	UE_LOG(LogLearnRawMesh, Warning, TEXT("%s Num: %d"), *Name, Arr.Num());
	for (int i = 0; i < Arr.Num(); i++)
		UE_LOG(LogLearnRawMesh, Warning, TEXT("[%d]: %d"), i, Arr[i]);
}

template<typename T>
void LogVectorArray(TArray<T>& Arr, FString Name)
{
    
    
	UE_LOG(LogLearnRawMesh, Warning, TEXT("%s Num: %d"), *Name, Arr.Num());
	for (int i = 0; i < Arr.Num(); i++)
		UE_LOG(LogLearnRawMesh, Warning, TEXT("[%d]: %s"), i, *Arr[i].ToString());
}

void ARawMeshLogger::LogRawMesh()
{
    
    
	for (int LOD = 0; LOD < StaticMesh->SourceModels.Num(); LOD++)
	{
    
    
		UE_LOG(LogLearnRawMesh, Warning, TEXT("SourceModel LOD %d"),LOD);

		//获得此LOD的SourceModel
		FStaticMeshSourceModel& SourceModel = StaticMesh->SourceModels[LOD];

		//获得RawMesh
		FRawMesh RawMesh;
		SourceModel.RawMeshBulkData->LoadRawMesh(RawMesh);

		LogIntArray(RawMesh.FaceMaterialIndices, "FaceMaterialIndices");
		LogIntArray(RawMesh.FaceSmoothingMasks, "FaceSmoothingMasks");
		LogVectorArray(RawMesh.VertexPositions, "VertexPositions");
		LogIntArray(RawMesh.WedgeIndices, "WedgeIndices");
		LogVectorArray(RawMesh.WedgeTangentX, "WedgeTangentX");
		LogVectorArray(RawMesh.WedgeTangentY, "WedgeTangentY");
		LogVectorArray(RawMesh.WedgeTangentZ, "WedgeTangentZ");
		for (int uv = 0; uv < MAX_MESH_TEXTURE_COORDS; uv++)
		{
    
    
			UE_LOG(LogLearnRawMesh, Warning, TEXT("UVIndex %d"), uv);
			LogVectorArray(RawMesh.WedgeTexCoords[uv], "WedgeTexCoords");
		}
		LogVectorArray(RawMesh.WedgeColors, "WedgeColors");
		LogIntArray(RawMesh.MaterialIndexToImportIndex, "MaterialIndexToImportIndex");
	}
}

输出信息

使用:
在这里插入图片描述
输出:

LogLearnRawMesh: Warning: SourceModel LOD 0
LogLearnRawMesh: Warning: FaceMaterialIndices Num: 12
LogLearnRawMesh: Warning: [0]: 0
LogLearnRawMesh: Warning: [1]: 0
LogLearnRawMesh: Warning: [2]: 0
LogLearnRawMesh: Warning: [3]: 0
LogLearnRawMesh: Warning: [4]: 0
LogLearnRawMesh: Warning: [5]: 0
LogLearnRawMesh: Warning: [6]: 0
LogLearnRawMesh: Warning: [7]: 0
LogLearnRawMesh: Warning: [8]: 0
LogLearnRawMesh: Warning: [9]: 0
LogLearnRawMesh: Warning: [10]: 0
LogLearnRawMesh: Warning: [11]: 0
LogLearnRawMesh: Warning: FaceSmoothingMasks Num: 12
LogLearnRawMesh: Warning: [0]: 1
LogLearnRawMesh: Warning: [1]: 1
LogLearnRawMesh: Warning: [2]: 1
LogLearnRawMesh: Warning: [3]: 1
LogLearnRawMesh: Warning: [4]: 1
LogLearnRawMesh: Warning: [5]: 2
LogLearnRawMesh: Warning: [6]: 4
LogLearnRawMesh: Warning: [7]: 2
LogLearnRawMesh: Warning: [8]: 4
LogLearnRawMesh: Warning: [9]: 4
LogLearnRawMesh: Warning: [10]: 2
LogLearnRawMesh: Warning: [11]: 2
LogLearnRawMesh: Warning: VertexPositions Num: 8
LogLearnRawMesh: Warning: [0]: X=-50.000 Y=-50.000 Z=-50.000
LogLearnRawMesh: Warning: [1]: X=50.000 Y=-50.000 Z=-50.000
LogLearnRawMesh: Warning: [2]: X=50.000 Y=50.000 Z=-50.000
LogLearnRawMesh: Warning: [3]: X=-50.000 Y=50.000 Z=-50.000
LogLearnRawMesh: Warning: [4]: X=-50.000 Y=-50.000 Z=50.000
LogLearnRawMesh: Warning: [5]: X=50.000 Y=-50.000 Z=50.000
LogLearnRawMesh: Warning: [6]: X=50.000 Y=50.000 Z=50.000
LogLearnRawMesh: Warning: [7]: X=-50.000 Y=50.000 Z=50.000
LogLearnRawMesh: Warning: WedgeIndices Num: 36
LogLearnRawMesh: Warning: [0]: 4
LogLearnRawMesh: Warning: [1]: 5
LogLearnRawMesh: Warning: [2]: 1
LogLearnRawMesh: Warning: [3]: 5
LogLearnRawMesh: Warning: [4]: 6
LogLearnRawMesh: Warning: [5]: 2
LogLearnRawMesh: Warning: [6]: 6
LogLearnRawMesh: Warning: [7]: 7
LogLearnRawMesh: Warning: [8]: 3
LogLearnRawMesh: Warning: [9]: 7
LogLearnRawMesh: Warning: [10]: 4
LogLearnRawMesh: Warning: [11]: 0
LogLearnRawMesh: Warning: [12]: 0
LogLearnRawMesh: Warning: [13]: 1
LogLearnRawMesh: Warning: [14]: 2
LogLearnRawMesh: Warning: [15]: 7
LogLearnRawMesh: Warning: [16]: 6
LogLearnRawMesh: Warning: [17]: 5
LogLearnRawMesh: Warning: [18]: 5
LogLearnRawMesh: Warning: [19]: 4
LogLearnRawMesh: Warning: [20]: 7
LogLearnRawMesh: Warning: [21]: 2
LogLearnRawMesh: Warning: [22]: 3
LogLearnRawMesh: Warning: [23]: 0
LogLearnRawMesh: Warning: [24]: 0
LogLearnRawMesh: Warning: [25]: 3
LogLearnRawMesh: Warning: [26]: 7
LogLearnRawMesh: Warning: [27]: 3
LogLearnRawMesh: Warning: [28]: 2
LogLearnRawMesh: Warning: [29]: 6
LogLearnRawMesh: Warning: [30]: 2
LogLearnRawMesh: Warning: [31]: 1
LogLearnRawMesh: Warning: [32]: 5
LogLearnRawMesh: Warning: [33]: 1
LogLearnRawMesh: Warning: [34]: 0
LogLearnRawMesh: Warning: [35]: 4
LogLearnRawMesh: Warning: WedgeTangentX Num: 36
LogLearnRawMesh: Warning: [0]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [1]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [2]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [3]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [4]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [5]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [6]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [7]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [8]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [9]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [10]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [11]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [12]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [13]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [14]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [15]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [16]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [17]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [18]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [19]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [20]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [21]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [22]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [23]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [24]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [25]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [26]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [27]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [28]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [29]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [30]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [31]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [32]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [33]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [34]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [35]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: WedgeTangentY Num: 36
LogLearnRawMesh: Warning: [0]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [1]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [2]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [3]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [4]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [5]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [6]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [7]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [8]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [9]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [10]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [11]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [12]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [13]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [14]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [15]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [16]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [17]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [18]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [19]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [20]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [21]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [22]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [23]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [24]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [25]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [26]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [27]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [28]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [29]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [30]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [31]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [32]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [33]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [34]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [35]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: WedgeTangentZ Num: 36
LogLearnRawMesh: Warning: [0]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [1]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [2]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [3]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [4]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [5]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [6]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [7]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [8]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [9]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [10]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [11]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [12]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [13]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [14]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [15]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [16]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [17]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [18]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [19]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [20]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [21]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [22]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [23]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [24]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [25]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [26]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [27]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [28]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [29]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [30]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [31]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [32]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [33]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [34]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: [35]: X=0.000 Y=0.000 Z=0.000
LogLearnRawMesh: Warning: UVIndex 0
LogLearnRawMesh: Warning: WedgeTexCoords Num: 36
LogLearnRawMesh: Warning: [0]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [1]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [2]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [3]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [4]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [5]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [6]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [7]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [8]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [9]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [10]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [11]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [12]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [13]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [14]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [15]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [16]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [17]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [18]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [19]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [20]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [21]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [22]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [23]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [24]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [25]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [26]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [27]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [28]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [29]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [30]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [31]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [32]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [33]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [34]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: [35]: X=0.000 Y=0.000
LogLearnRawMesh: Warning: UVIndex 1
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 2
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 3
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 4
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 5
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 6
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: UVIndex 7
LogLearnRawMesh: Warning: WedgeTexCoords Num: 0
LogLearnRawMesh: Warning: WedgeColors Num: 0
LogLearnRawMesh: Warning: MaterialIndexToImportIndex Num: 0

FRawMesh的数据结构

FRawMesh中有多个数组,数组的长度是一个重要的信息,从数组长度可以看出数据与什么样的信息对应。

FaceId
 *     Face - A single polygon in the mesh. Currently all code assumes this is a triangle but
 *            conceptually any polygon would do.

Face:mesh中一个单独的多边形。当前的代码假定它是一个三角形,但是概念上它应当表示任意边数的多边形。

例如,当前的正方体,有6个四边面,即12个三角面。因此Face的数目是12

FaceId:第几个面。

面所对应的材质

FaceMaterialIndices存储此此信息。即:
第 F a c e I d 个 面 的 材 质 的 索 引 号 = F a c e M a t e r i a l I n d i c e s [ F a c e I d ] 第FaceId个面的材质的索引号=FaceMaterialIndices[FaceId] FaceId=FaceMaterialIndices[FaceId]

CornerId
 *     Corner - Each face has N corners. As all faces are currently triangles, N=3.

Corner:角。每一个面有N个角,当前所有面都是三角形,所以 N C o r n e r = 3 N_{Corner}=3 NCorner=3

CornerId:第几个角,由于都是三角形,所以CornerId取值0~2

WedgeId
 *     Wedge - Properties stored for each corner of each face.

Wedge:代表每一个面的每一个角。
例如,当前Face的数目是12而都是三角形,因此 Wedge的数目是36

WedgeId:一个序号,对应了所有面的所有角:
第 F a c e I d 个 面 的 第 C o r n e r I d 个 角 所 对 应 的 W e d g e I d = F a c e I d × N C o r n e r + C o r n e r I d 第FaceId个面的第CornerId个角所对应的WedgeId=FaceId\times N_{Corner}+CornerId FaceIdCornerIdWedgeId=FaceId×NCorner+CornerId

Wedge所对应的切线,UV,顶点色

他们存于下面的数据中:

/** Tangent, U direction. Array[WedgeId] = float3(x,y,z) */
TArray<FVector>	WedgeTangentX;
/** Tangent, V direction. Array[WedgeId] = float3(x,y,z) */
TArray<FVector>	WedgeTangentY;
/** Normal. Array[WedgeId] = float3(x,y,z) */
TArray<FVector>	WedgeTangentZ;
/** Texture coordinates. Array[UVId][WedgeId]=float2(u,v) */
TArray<FVector2D> WedgeTexCoords[MAX_MESH_TEXTURE_COORDS];
/** Color. Array[WedgeId]=float3(r,g,b,a) */
TArray<FColor> WedgeColors;
VertexId
 *     Vertex - Properties shared by overlapping wedges of adjacent polygons. Typically these properties
 *              relate to position.

Vertex:对应了在邻接的多边形所重叠的wedge的顶点信息,其中代表性的是“位置”。

例如,当前的正方体有8个顶点,因此Vertex的数目是8

VertexId:第几个顶点。

顶点对应的位置

第 V e r t e x I d 个 顶 点 的 位 置 = V e r t e x P o s i t i o n s [ V e r t e x I d ] 第VertexId个顶点的位置=VertexPositions[VertexId] VertexId=VertexPositions[VertexId]

Wedge对应的位置

由于:
第 W e d g e I d 个 W e d g e 所 对 应 顶 点 的 V e r t e x I d = W e d g e I n d i c e s [ W e d g e I d ] 第WedgeId个Wedge所对应顶点的VertexId = WedgeIndices[WedgeId] WedgeIdWedgeVertexId=WedgeIndices[WedgeId]

因此:
第 W e d g e I d 个 W e d g e 所 对 应 的 位 置 = V e r t e x P o s i t i o n s [ W e d g e I n d i c e s [ W e d g e I d ] ] 第WedgeId个Wedge所对应的位置 = VertexPositions[WedgeIndices[WedgeId]] WedgeIdWedge=VertexPositions[WedgeIndices[WedgeId]]