ue procedural mesh怎么通过顶点数组求 切线数组
时间: 2023-11-14 12:05:05 浏览: 95
毕设Demo:基于UE 4.21,通过顶点与面索引Data Table,
在UE中,可以通过FVector类型的顶点数组和FVector类型的法线数组来计算切线数组。具体的计算方法如下:
```c++
// 计算切线数组
void CalculateTangents(TArray<FVector>& Vertices, TArray<int32>& Triangles, TArray<FVector>& Normals, TArray<FVector2D>& UVs, TArray<FVector>& Tangents)
{
for (int32 i = 0; i < Triangles.Num(); i += 3)
{
// 获取三角形的顶点、法线和UV
FVector& V0 = Vertices[Triangles[i]];
FVector& V1 = Vertices[Triangles[i + 1]];
FVector& V2 = Vertices[Triangles[i + 2]];
FVector& N0 = Normals[Triangles[i]];
FVector& N1 = Normals[Triangles[i + 1]];
FVector& N2 = Normals[Triangles[i + 2]];
FVector2D& UV0 = UVs[Triangles[i]];
FVector2D& UV1 = UVs[Triangles[i + 1]];
FVector2D& UV2 = UVs[Triangles[i + 2]];
// 计算三角形的切线和副切线
FVector Edge1 = V1 - V0;
FVector Edge2 = V2 - V0;
FVector DeltaUV1 = UV1 - UV0;
FVector DeltaUV2 = UV2 - UV0;
float F = 1.0f / (DeltaUV1.X * DeltaUV2.Y - DeltaUV2.X * DeltaUV1.Y);
FVector Tangent = FVector(
F * (DeltaUV2.Y * Edge1.X - DeltaUV1.Y * Edge2.X),
F * (DeltaUV2.Y * Edge1.Y - DeltaUV1.Y * Edge2.Y),
F * (DeltaUV2.Y * Edge1.Z - DeltaUV1.Y * Edge2.Z)
).GetSafeNormal();
FVector Binormal = FVector(
F * (-DeltaUV2.X * Edge1.X + DeltaUV1.X * Edge2.X),
F * (-DeltaUV2.X * Edge1.Y + DeltaUV1.X * Edge2.Y),
F * (-DeltaUV2.X * Edge1.Z + DeltaUV1.X * Edge2.Z)
).GetSafeNormal();
// 计算三角形的顶点切线
Tangents[Triangles[i]] = Tangent;
Tangents[Triangles[i + 1]] = Tangent;
Tangents[Triangles[i + 2]] = Tangent;
}
}
```
在上面的代码中,我们定义了CalculateTangents函数,该函数接受顶点数组、三角形数组、法线数组、UV数组和切线数组作为参数,通过遍历三角形数组,计算每个三角形的切线和副切线,然后将计算出的顶点切线赋值给切线数组。
需要注意的是,计算切线时需要使用UV坐标,如果没有UV坐标,可以使用其他映射坐标来计算切线。此外,计算出的切线向量需要进行归一化处理。
阅读全文