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"); }
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); }