- TR3DTangentSpaceVertex = record
- Position,
- Normal,
- Tangent,
- Binormal : TVector;
- Texcoord : TTexcoord;
- end;
- procedure TangentSpaceCalculate(var V1, V2, V3 : TR3DTangentSpaceVertex);
- var
- V1_,
- T1_,
- V2_,
- T2_ : TVector;
- DDX,
- DDY,
- DDZ : TVector;
- dudx,
- dvdx,
- dudy,
- dvdy,
- dudz,
- dvdz : Single;
- Tangent,
- Binormal : TVector;
- begin
- V1_.X := V1.Position.X - V2.Position.X;
- V1_.Y := V1.Position.Y - V2.Position.Y;
- V1_.Z := V1.Position.Z - V2.Position.Z;
- T1_.X := V1.Texcoord.U - V2.Texcoord.U;
- T1_.Y := V1.Texcoord.V - V2.Texcoord.V;
- T1_.Z := 0;
- V2_.X := V3.Position.X - V1.Position.X;
- V2_.Y := V3.Position.Y - V1.Position.Y;
- V2_.Z := V3.Position.Z - V1.Position.Z;
- T2_.X := V3.Texcoord.U - V1.Texcoord.U;
- T2_.Y := V3.Texcoord.V - V1.Texcoord.V;
- T2_.Z := 0;
- DDX := VectorCrossProduct(Vector(V1_.X, T1_.X, T1_.Y), Vector(V2_.X, T2_.X, T2_.Y));
- DDY := VectorCrossProduct(Vector(V1_.Y, T1_.X, T1_.Y), Vector(V2_.Y, T2_.X, T2_.Y));
- DDZ := VectorCrossProduct(Vector(V1_.Z, T1_.X, T1_.Y), Vector(V2_.Z, T2_.X, T2_.Y));
- dudx := - ddx.y/ddx.x;
- dvdx := - ddx.z/ddx.x;
- dudy := - ddy.y/ddy.x;
- dvdy := - ddy.z/ddy.x;
- dudz := - ddz.y/ddz.x;
- dvdz := - ddz.z/ddz.x;
- Tangent.Setup(dudx, dudy, dudz); Tangent.Normalize;
- Binormal.Setup(dvdx, dvdy, dvdz); Binormal.Normalize;
- V1.Tangent.Add(Tangent);
- V2.Tangent.Add(Tangent);
- V3.Tangent.Add(Tangent);
- V1.Binormal.Add(Binormal);
- V2.Binormal.Add(Binormal);
- V3.Binormal.Add(Binormal);
- end;