Esempio n. 1
0
        public override (SurfaceInteraction, double) Sample()
        {
            // TODO: Implement Sphere sampling
            if (Outside)
            {
                var pObj = this.Radius * Samplers.UniformSampleSphere();
                var n    = new Vector3(pObj.x, pObj.y, pObj.z);
                var pdf  = 1 / this.Area();
                var dpdu = new Vector3(-pObj.y, pObj.x, 0);

                SurfaceInteraction si = new SurfaceInteraction(pObj, n, Vector3.ZeroVector, dpdu, this);
                return(ObjectToWorld.Apply(si), pdf);
            }
            else
            {
                var pObj = this.Radius * Samplers.UniformSampleSphere();
                var n    = new Vector3(pObj.x, pObj.y, pObj.z);
                var pdf  = 1 / this.Area();
                var dpdu = new Vector3(-pObj.y, pObj.x, 0);

                SurfaceInteraction si = new SurfaceInteraction(pObj, -n, Vector3.ZeroVector, dpdu, this);
                return(ObjectToWorld.Apply(si), pdf);
            }

            // TODO: Return surface interaction and pdf

            // A dummy return example
            //double dummyPdf = 1.0;
            //Vector3 dummyVector = new Vector3(0, 0, 0);
            //SurfaceInteraction dummySurfaceInteraction = new SurfaceInteraction(dummyVector, dummyVector, dummyVector, dummyVector, this);
            //return (dummySurfaceInteraction, dummyPdf);
        }
        public override (SurfaceInteraction, double) Sample()
        {
            var pObj = Samplers.UniformSampleSphere() * Radius;

            pObj *= Radius / pObj.Length(); // refine
            var n    = pObj.Normalize();
            var dpdu = new Vector3(-pObj.y, pObj.x, 0);
            var pdf  = 1 / Area();

            return(ObjectToWorld.Apply(new SurfaceInteraction(pObj, n, Vector3.ZeroVector, dpdu, this)), pdf);
        }
Esempio n. 3
0
        public override (SurfaceInteraction, double) Sample()
        {
            Vector3 sample = Samplers.UniformSampleSphere();
            Vector3 point  = sample * Radius;
            Vector3 normal = sample;
            Vector3 dpdu   = new Vector3(-normal.y, normal.x, 0.0);
            double  pdf    = 1.0 / Area();

            SurfaceInteraction si = new SurfaceInteraction(point, normal, Vector3.ZeroVector, dpdu, this);

            return(ObjectToWorld.Apply(si), pdf);
        }
Esempio n. 4
0
        public override (Spectrum, Vector3, double) Sample_f(Vector3 wo)
        {
            //var wi = Samplers.CosineSampleHemisphere();
            var wi = Samplers.UniformSampleSphere();

            if (wo.z < 0)
            {
                wi.z *= -1;
            }
            double pdf = Pdf(wo, wi);

            return(f(wo, wi), wi, pdf);
        }
Esempio n. 5
0
        public override (SurfaceInteraction, double) Sample()
        {
            // TODO: Implement Sphere sampling
            //Vector3 pObj = Samplers.CosineSampleHemisphere() * Radius;
            Vector3 pObj = Samplers.UniformSampleSphere() * Radius;

            pObj = pObj * (Radius / pObj.Length());

            // TODO: Return surface interaction and pdf
            var    dpdu = new Vector3(-pObj.y, pObj.x, 0);
            double pdf  = 1 / Area(); // a je kle inv 4 PI (1/Math.PI/4)

            return(ObjectToWorld.Apply(new SurfaceInteraction(pObj, ObjectToWorld.ApplyNormal(pObj), Vector3.ZeroVector, dpdu, this)), pdf);
        }
Esempio n. 6
0
        public override (SurfaceInteraction, double) Sample()
        {
            // TODO: Implement Sphere sampling
            var center = new Vector3(0, 0, 0);
            var point  = center + Radius * Samplers.UniformSampleSphere();

            var normal = point.Normalize();

            if (innerOrientation)
            {
                normal = -normal;
            }

            point *= Radius / (center - point).Length();
            var wo          = point;
            var dpdu        = Dpdu(point);
            var interaction = new SurfaceInteraction(point, normal, wo, dpdu, this);

            return(ObjectToWorld.Apply(interaction), Pdf(interaction, point));
        }