Пример #1
0
 public RayTracer()
 {
     this.image = new Bitmap(xResolution, yResolution);
     this.scene = createScene();
     this.scene.setResolution(xResolution, yResolution);
     this.scene.preprocess();
     this.core = new RT.Core(scene);
 }
Пример #2
0
        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");
        }
Пример #3
0
        public RT.Scene createScene()
        {
            float kd = 0.6f;
            float ka = 0.4f;
            int maxr = 15;

            RT.Scene scene = new RT.Scene();
            RT.Group world = new RT.Group();
            System.Random rand = new System.Random();
            for (int i = 0; i < 60; i++)
            {

                float x = (float)((i * 300) % (maxr * 1000)) / 1000;
                float y = (float)((i * 600) % (maxr * 1000)) / 1000;
                float z = (float)((i * 900) % (maxr * 1000)) / 3000;

                world.addObject(new RT.Sphere(
                   new RT.LambertianMaterial(new RT.Color(0.4f, 0.9f, 0.3f), kd, ka),
                   new RT.Point(-(float)maxr * 0.5f + x, -(float)maxr * 0.5f + y, z), 0.3f));

            }

            world.addObject(new RT.Plane(new RT.LambertianMaterial(
               new RT.Color(0.8f, 0.8f, 0.8f), kd, ka), new RT.Vector(0, 0, 1),
               new RT.Point(0, 0, -0.1f)));

            scene.setObject(world);

            scene.setBackground(new RT.ConstantBackground(
               new RT.Color(0.0f, 0.0f, 0.0f)));

            scene.setAmbient(new RT.Color(ka, ka, ka));

            scene.addLight(new RT.PointLight(new RT.Point(20, -30, 100),
               new RT.Color(0.9f, 0.9f, 0.9f)));

            scene.setCamera(new RT.PinholeCamera(new RT.Point(12, -12, 7),
               new RT.Point(1, 1, 2), new RT.Vector(0, 0, 1), 60));

            return scene;
        }