目标
一个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 第FaceId个面的第CornerId个角所对应的WedgeId=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] 第WedgeId个Wedge所对应顶点的VertexId=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]] 第WedgeId个Wedge所对应的位置=VertexPositions[WedgeIndices[WedgeId]]