static void Main(string [] args) { Scene scene = new Scene(); Sphere sphere = new Sphere(2, new double3(0, 0, 10)); scene.Objects.Add(sphere); EyeBasedRayTracer tracer = new EyeBasedRayTracer(); tracer.Scene = scene; tracer.ViewportSize = new IntSize(100, 100); tracer.Camera = new Camera(); tracer.Render(); }
private void Window_Loaded(object sender, RoutedEventArgs e) { scene = new Scene(); scene.AmbientColor = double3.Zero; sphere1Center = new double3(-3, 0, 10); sphere1 = new Sphere(2, sphere1Center); //sphere1.Material = refractiveDispersiveMaterial; //sphere1.Material = new DebugMaterial (); //sphere1.Material = new MappedMaterial ( Texture2d.Load ( @"C:\media\images\Wallpaper\Текстуры\Minerals\AZURITE2.JPG" ), FilteringType.Nearest ); //sphere1.Material = new MappedMaterial ( Texture2d.Load ( @"C:\media\images\earth2.png" ), TextureWrap.Clamp ); sphere1.Material = RefractiveDispersiveMaterial.Diamond(); //sphere1.Material = new RefractiveDispersiveMaterial ( RefractionIndex.Water ( Light.RedWavelength ), // RefractionIndex.Water ( Light.GreenWavelength ), RefractionIndex.Water ( Light.BlueWavelength ), 0.9 ); //sphere1.Material = new RefractiveDispersiveMaterial ( new RefractionIndex ( 1.1 ), // new RefractionIndex ( 1.5 ), new RefractionIndex ( 2 ) ); //sphere2 = new Sphere ( 2, new double3 ( 2, 2, 12 ) ); //sphere2.Material = reflectiveMaterial; scene.Objects.Add(sphere1); //scene.Objects.Add ( sphere2 ); //scene.Objects.Add ( sphere3 ); // Lens test Sphere backSphere = new Sphere(2, new double3(-3, 0, 15)); backSphere.Material = reflectiveMaterial; CsgObject convexConcaveLens = new CsgObject(CsgOp.Subtract, new Sphere(2, new double3(0, 0, 7)), new Sphere(6.5, new double3(0, 0, 12)) ); convexConcaveLens.Material = new RefractiveMaterial(1, 1.7); CsgObject concaveConvexLens = new CsgObject(CsgOp.Subtract, new Sphere(2, new double3(0, 0, 7)), new Sphere(6.5, new double3(0, 0, 2)) ); concaveConvexLens.Material = new RefractiveMaterial(1, 1.7); //scene.Objects.Add ( backSphere ); //scene.Objects.Add ( convexConcaveLens ); //scene.Objects.Add ( concaveConvexLens ); // Csg Subtraction test //sphere1 = new Sphere ( 2, sphere1Center ); //sphere2 = new Sphere ( 2, sphere1Center + double3.UnitX * 2 ); //Sphere sphere3 = new Sphere ( 2, sphere1Center - double3.UnitZ * 3 ); //CsgObject csgObj = new CsgObject ( CsgOp.Subtract, sphere1, sphere2, sphere3 ); //csgObj.Material = new PhongEnvironmentMaterial ( Colors.Orange.ToDouble3 () ); //scene.Objects.Add ( csgObj ); // Csg Intersection test //sphere1 = new Sphere ( 2, sphere1Center ); //sphere2 = new Sphere ( 2, sphere1Center + double3.UnitX * 1 ); //Sphere sphere3 = new Sphere ( 2, sphere1Center + double3.UnitY * 2 ); //CsgObject csgObj = new CsgObject ( CsgOp.Intersect, sphere1, sphere2, sphere3 ); //csgObj.Material = new PhongEnvironmentMaterial ( Colors.Orange.ToDouble3 () ); //scene.Objects.Add ( csgObj ); // Csg Subtraction and Intersection test //sphere1 = new Sphere ( 1.5, sphere1Center - double3.UnitX * 0.75 ); //sphere2 = new Sphere ( 1.5, sphere1Center + double3.UnitX * 0.75 ); //CsgObject csgObjIsec = new CsgObject ( CsgOp.Intersect, sphere1, sphere2 ); ////csgObjIsec.Material = new PhongEnvironmentMaterial ( Colors.Orange.ToDouble3 () ); ////scene.Objects.Add ( csgObjIsec ); //Sphere sphere3 = new Sphere ( 2, sphere1Center + double3.UnitZ ); //CsgObject csgObjSub = new CsgObject ( CsgOp.Subtract, sphere3, csgObjIsec ); //csgObjSub.Material = new PhongEnvironmentMaterial ( Colors.Orange.ToDouble3 () ); //scene.Objects.Add ( csgObjSub ); // Csg Union test //sphere1 = new Sphere ( 2, sphere1Center ); //sphere2 = new Sphere ( 2, sphere1Center + double3.UnitX * 2 ); //CsgObject csgObjUnion = new CsgObject ( CsgOp.Union, sphere1, sphere2 ); //csgObjUnion.Material = new PhongEnvironmentMaterial ( Colors.Violet.ToDouble3 () ); //scene.Objects.Add ( csgObjUnion ); // Csg Subtract Unions test //sphere1 = new Sphere ( 2, sphere1Center ); //sphere2 = new Sphere ( 2, sphere1Center + double3.UnitX * 2 ); //CsgObject csgObjUnion1 = new CsgObject ( CsgOp.Union, sphere1, sphere2 ); //Sphere sphere3 = new Sphere ( 2, sphere1Center + double3.UnitY * 1 - double3.UnitZ ); //Sphere sphere4 = new Sphere ( 2, sphere1Center + double3.UnitX * 2 + double3.UnitY * 1 - double3.UnitZ ); //CsgObject csgObjUnion2 = new CsgObject ( CsgOp.Union, sphere3, sphere4 ); //CsgObject csgObjSub = new CsgObject ( CsgOp.Subtract, csgObjUnion1, csgObjUnion2 ); //csgObjSub.Material = new PhongEnvironmentMaterial ( Colors.Violet.ToDouble3 () ); //scene.Objects.Add ( csgObjSub ); floor = new PlanarSurface(new double3(0, -2, 0), double3.UnitY); //floor = new PlanarSurface ( new double3 ( 0, -2, 0 ), new double3 ( 0.2, 1, -0.3 ).Normalized ); floor.Material = new DebugMaterial(); //floor.Material = new MappedMaterial ( Texture2d.Load ( @"C:\media\images\Wallpaper\Текстуры\Architectual\DIRTCHEK.JPG" ), TextureWrap.Repeat ); floor.Material = new PhongEnvironmentMaterial(); leftWall = new PlanarSurface(new double3(-10, 0, 0), double3.UnitX); //leftWall.Material = new CheckerMaterial (); //leftWall.Material = new PhongEnvironmentMaterial ( new double3 ( 1, 0, 0 ) ); leftWall.Material = new PhongMaterial(new double3(1, 0, 0)); rightWall = new PlanarSurface(new double3(10, 0, 0), -double3.UnitX); //rightWall.Material = new PhongEnvironmentMaterial ( new double3 ( 0, 0.27, 1 ) ); rightWall.Material = new PhongMaterial(new double3(0, 0.27, 1)); frontWall = new PlanarSurface(new double3(0, 0, 30), -double3.UnitZ); //frontWall.Material = new PhongEnvironmentMaterial ( new double3 ( 0.6, 0.27, 1 ) ); frontWall.Material = new PhongMaterial(new double3(0.6, 0.27, 1)); backWall = new PlanarSurface(new double3(0, 0, -60), double3.UnitZ); //backWall.Material = new PhongEnvironmentMaterial ( new double3 ( 0.6, 0.6, 0.27 ) ); backWall.Material = new PhongMaterial(new double3(0.6, 0.6, 0.27)); ceiling = new PlanarSurface(new double3(0, 10, 0), -double3.UnitY); //ceiling = new PlanarSurface ( new double3 ( 0, 10, 0 ), new double3 ( 0, -1, 0.02 ).Normalized ); //ceiling.Material = new CheckerMaterial (); //ceiling.Material = new PhongEnvironmentMaterial ( new double3 ( 0.27, 1, 0.27 ) ); ceiling.Material = new PhongMaterial(new double3(0.27, 1, 0.27)); scene.Objects.Add(floor); scene.Objects.Add(leftWall); scene.Objects.Add(rightWall); scene.Objects.Add(frontWall); scene.Objects.Add(backWall); scene.Objects.Add(ceiling); spotLight1 = new SpotLight(new double3(-2, 4, 0), new double3(1, 0.7, 0.3), new double3(1, 0.7, 0.3), 5); spotLight2 = new SpotLight(new double3(5, 3, 8), new double3(0.3, 0.7, 1), new double3(0.3, 0.7, 1), 5); scene.Lights.Add(spotLight1); scene.Lights.Add(spotLight2); camera = new Camera(new double3(0, 0, 3)); camera.Pos += double4.UnitZ * 9; //camera.Pos += double4.UnitZ * 5 - double4.UnitX * 8 - double4.UnitY * 1.5; //camera.View = new double3 ( -2, 0, 10 ) - camera.Pos; camera.View = sphere1Center - camera.Pos; //camera.FovY = 140; eyeBasedTracer = new EyeBasedRayTracer(); eyeBasedTracer.InitTraceData = new TraceData(10, 10); //eyeBasedTracer.ClearColor = double3.UnitY; eyeBasedTracer.Scene = scene; eyeBasedTracer.ViewportSize = new IntSize(400, 300); //eyeBasedTracer.ViewportSize = new IntSize ( 1024, 768 ); //eyeBasedTracer.ViewportSize = new IntSize ( 1920, 1080 ); eyeBasedTracer.Camera = camera; sectionTracer = new SectionRayTracer(); sectionTracer.Scene = scene; sectionTracer.ViewportSize = new IntSize(400, 300); //sectionTracer.ViewportSize = new IntSize ( 1024, 768 ); //sectionTracer.ViewportSize = new IntSize ( 1920, 1080 ); double side = 10; sectionTracer.SectionSize = new DoubleSize(side * sectionTracer.ViewportSize.width / sectionTracer.ViewportSize.height, side); sectionTracer.Camera = camera; //camera.FovY = 50; sectionTracer.NumRaysToDraw = 300; //sectionTracer.Orientation = SectionOrientation.Vertical; tracer = eyeBasedTracer; //tracer = sectionTracer; //tracer.MaxDegreeOfParallelism = 1; tracer.InitTraceData = new TraceData(30, 30); Render(); timer.Interval = TimeSpan.FromSeconds(2.5); timer.Tick += new EventHandler(timer_Tick); }