Ejemplo n.º 1
0
        public static Tuple <World, Camera> Example9(int width, int height)
        {
            var world = new World();

            var solidBlack = new SolidPattern(Color.Black);

            var stripes1 = new StripePattern(
                new Color(0.0, 0.0, 0.0),
                new Color(0.0, 0.0, 0.5))
            {
            };

            var stripes2 = new StripePattern(
                new Color(0.0, 0.0, 0.0),
                new Color(0.5, 0.0, 0.0))
            {
                Transform = Transform.RotateY(Math.PI / 2),
            };

            var stripes3 = new StripePattern(
                new Color(0.6, 0.6, 0.6),
                new Color(0.3, 0.3, 0.3))
            {
                Transform = Transform.RotateY(Math.PI / 4),
            };

            var stripes4 = new StripePattern(
                new Color(0.6, 0.6, 0.6),
                new Color(0.3, 0.3, 0.3))
            {
                Transform = Transform.RotateY(-Math.PI / 4),
            };

            var blended1 = new BlendedPattern(stripes1, stripes2)
            {
                Transform =
                    Transform.Scale(0.5, 0.5, 0.5),
            };

            var blended2 = new BlendedPattern(stripes3, stripes4)
            {
                Transform =
                    Transform.Scale(0.5, 0.5, 0.5),
            };

            var blended = new BlendedPattern(blended1, blended2);

            var floor = new Plane
            {
                Material = new Material
                {
                    Ambient  = 0.6,
                    Diffuse  = 0.2,
                    Specular = 0,
                    Pattern  = blended,
                },
            };

            world.Objects.Add(floor);

            var ceil = new Plane
            {
                Transform =
                    Transform.Translate(0, 10, 0) *
                    Transform.RotateX(Math.PI),

                Material = new Material
                {
                    Ambient  = 0.3,
                    Diffuse  = 0.6,
                    Specular = 0,
                    Pattern  = blended,
                },
            };

            world.Objects.Add(ceil);

            const int n = 48;

            for (var i = 0; i < n; i++)
            {
                var s0 = new Sphere
                {
                    Material = new Material
                    {
                        Reflective      = 1.0,
                        Transparency    = 1.0,
                        RefractiveIndex = 1.52,
                        Diffuse         = 0.1,
                        Ambient         = 0,
                        Pattern         = new GradientPattern(
                            new Color(0.6, 0.1, 0.1),
                            new Color(0.1, 0.1, 0.6))
                        {
                            Transform =
                                Transform.Scale(2, 1, 1),
                        }
                    },

                    Transform =
                        Transform.Translate(-8.0 + i * (64.0 / n), 0.5, 0) *
                        Transform.Scale(0.3, 0.3, 0.3),
                };

                world.Objects.Add(s0);
            }

            var cyl = new Cylinder()
            {
                Transform =
                    Transform.Scale(20, 1, 20),
            };

            var light = new PointLight(Vector4.CreatePosition(0, 5, 0), Color.White);

            world.Lights.Add(light);

            var camera = new Camera(width, height, Math.PI / 4.2)
            {
                Transform = Transform.View(
                    Vector4.CreatePosition(-5, 5, -5),
                    Vector4.CreatePosition(0, 0, 0),
                    Vector4.CreateDirection(0, 0, 1)),

                ProgressMonitorFactory =
                    (_rows, _cols) => new DefaultProgressMonitor(),
            };

            return(Tuple.Create(world, camera));
        }
