Пример #1
0
        public void render(Interval interval)
        {
            // Screen variables
            int[] row = new int[interval.width * (interval.yto - interval.yfrom)];
            int pixCounter = 0; //iterator

            // Rendering variables
            int x, y, red, green, blue;
            double xlen, ylen;
            Vec viewVec;

            viewVec = Vec.sub(view.at, view.from);

            viewVec.normalize();

            Vec tmpVec = new Vec(viewVec);
            tmpVec.scale(Vec.dot(view.up, viewVec));

            Vec upVec = Vec.sub(view.up, tmpVec);
            upVec.normalize();

            Vec leftVec = Vec.cross(view.up, viewVec);
            leftVec.normalize();

            double frustrumwidth = view.dist * Math.Tan(view.angle);

            upVec.scale(-frustrumwidth);
            leftVec.scale(view.aspect * frustrumwidth);

            Ray r = new Ray(view.from, voidVec);
            Vec col = new Vec();

            // Header for .ppm file
            // System.out.println("P3");
            // System.out.println(width + " " + height);
            // System.out.println("255");

            // All loops are reversed for 'speedup' (cf. thinking in java p331)

            // For each line
            for (y = interval.yfrom; y < interval.yto; y++)
            {
                ylen = (double)(2.0 * y) / (double)interval.width - 1.0;
                // System.out.println("Doing line " + y);
                // For each pixel of the line
                for (x = 0; x < interval.width; x++)
                {
                    xlen = (double)(2.0 * x) / (double)interval.width - 1.0;
                    r.D = Vec.comb(xlen, leftVec, ylen, upVec);
                    r.D.add(viewVec);
                    r.D.normalize();
                    col = trace(0, 1.0, r);

                    // computes the color of the ray
                    red = (int)(col.x * 255.0);
                    if (red > 255)
                        red = 255;
                    green = (int)(col.y * 255.0);
                    if (green > 255)
                        green = 255;
                    blue = (int)(col.z * 255.0);
                    if (blue > 255)
                        blue = 255;

                    checksum += red;
                    checksum += green;
                    checksum += blue;

                    // RGB values for .ppm file
                    // System.out.println(red + " " + green + " " + blue);
                    // Sets the pixels
                    row[pixCounter++] = alpha | (red << 16) | (green << 8) | (blue);
                } // end for (x)
            } // end for (y)
        }
Пример #2
0
        public static void Main()
        {
            RayTracer rt = new RayTracer();

            // create the objects to be rendered
            rt.scene = rt.createScene();

            // get lights, objects etc. from scene.
            rt.setScene(rt.scene);

            // Set interval to be rendered to the whole picture
            // (overkill, but will be useful to retain this for parallel versions)
            Interval interval = new Interval(0, rt.width, rt.height, 0, rt.height, 1);

            // Do the business!
            rt.render(interval);
        }