void CalculateTangentBinormal(TempVertexType vertex1, TempVertexType vertex2, TempVertexType vertex3, ref VectorType tangent, ref VectorType binormal) { var vector1 = new Vector3 { X = vertex2.X - vertex1.X, Y = vertex2.Y - vertex1.Y, Z = vertex2.Z - vertex1.Z }; var vector2 = new Vector3 { X = vertex3.X - vertex1.X, Y = vertex3.Y - vertex1.Y, Z = vertex3.Z - vertex1.Z }; var tuVector = new Vector2 { X = vertex2.Tu - vertex1.Tu, Y = vertex3.Tu - vertex1.Tu }; var tvVector = new Vector2 { X = vertex2.Tv - vertex1.Tv, Y = vertex3.Tv - vertex1.Tv }; var denominator = 1.0f / (tuVector.X * tvVector.Y - tuVector.Y * tvVector.X); tangent.X = (tvVector.Y * vector1.X - tvVector.X * vector2.X) * denominator; tangent.Y = (tvVector.Y * vector1.Y - tvVector.X * vector2.Y) * denominator; tangent.Z = (tvVector.Y * vector1.Z - tvVector.X * vector2.Z) * denominator; binormal.X = (tuVector.X * vector2.X - tuVector.Y * vector1.X) * denominator; binormal.Y = (tuVector.X * vector2.Y - tuVector.Y * vector1.Y) * denominator; binormal.Z = (tuVector.X * vector2.Z - tuVector.Y * vector1.Z) * denominator; var tangentLength = new Vector3(tangent.X, tangent.Y, tangent.Z).Length(); tangent.X /= tangentLength; tangent.Y /= tangentLength; tangent.Z /= tangentLength; var binormalLength = new Vector3(binormal.X, binormal.Y, binormal.Z).Length(); binormal.X /= binormalLength; binormal.Y /= binormalLength; binormal.Z /= binormalLength; }
void CalculateModelVectors() { var faceCount = vertexCount / 3; for (int i = 0, index = 0; i < faceCount; i++) { var tangent = new VectorType(); var binormal = new VectorType(); var normal = new VectorType(); var vertex1 = new TempVertexType { X = model[index].X, Y = model[index].Y, Z = model[index].Z, Tu = model[index].Tu, Tv = model[index].Tv, Nx = model[index].Nx, Ny = model[index].Ny, Nz = model[index].Nz }; index++; var vertex2 = new TempVertexType { X = model[index].X, Y = model[index].Y, Z = model[index].Z, Tu = model[index].Tu, Tv = model[index].Tv, Nx = model[index].Nx, Ny = model[index].Ny, Nz = model[index].Nz }; index++; var vertex3 = new TempVertexType { X = model[index].X, Y = model[index].Y, Z = model[index].Z, Tu = model[index].Tu, Tv = model[index].Tv, Nx = model[index].Nx, Ny = model[index].Ny, Nz = model[index].Nz }; index++; CalculateTangentBinormal(vertex1, vertex2, vertex3, ref tangent, ref binormal); CalculateNormal(tangent, binormal, ref normal); model[index - 1].Nx = normal.X; model[index - 1].Ny = normal.Y; model[index - 1].Nz = normal.Z; model[index - 1].Tx = tangent.X; model[index - 1].Ty = tangent.Y; model[index - 1].Tz = tangent.Z; model[index - 1].Bx = binormal.X; model[index - 1].By = binormal.Y; model[index - 1].Bz = binormal.Z; model[index - 2].Nx = normal.X; model[index - 2].Ny = normal.Y; model[index - 2].Nz = normal.Z; model[index - 2].Tx = tangent.X; model[index - 2].Ty = tangent.Y; model[index - 2].Tz = tangent.Z; model[index - 2].Bx = binormal.X; model[index - 2].By = binormal.Y; model[index - 2].Bz = binormal.Z; model[index - 3].Nx = normal.X; model[index - 3].Ny = normal.Y; model[index - 3].Nz = normal.Z; model[index - 3].Tx = tangent.X; model[index - 3].Ty = tangent.Y; model[index - 3].Tz = tangent.Z; model[index - 3].Bx = binormal.X; model[index - 3].By = binormal.Y; model[index - 3].Bz = binormal.Z; } }