Exemplo n.º 1
0
 public override Point Sample(float u1, float u2, out Normal ns)
 {
     var z = MathUtility.Lerp(u1, _zMin, _zMax);
     var t = u2 * _phiMax;
     var p = new Point(_radius * MathUtility.Cos(t), _radius * MathUtility.Sin(t), z);
     ns = Normal.Normalize(ObjectToWorld.TransformNormal(new Normal(p.X, p.Y, 0)));
     if (ReverseOrientation)
         ns *= -1.0f;
     return ObjectToWorld.TransformPoint(ref p);
 }
Exemplo n.º 2
0
        public override Point Sample(float u1, float u2, out Normal ns)
        {
            Point p = new Point(0, 0, 0) + _radius * MonteCarloUtilities.UniformSampleSphere(u1, u2);

            ns = Normal.Normalize(ObjectToWorld.TransformNormal(new Normal(p.X, p.Y, p.Z)));
            if (ReverseOrientation)
            {
                ns *= -1.0f;
            }
            return(ObjectToWorld.TransformPoint(ref p));
        }
Exemplo n.º 3
0
        public override SampledSpectrum Sample(ref Vector3 point, Scene scene, out Vector3 incomingVector,
                                               out VisibilityTester visibilityTester)
        {
            var r1 = StaticRandom.NextFloat() * 2 - 1;
            var r2 = StaticRandom.NextFloat() * 2 - 1;
            var pointInDiskLocal = new Vector3(r1 * _radius, 0, r2 * _radius);
            var pointInDiskWorld = ObjectToWorld.TransformPoint(ref pointInDiskLocal);

            incomingVector = point - pointInDiskWorld;
            var cosangle = Vector3.Dot(incomingVector.Normalized(), _normal);

            visibilityTester = new VisibilityTester(pointInDiskWorld, point, scene);
            return(Spectrum * cosangle / incomingVector.Length);
        }
Exemplo n.º 4
0
        public override Point Sample(float u1, float u2, out Normal ns)
        {
            var p = new Point();

            MonteCarloUtilities.ConcentricSampleDisk(u1, u2, out p.X, out p.Y);
            p.X *= _radius;
            p.Y *= _radius;
            p.Z  = _height;
            ns   = Normal.Normalize(ObjectToWorld.TransformNormal(new Normal(0, 0, 1)));
            if (ReverseOrientation)
            {
                ns *= -1.0f;
            }
            return(ObjectToWorld.TransformPoint(ref p));
        }
Exemplo n.º 5
0
        public override float Pdf(Point p, Vector wi)
        {
            Point Pcenter = ObjectToWorld.TransformPoint(Point.Zero);

            // Return uniform weight if point inside sphere
            if (Point.DistanceSquared(p, Pcenter) - _radius * _radius < 1e-4f)
            {
                return(base.Pdf(p, wi));
            }

            // Compute general sphere weight
            float sinThetaMax2 = _radius * _radius / Point.DistanceSquared(p, Pcenter);
            float cosThetaMax  = MathUtility.Sqrt(Math.Max(0.0f, 1.0f - sinThetaMax2));

            return(MonteCarloUtilities.UniformConePdf(cosThetaMax));
        }
Exemplo n.º 6
0
        public override Point Sample(Point p, float u1, float u2, out Normal ns)
        {
            // Compute coordinate system for sphere sampling
            Point  Pcenter = ObjectToWorld.TransformPoint(Point.Zero);
            Vector wc = Vector.Normalize(Pcenter - p);
            Vector wcX, wcY;

            Vector.CoordinateSystem(wc, out wcX, out wcY);

            // Sample uniformly on sphere if $\pt{}$ is inside it
            if (Point.DistanceSquared(p, Pcenter) - _radius * _radius < 1e-4f)
            {
                return(Sample(u1, u2, out ns));
            }

            // Sample sphere uniformly inside subtended cone
            float sinThetaMax2 = _radius * _radius / Point.DistanceSquared(p, Pcenter);
            float cosThetaMax  = MathUtility.Sqrt(Math.Max(0.0f, 1.0f - sinThetaMax2));
            DifferentialGeometry dgSphere;
            float thit, rayEpsilon;
            Point ps;
            Ray   r = new Ray(p, MonteCarloUtilities.UniformSampleCone(u1, u2, cosThetaMax, ref wcX, ref wcY, ref wc),
                              1e-3f);

            if (!TryIntersect(r, out thit, out rayEpsilon, out dgSphere))
            {
                thit = Vector.Dot(Pcenter - p, Vector.Normalize(r.Direction));
            }
            ps = r.Evaluate(thit);
            ns = (Normal)Vector.Normalize(ps - Pcenter);
            if (ReverseOrientation)
            {
                ns *= -1.0f;
            }
            return(ps);
        }