public void T10_RadialGradientPattern()
        {
            Pattern pattern = new RadialGradientPattern();
            Scene   scene   = new Scene();
            Light   light   = new Light(new Point(-5, 5, -5), Color.white);
            Light   light2  = new Light(new Point(5, 0.4, -5), new Color(0.6, 0.6, 0.15));
            Plane   floor   = new Plane();

            floor.material         = new Material(new Color(1, 0, 0));
            floor.material.pattern = new RingPattern(new SolidColorPattern(Color.white),
                                                     new SolidColorPattern(Color.black));

            Plane wall = new Plane();

            wall.material = new Material(new Color(0, 0, 1));
            wall.SetMatrix(Mat4.RotateXMatrix(Constants.pi / 2.0) *
                           Mat4.TranslateMatrix(0, 0, 4));
            wall.material.pattern = pattern;

            Sphere sphere1 = new Sphere();

            sphere1.SetMatrix(Mat4.TranslateMatrix(0, 0.5, -3) *
                              Mat4.ScaleMatrix(0.5, 0.5, 0.5));
            sphere1.material.pattern = pattern;

            Sphere sphere2 = new Sphere();

            sphere2.SetMatrix(Mat4.TranslateMatrix(2, 1.0, -1));
            sphere2.material.pattern = pattern;

            Camera camera = new Camera(640, 480, Constants.pi / 3.0);

            //Need to halt execution if I end up with NaN
            camera.ViewTransform(new Point(0, 2, -10),
                                 new Point(0, 2, 4),
                                 new Vector(0, 1, 0));

            Canvas canvas = Scene.current.Render(camera);

            Save.SaveCanvas(canvas, "Chapter10_RadialGradient");
        }
Beispiel #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);
        }