public void IntersectingConeEndCaps( double ox, double oy, double oz, double dx, double dy, double dz, int count) { var shape = new Cone() { Minimum = -0.5, Maximum = 0.5, IsClosed = true, }; var origin = Vector4.CreatePosition(ox, oy, oz); var direction = Vector4.CreateDirection(dx, dy, dz).Normalize(); var r = new Ray(origin, direction); var xs = shape.LocalIntersect(r); Assert.Equal(count, xs.Count); }
public void AreaLightIntensityFunction( double px, double py, double pz, double result) { var w = new DefaultWorld(); var corner = Vector4.CreatePosition(-0.5, -0.5, -5); var v1 = Vector4.CreateDirection(1, 0, 0); var v2 = Vector4.CreateDirection(0, 1, 0); var light = new AreaLight( corner, v1, 2, v2, 2, Color.White); var pt = Vector4.CreatePosition(px, py, pz); var intensity = light.GetIntensity(pt, w); Assert.Equal(result, intensity); }
public void FindSinglePointOnAnAreaLight( double u, double v, double rx, double ry, double rz) { var corner = Vector4.CreatePosition(0, 0, 0); var v1 = Vector4.CreateDirection(2, 0, 0); var v2 = Vector4.CreateDirection(0, 0, 1); var light = new AreaLight( corner, v1, 4, v2, 2, Color.White); var pt = light.GetPoint(u, v); var expected = Vector4.CreatePosition(rx, ry, rz); Assert.Equal(expected, pt); }
public void TransformBoundingBox() { var cmp = Vector4.GetEqualityComparer(0.0001); var box = new BoundingBox( Vector4.CreatePosition(-1, -1, -1), Vector4.CreatePosition(1, 1, 1)); var m = Transform.RotateX(Math.PI / 4) * Transform.RotateY(Math.PI / 4); var box2 = box * m; Assert.Equal( Vector4.CreatePosition(-1.4142, -1.7071, -1.7071), box2.Min, cmp); Assert.Equal( Vector4.CreatePosition(1.4142, 1.7071, 1.7071), box2.Max, cmp); }
public static Tuple <World, Camera> Example15(int width, int height) { var world = new World(); var sky = new Plane() { Transform = Transform.Translate(0, 30, 0) * Transform.RotateX(Math.PI), Material = new Material() { Color = Color.White, }, }; var floor = new Plane() { Material = new Material { Specular = 0, // Color = new Color(1, 1, 1), Diffuse = 0.7, Ambient = 0.3, Pattern = new CheckersPattern( new Color(0.6, 0.6, 0.6), new Color(0.45, 0.45, 0.45)) { // Transform = Transform.Scale(2, 2, 2), }, }, }; var sphere = new Sphere() { Transform = Transform.Translate(0, 1, 0), Material = new Material { Specular = 1.0, Ambient = 0.0, Diffuse = 0.001, Shininess = 350, Color = new Color(0.05, 0.05, 0.2), Transparency = 0.90, RefractiveIndex = 1.52, Reflective = 0.98, }, }; var smallSphere1 = new Sphere() { Transform = Transform.Translate(0, 0.5, -2) * Transform.Scale(0.5, 0.5, 0.5), Material = new Material { Specular = 0.2, Ambient = 0.2, Diffuse = 0.7, Shininess = 20, Color = new Color(0.8, 0.3, 0.4), }, }; var smallSphere2 = new Sphere() { Transform = Transform.Translate(0, 0.75, 3.5) * Transform.Scale(0.75, 0.75, 0.75), Material = new Material { Specular = 0.2, Ambient = 0.1, Diffuse = 0.9, Shininess = 50, Color = new Color(0.2, 0.7, 0.6), }, }; var light1 = new PointLight( Vector4.CreatePosition(-10, 10, -10), Color.White); world.Objects.Add(sky); world.Objects.Add(floor); world.Objects.Add(sphere); world.Objects.Add(smallSphere1); world.Objects.Add(smallSphere2); world.Lights.Add(light1); var camera = new Camera(width, height, Math.PI / 4) { Transform = Transform.View( Vector4.CreatePosition(2.4, 1.08, -5.4), Vector4.CreatePosition(0, 0.7, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public Scene Build(int width, int height) { var camera = new Camera(width, height, 0.7854) { Transform = Transform.View( Vector4.CreatePosition(0, 5, -10), Vector4.CreatePosition(0, 0.5, 0), Vector4.CreateDirection(0, 1, 0)), }; var sky = new Sphere() { Transform = Transform.Scale(100, 100, 100), Material = new Material() { Ambient = 0.1, Specular = 0, Diffuse = 1.0, Color = Color.FromByteValues(193, 207, 252), }, }; var metal1 = new Material() { Pattern = new GradientPattern( Color.FromByteValues(56, 63, 73), Color.FromByteValues(79, 77, 75)) { Transform = Transform.Translate(-1, 0, 0) * Transform.RotateY(Math.PI / 3) * Transform.Scale(2, 1, 1), }, Ambient = 0.3, Reflective = 0.12, Specular = 0.27, Diffuse = 1.0, Shininess = 3, }; var metal2 = metal1.Extend(x => { x.Pattern = new GradientPattern( Color.FromByteValues(93, 89, 104), Color.FromByteValues(65, 61, 76)) { Transform = Transform.Translate(-1, 0, 0) * Transform.RotateY(Math.PI / 2) * Transform.Scale(2, 1, 1), }; }); var metal3 = metal1.Extend(x => { x.Pattern = new GradientPattern( Color.FromByteValues(87, 109, 132), Color.FromByteValues(53, 67, 81)) { Transform = Transform.Translate(-1, 0, 0) * Transform.RotateY(-Math.PI / 2) * Transform.Scale(2, 1, 1), }; }); var glass1 = new Material() { Transparency = 0.9, Reflective = 0.3, RefractiveIndex = 1.52, Specular = 0.9, Shininess = 300, Diffuse = 0.05, Ambient = 0, }; var p = new Plane() { Material = new Material() { Pattern = new CheckersPattern( Color.FromByteValues(249, 243, 229), Color.FromByteValues(226, 220, 204)), Ambient = 0.5, Specular = 0, Diffuse = 0.4, }, }; var small = Transform.Translate(0, 0.25, 0) * Transform.Scale(0.25, 0.25, 0.25); var med = Transform.Translate(0, 0.4, 0) * Transform.Scale(0.4, 0.4, 0.4); var large = Transform.Translate(0, 0.6, 0) * Transform.Scale(0.6, 0.6, 0.6); var xlarge = Transform.Translate(0, 0.75, 0) * Transform.Scale(0.75, 0.75, 0.75); var sizes = new[] { small, med, large, xlarge, }; var materials = new[] { metal1, metal2, metal3, glass1, }; const int seed = 12345; var rng = new Random(seed); var g = new Group(); for (var i = 0; i < 100; i++) { var size = sizes[i % sizes.Length]; var mat = materials[i % materials.Length]; var x = 20 - rng.NextDouble() * 40; var z = 20 - rng.NextDouble() * 40; var t = size * Transform.Translate(x, 0, z); var s = new Sphere() { Transform = t, Material = mat, }; g.Add(s); } var light = new PointLight( Vector4.CreatePosition(-10, 10, -10), Color.White); var world = new World() { Objects = new Shape[] { sky, p, g }, Lights = new ILight[] { light }, }; return(new Scene(world, camera)); }
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)); }
public static Tuple <World, Camera> Example8(int width, int height) { var world = new World(); var skyblue = new Color(181.0 / 255, 228.0 / 255, 231.0 / 255); var sky = new Material { Color = skyblue, Specular = 0, Ambient = 0.2, Diffuse = 0.3, }; var floor = new Plane() { Material = new Material() { Specular = 0, Ambient = 0.4, Diffuse = 0.5, Pattern = new CheckersPattern( new Color(0.925, 0.870, 0.670), new Color(0.886, 0.804, 0.610)) { Transform = Transform.Scale(0.25, 0.25, 0.25), }, }, }; world.Objects.Add(floor); var w1 = new Plane() { Transform = Transform.Translate(0, 0, 100) * Transform.RotateX(-Math.PI / 2), Material = sky, }; world.Objects.Add(w1); var w2 = new Plane() { Transform = Transform.Translate(0, 0, -100) * Transform.RotateX(Math.PI / 2), Material = sky, }; world.Objects.Add(w2); var w3 = new Plane() { Transform = Transform.Translate(100, 0, 0) * Transform.RotateZ(Math.PI / 2), Material = sky, }; world.Objects.Add(w3); var w4 = new Plane() { Transform = Transform.Translate(-100, 0, 0) * Transform.RotateZ(-Math.PI / 2), Material = sky, }; world.Objects.Add(w4); var w5 = new Plane() { Transform = Transform.Translate(0, 100, 0) * Transform.RotateZ(-Math.PI), Material = sky, }; world.Objects.Add(w5); var metallic1 = new Material() { Color = new Color(96.0 / 255, 93.0 / 255, 82.0 / 255), Reflective = 0.17, Ambient = 0.2, Diffuse = 0.54, Shininess = 10, Specular = 0.3, }; var metallic2 = new Material() { Color = new Color(59.0 / 255, 47.0 / 255, 57.0 / 255), Reflective = 0.1, Diffuse = 0.8, Shininess = 5, Specular = 0.3, }; var metallic3 = new Material() { Color = new Color(32.0 / 255, 132.0 / 255, 70.0 / 255), Reflective = 0.14, Diffuse = 0.7, Shininess = 20, Specular = 0.4, }; var glass = new Material() { Color = new Color(0.1, 0.05, 0.2), Reflective = 0.72, Transparency = 0.72, RefractiveIndex = Water, Diffuse = 0.32, Ambient = 0.01, Specular = 1.0, Shininess = 350, }; glass.Pattern = new GradientPattern( new Color(231.0 / 255, 128.0 / 255, 102.0 / 255), new Color(70.0 / 255, 143.0 / 255, 30.0 / 255)) { Transform = Transform.Translate(1.0, 0, 0) * Transform.Scale(2.0, 1, 1), }; var s1 = new Sphere() { Transform = Transform.Translate(0, 1, 0), Material = metallic1, }; world.Objects.Add(s1); var s2 = new Sphere() { Transform = Transform.Translate(-1.8, 0.5, -0.7) * Transform.Scale(0.5, 0.5, 0.5), Material = glass, }; world.Objects.Add(s2); var s3 = new Sphere() { Transform = Transform.Translate(-0.2, 0.3, -1.5) * Transform.Scale(0.3, 0.3, 0.3), Material = glass, }; world.Objects.Add(s3); var s4 = new Sphere() { Transform = Transform.Translate(-3.0, 0.7, 1.0) * Transform.Scale(0.7, 0.7, 0.7), Material = metallic3, }; world.Objects.Add(s4); var s5 = new Sphere() { Transform = Transform.Translate(1.2, 0.5, -0.85) * Transform.Scale(0.5, 0.5, 0.5), Material = metallic2, }; world.Objects.Add(s5); var c1 = new Cube() { Transform = Transform.Translate(0, 0.999, -7) * Transform.Scale(2, 2, 2) * Transform.RotateY(Math.PI / 5), Material = new Material { Color = new Color(0.8, 0.2, 0.6), Reflective = 0.1, Diffuse = 0.8, }, }; world.Objects.Add(c1); var c2 = new Cube() { Transform = Transform.Translate(6, 0.999, -5) * Transform.Scale(1.5, 1.5, 1.5) * Transform.RotateY(-Math.PI / 7), Material = new Material { Color = new Color(0.1, 0.5, 0.5), Reflective = 0.1, Diffuse = 0.8, }, }; world.Objects.Add(c2); var c3 = new Cube() { Transform = Transform.Translate(-4, 0.999, -6) * Transform.Scale(1.5, 1.5, 1.5) * Transform.RotateY(-Math.PI / 5), Material = new Material { Color = new Color(0.1, 0.5, 0.5), Reflective = 0.1, Diffuse = 0.8, }, }; world.Objects.Add(c3); var light = new PointLight( Vector4.CreatePosition(-5, 10, -2), Color.White); world.Lights.Add(light); var camera = new Camera(width, height, Math.PI / 4) { Transform = Transform.View( Vector4.CreatePosition(2.5, 2.5, -5.5), Vector4.CreatePosition(0.1, 0.9, -1.0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public static Tuple <World, Camera> Example7(int width, int height) { var world = new World(); var floor = new Plane() { Material = new Material() { Pattern = new StripePattern( new Color(0.1, 0.3, 0.5), new Color(0.1, 0.5, 0.6)) { Transform = Transform.Scale(1, 1, 1) * Transform.RotateY(Math.PI / 4), }, }, }; world.Objects.Add(floor); var wall = new Cube() { Transform = Transform.Translate(0, 0.999, 0) * Transform.Scale(1, 1, 0.1), Material = new Material() { Reflective = 1, Specular = 1.0, Shininess = 300, Diffuse = 0.0, Ambient = 0.0, // Color = new Color(0.01, 0.02, 0.2), Transparency = 1.0, RefractiveIndex = 1.52, }, }; world.Objects.Add(wall); var s1 = new Sphere() { Transform = Transform.Translate(0, 0.25, -1.0) * Transform.Scale(0.25, 0.25, 0.25), Material = new Material() { Ambient = 0.2, Diffuse = 0.95, Shininess = 50, Specular = 0.3, Color = new Color(0.9, 0.5, 0.84), }, }; world.Objects.Add(s1); var s2 = new Sphere() { Transform = Transform.Translate(-0.45, 0.25, 1.0) * Transform.Scale(0.25, 0.25, 0.25), Material = new Material() { Ambient = 0.2, Diffuse = 0.95, Shininess = 50, Specular = 0.3, Color = new Color(0.1, 0.7, 0.7), }, }; world.Objects.Add(s2); var light = new PointLight( Vector4.CreatePosition(0, 10, -2), Color.White); world.Lights.Add(light); var camera = new Camera(width, height, Math.PI / 3) { Transform = Transform.View( Vector4.CreatePosition(0.6, 1.0, -2.3), Vector4.CreatePosition(0, 0.25, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public static Tuple <World, Camera> Create(int width, int height) { var world = new World(); var cam = new Camera(width, height, Math.PI / 3); cam.Transform = Transform.View( Vector4.CreatePosition(0, 10, 0), Vector4.CreatePosition(0, 0.25, 0), Vector4.CreateDirection(0, 0, -1)); cam.ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(); var l1 = new PointLight(Vector4.CreatePosition(-20, 3.5, -50), Color.White); var l2 = new PointLight(Vector4.CreatePosition(10, 100, 500), new Color(1, 1, 1)); var g1 = new GradientPattern( new Color(0, 1, 0), new Color(0, 0, 1)); g1.Transform = Transform.RotateZ(-0.2) * Transform.RotateY(Math.PI / 5) * Transform.Translate(-1, 0, 0) * Transform.Scale(2, 2, 2); var s0 = new Sphere() { Transform = Transform.Scale(2, 2, 2), Material = new Material() { Pattern = g1, Reflective = 0.9, Transparency = 0.4, RefractiveIndex = 1.5, Ambient = 0.01, Diffuse = 0.2, Specular = 1.0, Shininess = 350, }, }; var s00 = new Sphere() { Transform = Transform.Scale(1.8, 1.8, 1.8), Material = new Material() { Pattern = g1, Reflective = 0.9, Transparency = 0.8, RefractiveIndex = 1.0022, Ambient = 0.001, Diffuse = 0.1, Specular = 5.0, Shininess = 350, }, }; var group1 = new Group(); const int n = 16; for (var i = 0; i < n; i++) { var r = (2 * Math.PI / n) * i; var s = new Sphere(); var g = 0.5 + (i * 0.5 / n); var col = new Color(0.605, g, 0.869); s.Material = new Material() { // Color = new Color(0.605, 0.904, 0.869), Color = col, Diffuse = 0.9, Ambient = 0.1, Specular = 0.2, Shininess = 20, }; var offset = rng.NextDouble() * 2.0; s.Transform = Transform.RotateY(r) * Transform.Translate(0, 0, -5 + offset) * Transform.Scale(0.5, 0.5, 0.5); group1.Add(s); } group1.Transform = Transform.RotateX(Math.PI / 3) * Transform.RotateY(Math.PI / 1); var floor = new Plane(); floor.Material = new Material() { Color = new Color(1, 1, 1), Ambient = 1.0, Specular = 0, Diffuse = 0, }; floor.Transform = Transform.Translate(0, -100, 0); floor.Material = new Material() { Specular = 0, Pattern = new StripePattern( new Color(0.22, 0.22, 0.22), new Color(0.41, 0.41, 0.41)) { Transform = Transform.RotateY(Math.PI / 4) * Transform.Scale(10, 1, 1), }, }; world.Objects.Add(s0); world.Objects.Add(s00); world.Objects.Add(group1); world.Objects.Add(floor); world.Lights.Add(l1); // world.Lights.Add(l2); return(Tuple.Create(world, cam)); }
public Scene Build(int width, int height) { var camera = new Camera(width, height, 0.785) { Transform = Transform.View( Vector4.CreatePosition(-6, 6, -10), Vector4.CreatePosition(6, 0, 6), Vector4.CreateDirection(-0.45, 1, 0)), }; var light1 = new PointLight( Vector4.CreatePosition(50, 100, -50), new Color(1, 1, 1)); var light2 = new PointLight( Vector4.CreatePosition(-400, 50, -10), new Color(0.2, 0.2, 0.2)); var whiteMaterial = new Material() { Color = new Color(0.8, 0.8, 0.8), Diffuse = 0.7, Ambient = 0.1, Specular = 0.0, Reflective = 0.1, }; var blueMaterial = whiteMaterial.Extend(m => { m.Color = new Color(0.537, 0.831, 0.914); }); var redMaterial = whiteMaterial.Extend(m => { m.Color = new Color(0.941, 0.322, 0.388); }); var purpleMaterial = whiteMaterial.Extend(m => { m.Color = new Color(0.373, 0.404, 0.550); }); var standardTransform = Matrix4x4.Identity .Translate(1, -1, 1) .Scale(0.5, 0.5, 0.5); var largeObject = standardTransform.Scale(3.5, 3.5, 3.5); var mediumObject = standardTransform.Scale(3, 3, 3); var smallObject = standardTransform.Scale(2, 2, 2); var plane = new Plane() { Material = new Material() { Color = new Color(1, 1, 1), Ambient = 1, Diffuse = 0, Specular = 0, }, Transform = Matrix4x4.Identity .RotateX(Math.PI / 2) .Translate(0, 0, 500), }; var sphere = new Sphere() { Material = new Material() { Color = new Color(0.373, 0.404, 0.550), Diffuse = 0.2, Ambient = 0.0, Specular = 1.0, Shininess = 200, Reflective = 0.7, Transparency = 0.5, RefractiveIndex = 1.5, }, Transform = largeObject, }; var cube1 = new Cube() { Material = whiteMaterial, Transform = mediumObject.Translate(4, 0, 0), }; var cube2 = new Cube() { Material = blueMaterial, Transform = largeObject.Translate(8.5, 1.5, -0.6), }; var cube3 = new Cube() { Material = redMaterial, Transform = largeObject.Translate(0, 0, 4), }; var cube4 = new Cube() { Material = whiteMaterial, Transform = smallObject.Translate(4, 0, 4), }; var cube5 = new Cube() { Material = purpleMaterial, Transform = mediumObject.Translate(7.5, 0.5, 4), }; var cube6 = new Cube() { Material = whiteMaterial, Transform = mediumObject.Translate(-0.25, 0.25, 8), }; var cube7 = new Cube() { Material = blueMaterial, Transform = largeObject.Translate(4, 1, 7.5), }; var cube8 = new Cube() { Material = redMaterial, Transform = mediumObject.Translate(10, 2, 7.5), }; var cube9 = new Cube() { Material = whiteMaterial, Transform = smallObject.Translate(8, 2, 12), }; var cube10 = new Cube() { Material = whiteMaterial, Transform = smallObject.Translate(20, 1, 9), }; var cube11 = new Cube() { Material = blueMaterial, Transform = largeObject.Translate(-0.5, -5, 0.25), }; var cube12 = new Cube() { Material = redMaterial, Transform = largeObject.Translate(4, -4, 0), }; var cube13 = new Cube() { Material = whiteMaterial, Transform = largeObject.Translate(8.5, -4, 0), }; var cube14 = new Cube() { Material = whiteMaterial, Transform = largeObject.Translate(0, -4, 4), }; var cube15 = new Cube() { Material = purpleMaterial, Transform = largeObject.Translate(-0.5, -4.5, 8), }; var cube16 = new Cube() { Material = whiteMaterial, Transform = largeObject.Translate(0, -8, 4), }; var cube17 = new Cube() { Material = whiteMaterial, Transform = largeObject.Translate(-0.5, -8.5, 8), }; var world = new World(); world.Objects.Add(plane); world.Objects.Add(sphere); world.Objects.Add(cube1); world.Objects.Add(cube2); world.Objects.Add(cube3); world.Objects.Add(cube4); world.Objects.Add(cube5); world.Objects.Add(cube6); world.Objects.Add(cube7); world.Objects.Add(cube8); world.Objects.Add(cube9); world.Objects.Add(cube10); world.Objects.Add(cube11); world.Objects.Add(cube12); world.Objects.Add(cube13); world.Objects.Add(cube14); world.Objects.Add(cube15); world.Objects.Add(cube16); world.Objects.Add(cube17); world.Lights.Add(light1); world.Lights.Add(light2); return(new Scene(world, camera)); }
public static Tuple <World, Camera> Example14(int width, int height) { var world = new World(); var art1 = CreateArtifact(new Color(1.0, 0.0, 0.0)); var art2 = CreateArtifact(new Color(0.0, 1.0, 0.0)); art2.Transform = Transform.Scale(0.7, 0.7, 0.7) * Transform.RotateZ(Math.PI / 5) * Transform.RotateX(Math.PI / 6); var art3 = CreateArtifact(new Color(0.0, 0.0, 1.0)); art3.Transform = Transform.Scale(0.5, 0.5, 0.5) * Transform.RotateZ(-Math.PI / 5) * Transform.RotateY(Math.PI / 6) * Transform.RotateX(Math.PI / 8); var art4 = CreateArtifact(new Color(1.0, 1.0, 0.0)); art4.Transform = Transform.Scale(0.3, 0.3, 0.3) * Transform.RotateZ(Math.PI / 5) * Transform.RotateX(Math.PI / 6); var art5 = CreateArtifact(new Color(0.0, 1.0, 1.0)); art5.Transform = Transform.Scale(0.2, 0.2, 0.2) * Transform.RotateZ(Math.PI / 3) * Transform.RotateY(Math.PI / 5); var art6 = CreateArtifact(new Color(1.0, 0.0, 1.0)); art6.Transform = Transform.Scale(0.14, 0.14, 0.14) * Transform.RotateZ(Math.PI / 5) * Transform.RotateX(Math.PI / 3); world.Objects.Add(art1); world.Objects.Add(art2); world.Objects.Add(art3); world.Objects.Add(art4); world.Objects.Add(art5); world.Objects.Add(art6); var l1 = new PointLight( Vector4.CreatePosition(5, 10, 10), new Color(0.7, 0.7, 0.7)); var l2 = new PointLight( Vector4.CreatePosition(-3, 10, 10), new Color(0.7, 0.7, 0.7)); world.Lights.Add(l1); world.Lights.Add(l2); var camera = new Camera(width, height, Math.PI / 4.5) { Transform = Transform.View( Vector4.CreatePosition(1, 2.5, -5), Vector4.CreatePosition(0, 0.0, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public static Tuple <World, Camera> Example13(int width, int height) { var world = new World(); var yellow = new Material { Color = new Color(0.8, 0.8, 0.05), }; var col1 = new Material { Color = new Color(0.2, 0.4, 0.65), }; var col2 = new Material { Color = new Color(0.1, 0.45, 0.55), }; var cyl1 = new Cylinder() { Minimum = -1, Maximum = 1, IsClosed = true, Transform = Transform.Scale(0.5, 1, 0.5), Material = yellow, }; var cyl2 = new Cylinder() { Minimum = -1, Maximum = 1, IsClosed = true, Transform = Transform.RotateZ(Math.PI / 2) * Transform.Scale(0.5, 1, 0.5), Material = yellow, }; var cyl3 = new Cylinder() { Minimum = -1, Maximum = 1, IsClosed = true, Transform = Transform.RotateX(Math.PI / 2) * Transform.Scale(0.5, 1, 0.5), Material = yellow, }; var union1 = new Csg(Operation.Union, cyl1, cyl2); var union2 = new Csg(Operation.Union, union1, cyl3) { Transform = Transform.Scale(1.2, 1.2, 1.2), }; var sphere1 = new Sphere() { // Transform = Transform.Scale(Math.Sqrt(2), Math.Sqrt(2), Math.Sqrt(2)), Transform = Transform.Scale(1.4, 1.4, 1.4), Material = col1, }; var cube1 = new Cube() { Material = col2, }; var intersec1 = new Csg(Operation.Intersect, cube1, sphere1); var diff1 = new Csg(Operation.Difference, intersec1, union2); world.Objects.Add(diff1); var light = new PointLight( Vector4.CreatePosition(10, 10, -10), Color.White); world.Lights.Add(light); var camera = new Camera(width, height, Math.PI / 4.8) { Transform = Transform.View( Vector4.CreatePosition(3.5, 3.5, -5), Vector4.CreatePosition(0, 0.0, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
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)); }
public static World Example3() { var world = new World(); var ringPattern1 = new RingPattern( new Color(0.4, 0.4, 0.4), new Color(0.7, 0.7, 0.7)) { Transform = Transform.Scale(4, 4, 4), }; var stripePattern1 = new StripePattern( new Color(0.2, 0.2, 0.2), new Color(0.5, 0.5, 1.0)) { Transform = Transform.Scale(0.1, 0.1, 0.1), }; var checkers = new CheckersPattern( Color.White, Color.Black) { Transform = Transform.Scale(1, 1, 1), }; var nestedPattern = new NestedPattern( checkers, ringPattern1, stripePattern1); var pertubedPattern = new PertubedPattern( new SolidPattern(Color.Black), new SolidPattern(new Color(0.1, 0.2, 0.3))) { Transform = Transform.Scale(5.5, 5.5, 5.5), }; var floor = new Plane { Material = new Material { Pattern = pertubedPattern, Specular = 0, }, }; world.Objects.Add(floor); var gradientTransform = Transform.Translate(1, 0, 0) * Transform.Scale(2, 1, 1); var sphere = new Sphere { Transform = Transform.Translate(0, 1, 0), Material = new Material { Pattern = new GradientPattern( new Color(1.0, 0.0, 0.0), new Color(0.0, 0.0, 1.0)) { Transform = gradientTransform, }, }, }; world.Objects.Add(sphere); var gradients = new[] { new GradientPattern( new Color(1.0, 0.0, 0.0), new Color(0.0, 0.0, 1.0)) { Transform = gradientTransform, }, new GradientPattern( new Color(1.0, 0.0, 0.0), new Color(0.0, 1.0, 0.0)) { Transform = gradientTransform, }, new GradientPattern( new Color(0.0, 1.0, 0.0), new Color(0.0, 0.0, 1.0)) { Transform = gradientTransform, }, new GradientPattern( new Color(0.5, 0.5, 0.0), new Color(0.0, 0.5, 0.5)) { Transform = gradientTransform, }, new GradientPattern( new Color(0.5, 0.0, 0.5), new Color(0.0, 1.0, 0.0)) { Transform = gradientTransform, }, }; const int n = 1024; var arc = 2 * Math.PI / n; for (var i = 0; i < n; i++) { const double r = 0.15; var gi = i % gradients.Length; var ni = (double)i / n; const double scatter = 15; var q = scatter * Rng.NextDouble(); var s = new Sphere { Transform = Transform.RotateY(i * arc) * Transform.Translate(0, r, 2 - r + q) * Transform.Scale(r, r, r), Material = new Material { Pattern = gradients[gi], }, }; world.Objects.Add(s); } var light = new PointLight( Vector4.CreatePosition(-10, 10, -10), Color.White); world.Lights.Add(light); return(world); }
public static Tuple <World, Camera> Example10(int width, int height) { var world = new World(); var floor = new Plane { Material = new Material { Specular = 0, Ambient = 0.1, Color = new Color(0.05, 0.4, 0.2), }, }; world.Objects.Add(floor); var cone = new Cone() { Material = new Material() { Color = new Color(0.8, 0.2, 0.2), Specular = 0, }, Minimum = -1, Maximum = 0, IsClosed = true, Transform = Transform.RotateX(Math.PI / 2) * Transform.Translate(0, 1, 0), }; var cyl = new Cylinder { Material = new Material { Color = new Color(0.8, 0.2, 0.2), Specular = 0, }, Minimum = 0, Maximum = 1, IsClosed = true, }; world.Objects.Add(cone); var light = new PointLight(Vector4.CreatePosition(-2, 2, -5), Color.White); world.Lights.Add(light); var camera = new Camera(width, height, Math.PI / 3) { Transform = Transform.View( Vector4.CreatePosition(0, 3, -3), Vector4.CreatePosition(0, 0.5, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public override BoundingBox GetBounds() => new BoundingBox( Vector4.CreatePosition(-1, -1, -1), Vector4.CreatePosition(1, 1, 1));
public Scene Build(int width, int height) { var camera = new Camera(width, height, 1.152) { Transform = Transform.View( Vector4.CreatePosition(-2.6, 1.5, -3.9), Vector4.CreatePosition(-0.6, 1, -0.8), Vector4.CreateDirection(0, 1, 0)), }; var light = new PointLight( Vector4.CreatePosition(-4.9, 4.9, -1), Color.White); var wallMaterial = new Material() { Pattern = new StripePattern( new Color(0.45, 0.45, 0.45), new Color(0.55, 0.55, 0.55)) { Transform = Matrix4x4.Identity .Scale(0.25, 0.25, 0.25) .RotateY(1.5708), }, Ambient = 0, Diffuse = 0.4, Specular = 0, Reflective = 0.3, }; var floor = new Plane() { Transform = Matrix4x4.Identity .RotateY(0.31415), Material = new Material() { Pattern = new CheckersPattern( new Color(0.35, 0.35, 0.35), new Color(0.65, 0.65, 0.65)) { }, Specular = 0, Reflective = 0.4, }, }; var ceiling = new Plane() { Transform = Transform.Translate(0, 5, 0), Material = new Material() { Color = new Color(0.8, 0.8, 0.8), Ambient = 0.3, Specular = 0, }, }; var westWall = new Plane() { Transform = Matrix4x4.Identity .RotateY(1.5708) .RotateZ(1.5708) .Translate(-5, 0, 0), Material = wallMaterial, }; var eastWall = new Plane() { Transform = Matrix4x4.Identity .RotateY(1.5708) .RotateZ(1.5708) .Translate(5, 0, 0), Material = wallMaterial, }; var northWall = new Plane() { Transform = Matrix4x4.Identity .RotateX(1.5708) .Translate(0, 0, 5), Material = wallMaterial, }; var southWall = new Plane() { Transform = Matrix4x4.Identity .RotateX(1.5708) .Translate(0, 0, -5), Material = wallMaterial, }; var s1 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.4, 0.4, 0.4) .Translate(4.6, 0.4, 1), Material = new Material() { Color = new Color(0.8, 0.5, 0.3), Shininess = 50, }, }; var s2 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.3, 0.3, 0.3) .Translate(4.7, 0.3, 0.4), Material = new Material() { Color = new Color(0.9, 0.4, 0.5), Shininess = 50, }, }; var s3 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.5, 0.5, 0.5) .Translate(-1, 0.5, 4.5), Material = new Material() { Color = new Color(0.4, 0.9, 0.6), Shininess = 50, }, }; var s4 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.3, 0.3, 0.3) .Translate(-1.7, 0.3, 4.7), Material = new Material() { Color = new Color(0.4, 0.6, 0.9), Shininess = 50, }, }; var redSphere = new Sphere() { Transform = Matrix4x4.Identity .Translate(-0.6, 1, 0.6), Material = new Material() { Color = new Color(1, 0.3, 0.2), Specular = 0.4, Shininess = 5, }, }; var blueGlassSphere = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.7, 0.7, 0.7) .Translate(0.6, 0.7, -0.6), Material = new Material() { Color = new Color(0, 0, 0.2), Ambient = 0, Diffuse = 0.4, Specular = 0.9, Shininess = 300, Reflective = 0.9, Transparency = 0.9, RefractiveIndex = 1.5, }, }; var greenGlassSphere = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.5, 0.5, 0.5) .Translate(-0.7, 0.5, -0.8), Material = new Material() { Color = new Color(0, 0.2, 0), Ambient = 0, Diffuse = 0.4, Specular = 0.9, Shininess = 300, Reflective = 0.9, Transparency = 0.9, RefractiveIndex = 1.5, }, }; var world = new World(); world.Objects = new Shape[] { floor, ceiling, westWall, eastWall, northWall, southWall, s1, s2, s3, s4, redSphere, blueGlassSphere, greenGlassSphere, }; world.Lights = new[] { light }; return(new Scene(world, camera)); }
public static World Example4() { var world = new World(); var plane = new Plane { Material = new Material { Specular = 0, Pattern = new CheckersPattern(Color.White, Color.Black) { Transform = Transform.Scale(2, 2, 2), }, }, }; world.Objects.Add(plane); var sphere = new Sphere { Transform = Transform.Translate(0, 1, 0), Material = new Material { Color = new Color(0.1, 0.4, 0.5), Reflective = 0.6, Specular = 0.95, Shininess = 300, }, }; world.Objects.Add(sphere); const int n = 16; var arc = 2 * Math.PI / n; for (var i = 0; i < n; i++) { var s = new Sphere { Transform = Transform.RotateY(i * arc) * Transform.Translate(0, 0.2, 1.5) * Transform.Scale(0.2, 0.2, 0.2), Material = new Material { Color = new Color(0.57, 0.1, 0.2), Reflective = 0.4, }, }; world.Objects.Add(s); } var light = new PointLight(Vector4.CreatePosition(-10, 10, -10), Color.White); world.Lights.Add(light); return(world); }
public static World Example5() { var world = new World(); var w0 = new Plane { Material = new Material { Specular = 0, Pattern = new CheckersPattern(Color.White, Color.Black) { Transform = Transform.Scale(0.5, 0.5, 0.5), }, }, }; world.Objects.Add(w0); var w1 = new Plane { Material = w0.Material, Transform = Transform.Translate(0, 0, 6) * Transform.RotateX(-Math.PI / 2), }; world.Objects.Add(w1); var w2 = new Plane { Material = w0.Material, Transform = Transform.Translate(-6, 0, 0) * Transform.RotateZ(-Math.PI / 2), }; world.Objects.Add(w2); var w3 = new Plane { Material = w0.Material, Transform = Transform.Translate(6, 0, 0) * Transform.RotateZ(Math.PI / 2), }; world.Objects.Add(w3); var w4 = new Plane { Material = w0.Material, Transform = Transform.Translate(0, 0, -6) * Transform.RotateX(Math.PI / 2), }; world.Objects.Add(w4); var w5 = new Plane { Material = w0.Material, Transform = Transform.Translate(0, 6, 0) * Transform.RotateZ(-Math.PI), }; world.Objects.Add(w5); var sphere = new Sphere { Transform = Transform.Translate(0, 1, 0), Material = new Material { // Color = new Color(0.1, 0.2, 0.3), Ambient = 0.0, Diffuse = 0.0, Transparency = 0.3, // RefractiveIndex = 1.000029, // air // RefractiveIndex = 1.333, // water RefractiveIndex = 1.52, // glass Reflective = 0.9, Specular = 0.9, Shininess = 300, }, }; world.Objects.Add(sphere); const int n = 8; var arc = 2 * Math.PI / n; for (var i = 0; i < n; i++) { var s = new Sphere { Transform = Transform.RotateY(i * arc) * Transform.Translate(0, 0.5, 1.75) * Transform.Scale(0.4, 0.4, 0.4), Material = new Material { Color = new Color(0.1, 0.6, 0.7), Reflective = 0.1, Ambient = 0.05, Diffuse = 0.8, Specular = 1.0, Shininess = 300, }, }; world.Objects.Add(s); } var l1 = new PointLight(Vector4.CreatePosition(-1, 4, 1), Color.White); world.Lights.Add(l1); return(world); }
public static Tuple <World, Camera> Example6(int width, int height) { var world = new World(); var floor = new Plane { Material = new Material { // Color = new Color(0.05, 0.35, 0.1), Pattern = new CheckersPattern( new Color(0.1, 0.55, 0.2), new Color(0.1, 0.65, 0.3)) { Transform = Transform.Scale(0.6, 0.6, 0.6), }, Specular = 0, }, }; world.Objects.Add(floor); var c0 = new Cube { Transform = Transform.Translate(0, 0.7, 0) * Transform.Scale(0.7, 0.7001, 0.7), Material = new Material { Color = new Color(0.2, 0.5, 0.85), Specular = 1.0, Shininess = 300, Reflective = 1.0, Ambient = 0.1, Diffuse = 0.2, Transparency = 0.0, RefractiveIndex = 1.00052, }, }; world.Objects.Add(c0); var c1 = new Cube { Transform = Transform.Translate(0.7, 0.2, -1.4) * Transform.Scale(0.2, 0.2, 0.2) * Transform.RotateY(Math.PI / 5), Material = new Material { Pattern = new StripePattern( new Color(0.1, 0.3, 0.4), new Color(0.1, 0.6, 0.8)) { Transform = Transform.Scale(0.25, 1, 1) * Transform.RotateZ(Math.PI / 3), }, }, }; world.Objects.Add(c1); var c2 = new Cube { Material = new Material { Color = new Color(0.8, 0.2, 0.8), }, Transform = Transform.Translate(-0.1, 0.1, -1.5) * Transform.Scale(0.1, 0.1, 0.1) * Transform.RotateY(-Math.PI / 4.2), }; world.Objects.Add(c2); var c3 = new Cube { Material = new Material { Pattern = new StripePattern( new Color(0.2, 0.9, 0.8), new Color(0.2, 0.4, 0.4)) { Transform = Transform.Scale(0.23, 1, 1) * Transform.RotateZ(-Math.PI * 0.7), }, }, Transform = Transform.Translate(-0.2, 0.4, 2.0) * Transform.Scale(0.4, 0.4, 0.4) * Transform.RotateY(Math.PI / 4.6), }; world.Objects.Add(c3); var light = new PointLight( Vector4.CreatePosition(-10, 8, 1), Color.White); world.Lights.Add(light); var camera = new Camera(width, height, Math.PI / 3.3) { Transform = Transform.View( Vector4.CreatePosition(-3.25, 2.2, -4.2), Vector4.CreatePosition(0, 0.3, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, camera)); }
public Scene Build(int width, int height) { var camera = new Camera(width, height, 0.7854) { Transform = Transform.View( Vector4.CreatePosition(-3, 1, 2.5), Vector4.CreatePosition(0, 0.5, 0), Vector4.CreateDirection(0, 1, 0)), }; var light = new AreaLight( Vector4.CreatePosition(-1, 2, 4), Vector4.CreateDirection(2, 0, 0), 10, Vector4.CreateDirection(0, 2, 0), 10, new Color(1.5, 1.5, 1.5)) { Jitter = new RandomSequence(), }; var cube = new Cube() { Material = new Material() { Color = new Color(1.5, 1.5, 1.5), Ambient = 1, Diffuse = 0, Specular = 0, }, Transform = Matrix4x4.Identity .Scale(1, 1, 0.01) .Translate(0, 3, 4), Shadow = false, }; var plane = new Plane() { Material = new Material() { Color = new Color(1, 1, 1), Ambient = 0.025, Diffuse = 0.67, Specular = 0, }, }; var sphere1 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.5, 0.5, 0.5) .Translate(0.5, 0.5, 0), Material = new Material() { Color = new Color(1, 0, 0), Ambient = 0.1, Specular = 0, Diffuse = 0.6, Reflective = 0.3, }, }; var sphere2 = new Sphere() { Transform = Matrix4x4.Identity .Scale(0.33, 0.33, 0.33) .Translate(-0.25, 0.33, 0), Material = new Material() { Color = new Color(0.5, 0.5, 1), Ambient = 0.1, Specular = 0, Diffuse = 0.6, Reflective = 0.3, }, }; var world = new World() { Objects = new Shape[] { cube, plane, sphere1, sphere2 }, Lights = new ILight[] { light, }, }; return(new Scene(world, camera)); }
public static Tuple <World, Camera> Create(int width, int height) { // var pat1 = new TestPattern1() // { // Transform = Matrix4x4.Identity * // Transform.Scale(2.1, 1, 1.7) * // Transform.RotateY(Math.PI / 4), // }; var floor = new Plane() { Material = new Material() { Color = new Color(0.5, 0.5, 0.5), Specular = 0, Diffuse = 0.8, Ambient = 0.2, }, }; var s1 = new Sphere() { Material = new Material() { Color = new Color(0.1, 0.4, 0.72), Reflective = 0.6, Diffuse = 0.3, Specular = 0.95, Shininess = 300, }, Transform = Matrix4x4.Identity * Transform.Scale(0.5, 0.5, 0.5) * Transform.Translate(0, 1, 0), }; var s2 = new Sphere() { Material = new Material() { Color = new Color(0.9, 0.9, 0.1), Reflective = 0.4, Diffuse = 0.4, Specular = 0.96, Shininess = 300, }, Transform = Matrix4x4.Identity * Transform.Scale(0.3, 0.3, 0.3) * Transform.Translate(0, 1, -2.5), }; var s3 = new Sphere() { Material = new Material() { Color = new Color(0.72, 0.11, 0.32), }, Transform = Matrix4x4.Identity * Transform.Scale(0.5, 0.5, 0.5) * Transform.Translate(0, 1, -4), }; var l1 = new PointLight( Vector4.CreatePosition(-100, 40, -20), new Color(1, 1, 1)); var world = new World(); world.Objects.Add(floor); world.Objects.Add(s1); world.Objects.Add(s2); world.Objects.Add(s3); world.Lights.Add(l1); var cam = new Camera(width, height, Math.PI / 4) { Transform = Transform.View( Vector4.CreatePosition(0, 2, -3), Vector4.CreatePosition(0, 0, 0), Vector4.CreateDirection(0, 1, 0)), ProgressMonitorFactory = (_rows, _cols) => new DefaultProgressMonitor(), }; return(Tuple.Create(world, cam)); }