Exemple #1
0
        public Matrix4f SetToLookAt(Vector3f dir, Vector3f up)
        {
            this.SetToIdentity();

            l_vez.Set(dir);
            l_vez.NormalizeStore();
            l_vex.Set(dir);
            l_vex.NormalizeStore();
            l_vex.CrossStore(up);
            l_vex.NormalizeStore();
            l_vey.Set(l_vex);
            l_vey.CrossStore(l_vez);
            l_vey.NormalizeStore();

            this.values[Matrix4f.m00] = l_vex.x;
            this.values[Matrix4f.m01] = l_vex.y;
            this.values[Matrix4f.m02] = l_vex.z;

            this.values[Matrix4f.m10] = l_vey.x;
            this.values[Matrix4f.m11] = l_vey.y;
            this.values[Matrix4f.m12] = l_vey.z;

            this.values[Matrix4f.m20] = l_vez.x;
            this.values[Matrix4f.m21] = l_vez.y;
            this.values[Matrix4f.m22] = l_vez.z;

            return(this);
        }
Exemple #2
0
        public static void CalculateTangents(List<Vertex> vertices, List<int> indices)
        {
            for (int i = 0; i < indices.Count; i += 3)
            {
                try
                {
                    Vertex v0 = vertices[indices[i]];
                    Vertex v1 = vertices[indices[i + 1]];
                    Vertex v2 = vertices[indices[i + 2]];

                    Vector2f uv0 = v0.GetTexCoord0();
                    Vector2f uv1 = v1.GetTexCoord0();
                    Vector2f uv2 = v2.GetTexCoord0();

                    Vector3f edge1 = v1.GetPosition().Subtract(v0.GetPosition());
                    Vector3f edge2 = v2.GetPosition().Subtract(v0.GetPosition());

                    Vector2f edge1uv = uv1.Subtract(uv0);
                    Vector2f edge2uv = uv2.Subtract(uv0);

                    float cp = edge1uv.y * edge2uv.x - edge1uv.x * edge2uv.y;
                    if (cp != 0.0f)
                    {
                        float mul = 1.0f / cp;
                        Vector3f tangent = new Vector3f().Set(edge1.Multiply(-edge2uv.y).AddStore(edge2.Multiply(edge1uv.y)));
                        tangent.MultiplyStore(mul);
                        Vector3f bitangent = new Vector3f().Set(edge1.Multiply(-edge2uv.x).AddStore(edge2.Multiply(edge1uv.x)));
                        bitangent.MultiplyStore(mul);

                        tangent.NormalizeStore();
                        bitangent.NormalizeStore();

                        v0.SetTangent(tangent);
                        v1.SetTangent(tangent);
                        v2.SetTangent(tangent);

                        v0.SetBitangent(bitangent);
                        v1.SetBitangent(bitangent);
                        v2.SetBitangent(bitangent);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }