Exemplo n.º 1
0
        /// <summary>
        ///  Metoda PhongAt slouzi pro vypocet odrazu svetla z povrchu materialu
        ///  Na zaklade predaneho objektu intersection a ray je spocitan odraz
        ///  Objekt je vyvzorkovan dle zadaneho poctu vzorku do vstupniho formulare
        ///  Dale je kontrolovan pocet pozadovanych zanoreni
        /// </summary>
        /// <param name="intersection"></param>
        /// <param name="ray"></param>
        /// <returns>Vector s barvou </returns>
        private Vector PhongAt(Intersection intersection, Ray ray)
        {
            Vector viewVector  = -ray.Direction;
            Vector localNormal = (viewVector.Dot(intersection.Normal) > 0.0) ?
                                 intersection.Normal : -intersection.Normal;
            Vector localNormalEps      = localNormal * Vector.EPSILON;
            Vector localNormalEpsPoint = intersection.Point + localNormalEps;

            Vector materialColor = intersection.Material.Color;
            Vector ambientColor  = (materialColor * BackgroundColor(ray.Direction)) *
                                   AmbientPercent(localNormalEpsPoint, localNormal);

            Vector totalColor = ambientColor;

            foreach (Light light in Lights)
            {
                Vector diffuseColorSum = new Vector();

                for (int n = 0; n < lightSamples; ++n)
                {
                    Vector       lightDir  = (light.Shape.RandomPoint - intersection.Point).Normalized;
                    Ray          lightRay  = new Ray(localNormalEpsPoint, lightDir, Ray.InitialDepth);
                    Intersection lightTry  = light.Shape.Intersect(lightRay);
                    Intersection shadowTry = NearestShape(lightRay);

                    if (lightTry.T < shadowTry.T)
                    {
                        double lnDot        = lightDir.Dot(localNormal);
                        Vector lightColor   = light.Shape.Material.Color;
                        Vector diffuseColor = (materialColor * lightColor) * lnDot;
                        diffuseColorSum = diffuseColorSum + diffuseColor;
                    }
                }

                totalColor = totalColor + (diffuseColorSum * (1.0 / lightSamples));
            }

            if (ray.Depth < maxDepth)
            {
                Vector reflectDir   = viewVector.Reflected(localNormal).Normalized;
                Ray    reflectRay   = new Ray(localNormalEpsPoint, reflectDir, ray.Depth + 1);
                Vector reflectColor = RayTrace(reflectRay) * Reflectivity;
                totalColor = totalColor + reflectColor;
            }

            return(totalColor);
        }