예제 #1
0
        public override PointColore GetCouleurIntersect(V3 camera, V3 directionOculaire, float intersection)
        {
            V3 point = new V3(camera + intersection * directionOculaire);
            V3 AI    = new V3(point - position);

            float beta  = (AI * AC) / (AC.Norm() * AC.Norm());
            float alpha = (AI * AB) / (AB.Norm() * AB.Norm());


            V3 dMdu = AB;
            V3 dMdv = AC;

            float dhdu, dhdv;

            BumpMap.Bump(alpha, beta, out dhdu, out dhdv);

            V3 T2          = dMdu ^ (dhdv * normal);
            V3 T3          = (dhdu * normal) ^ dMdv;
            V3 normaleBump = normal + 0.08f * (T2 + T3);

            normaleBump.Normalize();

            V3 positionCouleur = textureA + (alpha * (textureB - textureA) + beta * (textureC - textureA));

            return(new PointColore(point, normaleBump, texture.LireCouleur(positionCouleur.x, positionCouleur.y), this));
        }
예제 #2
0
        private Couleur processLumiere(V3 rayon, PointColore point)
        {
            V3 normalPoint = point.GetNormale();
            //V3 directionOculaire = new V3(camera - point.GetLoc());
            //directionOculaire.Normalize();

            Couleur lumiereTotale = new Couleur(0, 0, 0);

            lumiereTotale += point.GetCouleur() * couleurAmbiance * intensiteAmbiance;
            foreach (Lumiere lampe in lampes)
            {
                if (!(lampe.isOccluded(point, objets)))
                {
                    V3 directionLampeNormale = new V3(lampe.GetDirection(point.GetLoc()));
                    directionLampeNormale.Normalize();

                    float cosAlpha      = normalPoint * directionLampeNormale;
                    float facteurDiffus = Math.Max(0, cosAlpha);
                    lumiereTotale += point.GetCouleur() * lampe.GetCouleur() * facteurDiffus * lampe.GetIntensite(point.GetLoc());

                    V3    reflet            = (2 * cosAlpha * normalPoint) - directionLampeNormale;
                    float produitSpeculaire = Math.Max(0, (reflet * (-rayon)) / (reflet.Norm() * rayon.Norm()));
                    float facteurSpeculaire = (float)Math.Pow(produitSpeculaire, puissanceSpeculaire);
                    lumiereTotale += lampe.GetCouleur() * lampe.GetIntensite(point.GetLoc()) * facteurSpeculaire;
                }
            }
            return(lumiereTotale);
        }