public Canvas Render(Camera camera) { RT.Canvas canvas = new RT.Canvas(camera.hSize, camera.vSize); canvas.FillCanvas(RT.Color.black); if (this.lights.Count == 0) { Console.WriteLine("No lights in scene, this will always produce a black image."); } //Precalculate the bounds PreCalculateBounds(); for (int y = 0; y < camera.vSize; y++) { for (int x = 0; x < camera.hSize; x++) { Console.WriteLine(x.ToString() + ',' + y.ToString()); Ray temp = this.RayForPixel(camera, x, y); Color pixelColor = this.ColorAt(temp); canvas.SetPixel(x, y, pixelColor); } } return(canvas); }
public static void Chapter5Challenge() { //Create an image of a sphere by only testing for hits or misses. RT.Mat4 transMatrix = new RT.Mat4(); RT.Scene scene = new RT.Scene(); //transMatrix = RT.Mat4.ScaleMatrix(1,0.5f,1); //transMatrix = RT.Mat4.ScaleMatrix(0.5f,1,1); //transMatrix = RT.Mat4.RotateMatrix(0.0f, 0.0f, RT.Constants.pi * 0.25f) * RT.Mat4.ScaleMatrix(1,0.5f,1); transMatrix = RT.Mat4.ShearMatrix(1, 0, 0, 0, 0, 0) * RT.Mat4.ScaleMatrix(0.5f, 1, 1); int resolution = 200; RT.Canvas canvas = new RT.Canvas(resolution, resolution); canvas.FillCanvas(RT.Color.black); RT.Sphere sphere = new RT.Sphere(); sphere.SetMatrix(transMatrix); RT.Point camera = new RT.Point(0, 0, -5); //Use the wall x and y as the width and height and the position of the wall as the z value RT.Point wall = new RT.Point(0.0f, 0.0f, 7f); double wallSize = 7.0f; //Camera is the start point, rays are created by taking iterating over the wall in resultion steps //vertically and horizontally, calc wall - camera to get direction of camera to wall location. //Check if the ray hits the sphere, if it does draw red if it does not draw black. for (int y = 0; y < resolution; y++) { for (int x = 0; x < resolution; x++) { //Need to start at half the width over from the walls origin and increment from there double increment = wallSize / resolution; RT.Vector currentWallPixel = wall - new RT.Point((wallSize * 0.5f) - x * increment, (wallSize * 0.5f) - y * increment, wall.z); //This presents a problem when I want to convert a point to a vector... RT.Point point = (currentWallPixel - camera); RT.Vector direction = new RT.Vector(point).Normalize(); RT.Ray ray = new RT.Ray(camera, direction); RT.Intersection hit = RT.Scene.current.Hit(scene.Intersections(ray)); if (hit != null) { canvas.SetPixel(x, y, RT.Color.red); } } } RT.Save.SaveCanvas(canvas, "Chapter5Challenge"); }
public Canvas DrawAABBs(Camera camera) { RT.Canvas canvas = new RT.Canvas(camera.hSize, camera.vSize); canvas.FillCanvas(RT.Color.black); if (this.lights.Count == 0) { Console.WriteLine("No lights in scene, this will always produce a black image."); } for (int y = 0; y < camera.vSize; y++) { for (int x = 0; x < camera.hSize; x++) { Console.WriteLine(x.ToString() + ',' + y.ToString()); Ray temp = this.RayForPixel(camera, x, y); Color pixelColor = this.CheckAABB(temp); //Blend the colors to allow for transparency among the cubes and layering canvas.SetPixel(x, y, canvas.GetPixel(x, y) + pixelColor); } } return(canvas); }