Ejemplo n.º 2
0
        protected override Canvas Render(CameraRenderOptions options)
        {
            // Patterns
            var checkerPattern = new CheckerPattern(
                new StripePattern(
                    Colors.LightGray,
                    Colors.Gray,
                    Matrix4x4.CreateScaling(0.25, 0.25, 0.25).RotateY(-Math.PI / 8)),
                new GradientPattern(new Color(1, 0.75, 0.75), new Color(1, 0.5, 0.5)),
                Matrix4x4.CreateScaling(0.4, 0.4, 0.4));

            var blendedPattern = new BlendedPattern(
                new StripePattern(new Color(0.9, 1, 0.9), new Color(0, 1, 0), Matrix4x4.CreateRotationY(Math.PI / 2)),
                new StripePattern(new Color(0.9, 1, 0.9), new Color(0, 1, 0)),
                0.5);

            var stripePattern = new StripePattern(
                new GradientPattern(new Color(0.8, 0.8, 1), Colors.Blue),
                new GradientPattern(Colors.Blue, new Color(0.8, 0.8, 1)),
                Matrix4x4.CreateScaling(0.25, 0.25, 0.25)
                .RotateZ(-Math.PI / 4)
                .RotateY(-Math.PI / 6)
                .Translate(0.4, 0, 0));

            var gradientPattern = new RadialGradientPattern(
                Colors.Green,
                Colors.Yellow,
                Matrix4x4.CreateScaling(0.25, 0.25, 0.25).RotateX(-Math.PI / 2));

            var ringPattern = new RingPattern(
                Colors.Red,
                Colors.White,
                Matrix4x4.CreateScaling(0.15, 0.15, 0.15).RotateX(-Math.PI / 2));

            // Shapes
            var floor = new Plane(
                "Floor",
                Matrix4x4.CreateRotationY(Math.PI / 4),
                new Material(pattern: blendedPattern, specular: 0));

            var backWall = new Plane(
                "BackWall",
                Matrix4x4.CreateRotationX(Math.PI / 2).Translate(0, 0, 5),
                new Material(pattern: checkerPattern));

            var left = new Sphere(
                "Left",
                Matrix4x4.CreateScaling(0.33, 0.33, 0.33).Translate(-2, 0.33, -0.75),
                new Material(pattern: ringPattern, diffuse: 0.7, specular: 0.3));

            var middle = new Sphere(
                "Middle",
                Matrix4x4.CreateTranslation(-0.5, 1, 0.5),
                new Material(pattern: stripePattern, diffuse: 0.7, specular: 0.3));

            var right = new Sphere(
                "Right",
                Matrix4x4.CreateScaling(0.5, 0.5, 0.5).Translate(1.5, 0.5, -0.5),
                new Material(pattern: gradientPattern, diffuse: 0.7, specular: 0.3));

            var light = new PointLight(new Point(-10, 10, -10), Colors.White);
            var world = new World(light, floor, backWall, left, middle, right);

            var cameraTransform = Matrix4x4.CreateLookAt(new Point(0, 1.5, -5), new Point(0, 1, 0), Vector.UnitY);
            var camera          = new Camera(CanvasWidth, CanvasHeight, Math.PI / 3, cameraTransform);

            Canvas canvas = camera.Render(world, options);

            return(canvas);
        }
