public EnergieLumineuse GetLumiere(Rayon R, int bounceLeft, List <ObjetPhysique> ExclusionContact) { EnergieLumineuse E = Rayon.CalculerAtmosphere(this, R.tir); if (E.isNan()) { ; } EnergieLumineuse Ei = new EnergieLumineuse(); InfoContact contact = R.Tirer(this, ExclusionContact); if (!(contact.Objet is null)) { Vector Opacite = Rayon.CalculerOpacite(this, R.tir.depart, R.Position()); Materiau mat = contact.Objet.getMateriau(); if (bounceLeft > 0) { Tir rebond = contact.Rebond(); Tir refrac = contact.Refraction(); Rayon Rebond = new Rayon(rebond, 0, R.Pas, R.distMax); Rayon Refrac = new Rayon(refrac, 0, R.Pas, R.distMax); EnergieLumineuse LumRebond = GetLumiere(Rebond, bounceLeft - 1, new List <ObjetPhysique>() { contact.Objet }); if (!mat.Opaque) { EnergieLumineuse LumRefrac = GetLumiere(Refrac, bounceLeft - 1, new List <ObjetPhysique>() { contact.Objet }); Ei += LumRefrac * contact.coeffRefrac(refrac.direction); } Vector Couleur = contact.Objet.CouleurReelle(contact, rebond.direction); Ei += LumRebond * Couleur * contact.coeffRebond(refrac.direction); } foreach (SourceLumineuse lu in sources) { Vector OpaciteLum = Rayon.CalculerOpacite(this, lu.Position(), contact.Position); Vector Sortant = (lu.Position() - contact.Position).Normer(); EnergieLumineuse ArriveeBrute = lu.GetEnergieLumineuse(contact.Position); EnergieLumineuse Attenuee = ArriveeBrute.Opacifier(OpaciteLum, facteurExtinction); Vector Couleur = contact.Objet.CouleurReelle(contact, Sortant); EnergieLumineuse PointContact = Attenuee * Couleur; Ei += PointContact; } Ei.Opacifier(Opacite, facteurExtinction); } return(E + Ei); }
public Vector CouleurReelle(Tuple <double, double> coord2D, InfoContact Contact, Vector Sortant) { double AngleSpeculaire = Contact.Rebond().direction.Angle(Sortant); double AngleIncidence = (-Contact.VecteurIncident).Angle(Contact.VecteurNormal); Vector CouleurLocale = Coloration(coord2D.Item1, coord2D.Item2); Vector FacteurRasant = ColorationAngulaire(AngleIncidence); if (FacteurRasant.isNan()) { ; } if (CouleurLocale.isNan()) { ; } Vector retour = AttenuationReflexion(AngleSpeculaire) % (new Vector(1, 1, 1) % FacteurRasant + CouleurLocale % (1.0 - FacteurRasant)); if (retour.isNan()) { ; } return(retour); }