Example #1
0
        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;
        }
Example #2
0
        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;
            }
        }