Ejemplo n.º 3
0
        public static Tuple <World, Camera> Example12(int width, int height)
        {
            var world = new World();

            var gray1 = new Color(0.12, 0.12, 0.12);
            var gray2 = new Color(0.3, 0.3, 0.3);

            var stripes1 = new StripePattern(gray1, gray2)
            {
                Transform = Transform.RotateY(-Math.PI / 4),
            };

            var stripes2 = new StripePattern(gray1, gray2)
            {
                Transform = Transform.RotateY(Math.PI / 4),
            };

            var blended = new BlendedPattern(stripes1, stripes2)
            {
                Transform = Transform.Scale(0.5, 0.5, 0.5),
            };

            var plane = new Plane()
            {
                Material = new Material()
                {
                    Reflective = 0.1,
                    Specular   = 0,
                    Ambient    = 0.17,
                    Diffuse    = 0.8,
                    Pattern    = blended,
                },
            };

            world.Objects.Add(plane);

            var gradTransform =
                Transform.Translate(0, 1, 0) *
                Transform.RotateZ(Math.PI / 2) *
                Transform.Scale(2, 1, 1);

            var grad1 = new Material
            {
                Reflective = 0.2,
                Ambient    = 0.21,
                Diffuse    = 0.81,
                Pattern    = new GradientPattern(
                    new Color(0.13, 0.58, 0.69),
                    new Color(0.43, 0.84, 0.93))
                {
                    Transform = gradTransform,
                }
            };

            var grad2 = new Material
            {
                Reflective = 0.2,
                Ambient    = 0.21,
                Diffuse    = 0.81,
                Pattern    = new GradientPattern(
                    new Color(0.74, 0.76, 0.78),
                    new Color(0.17, 0.24, 0.31))
                {
                    Transform = gradTransform,
                }
            };

            var grad3 = new Material
            {
                Reflective = 0.2,
                Ambient    = 0.21,
                Diffuse    = 0.81,
                Pattern    = new GradientPattern(
                    new Color(0.80, 0.17, 0.37),
                    new Color(0.46, 0.23, 0.53))
                {
                    Transform = gradTransform,
                }
            };

            var grad4 = new Material
            {
                Reflective = 0.2,
                Ambient    = 0.21,
                Diffuse    = 0.81,
                Pattern    = new GradientPattern(
                    new Color(0.0, 0.2, 0.16),
                    new Color(0.0, 0.31, 0.57))
                {
                    Transform = gradTransform,
                }
            };

            var grads = new[]
            {
                grad2,
                grad1,
                grad3,
                grad2,
                grad4,
                grad2,
                grad3,
                grad1,
                grad2,
                grad4,
                grad3,
                grad4,
                grad3,
                grad1,
                grad2,
                grad1,
            };

            const int nx = 32;
            // const int nz = 8;

            var stridex = 20.0 / nx;

            // var stridez = 20.0 / nz;

            for (var i = 0; i < nx; i++)
            {
                var sx   = 0.1 + Rng.NextDouble() * 0.1;
                var sy   = (0.2 + 1.5 * Rng.NextDouble()) * (1 + sx);
                var sz   = sx;
                var dx   = -10.0 + i * stridex;
                var grad = grads[i % grads.Length];
                var c    = new Cube()
                {
                    Material  = grad,
                    Transform =
                        Transform.Translate(dx, sy, 0) *
                        Transform.Scale(sx, sy, sz),
                };

                world.Objects.Add(c);
            }

            for (var i = 0; i < nx; i++)
            {
                var sx   = 0.2 + Rng.NextDouble() * 0.1;
                var sy   = (0.2 + 1.0 * Rng.NextDouble()) * (1 + sx);
                var sz   = sx;
                var dx   = -9.3 + i * stridex;
                var dz   = 1.7;
                var grad = grads[(i + 3) % grads.Length];
                var c    = new Cube()
                {
                    Material  = grad,
                    Transform =
                        Transform.Translate(dx, sy, dz) *
                        Transform.Scale(sx, sy, sz),
                };

                world.Objects.Add(c);
            }

            for (var i = 0; i < nx; i++)
            {
                var sx   = 0.15 + Rng.NextDouble() * 0.1;
                var sy   = (0.2 + 0.5 * Rng.NextDouble()) * (1 + sx);
                var sz   = sx;
                var dx   = -9.3 + i * stridex;
                var dz   = 2.5;
                var grad = grads[(i + 3) % grads.Length];
                var c    = new Cube()
                {
                    Material  = grad,
                    Transform =
                        Transform.Translate(dx, sy, dz) *
                        Transform.Scale(sx, sy, sz),
                };

                world.Objects.Add(c);
            }

            var l1 = new PointLight(
                Vector4.CreatePosition(-10, 10, -10),
                new Color(0.6, 0.6, 0.6));

            world.Lights.Add(l1);

            var l2 = new PointLight(
                Vector4.CreatePosition(10, 10, -10),
                new Color(0.6, 0.6, 0.6));

            world.Lights.Add(l2);

            var camera = new Camera(width, height, Math.PI / 2)
            {
                Transform = Transform.View(
                    Vector4.CreatePosition(0.0, 3.2, -4),
                    Vector4.CreatePosition(0, 0.5, 0),
                    Vector4.CreateDirection(0, 1, 0)),

                ProgressMonitorFactory =
                    (_rows, _cols) => new DefaultProgressMonitor(),
            };

            return(Tuple.Create(world, camera));
        }