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