[comp.graphics] Ray Tracing News, volume 2, number 7 - REPOST

cnsy@vax5.CIT.CORNELL.EDU (11/21/89)

 _ __                 ______                         _ __
' )  )                  /                           ' )  )
 /--' __.  __  ,     --/ __  __.  _. o ____  _,      /  / _  , , , _
/  \_(_/|_/ (_/_    (_/ / (_(_/|_(__<_/ / <_(_)_    /  (_</_(_(_/_/_)_
             /                               /|
            '                               |/

			"Light Makes Right"

			October 13, 1989
		        Volume 2, Number 7

Compiled by Eric Haines, 3D/Eye Inc, 2359 Triphammer Rd, Ithaca, NY 14850
    NOTE ADDRESS CHANGE: wrath.cs.cornell.edu!eye!erich
    [distributed by Michael Cohen <m-cohen@cs.utah.edu>, but send
    contributions and subscriptions requests to Eric Haines]
All contents are US copyright (c) 1989 by the individual authors
Archive locations: anonymous FTP at cs.uoregon.edu (128.223.4.1) and at
		   freedom.graphics.cornell.edu (128.84.247.85), /pub/RTNews

Contents:
    Introduction
    New People and Address Changes
    Solid Surface Modeler Information, by Eric Haines
    Minimum Bounding Sphere Program, by Marshall Levine
    Parallelism & Modeler Info Request, by Brian Corrie
    ======== USENET cullings follow ========
    Ray Tracer Available, by Craig Kolb
    Source from Roy Hall's Book, by Tim O'Connor
    More on Texture Mapping by Spatial Position, by Paul Lalonde
    Procedural Bump-mapping Query, by Prem Subrahmanyam
    Ray Tracer Performance on Machines,
	by Gavin A. Bell, Phil Dykstra, Steve Lamont
    Projective Mapping Explanation, by Ken "Turk" Turkowski
    Intersection Calculation Problem Request, Jari Toivanen
    Mathematical Elements for Computer Graphics - Call for Errata,
	by David Rogers
    Raytracing on NCUBE Request, by Ping Kang Hsiung
    Intersection Between a Line and a Polygon (UNDECIDABLE??),
	by Dave Baraff, Tom Duff

-------------------------------------------------------------------------------

Introduction

    It's October, the time when the air turns chilly, the leaves turn red, and
people's minds turn towards releasing a public domain version of their ray
tracer.  Holy smokes there's a lot of them coming out lately!  This month
Craig Kolb's ray tracer has become available, along with the first PD ray
tracer from Australia, by David Hook.  Paul Lalonde mentions that his will be
coming out soon, and will include spline surfaces.  Also, David Kirk and Jim
Arvo have created a ray tracer which they used in their workshop in Australia,
and which may be released to the general public soon.  Other code that has
been made available is that printed in Roy Hall's _Illumination and Color in
Computer Generated Imagery_ book.

    Next month I hope to collect various timing information from all sorts of
ray tracers on all sorts of machines.  I hope to do a "trace-off" sometime
soon, comparing MTV's, Craig's, DBW, QRT, ART, mine, and any others I can get
up and running.  If anyone else has any timings or observations on performance 
of ray tracers and various machines, please send them to me.

-------------------------------------------------------------------------------

New People and Address Changes


David Hook
dgh@munnari.OZ.AU

Dept. Of Engineering Computer Resources
University Of Melbourne
Parkville, Vic, 3052
Australia

G'day.

Our major area of interest in ray tracing is CSG modeling and we have a
locally developed ray tracer which is a step towards this, as a department we
are also involved with the Faculty of Architecture at this University, so we
are starting to look at special effects somewhat more seriously than before.
This has also led to a greater interest in acceleration techniques.

Personally, I am currently doing a masters degree in the area of CSG and ways
of introducing patches into the model.  The rendering technique being used is
ray tracing.


[And a further note from David Hook:]

The mailing list has been set up on munnari, so if you send it to
rtnews@munnari.OZ.AU, it will (should) travel around Oz to the people who want
it.  I am asking people who subscribe if they wish to be on the contact list,
etc...

As a bit of additional info, I have written a ray-tracer which does CSG and
renders algebraic surfaces, (ala Pat Hanrahan), although in this case it's
built around Sturm Sequences and we occasionally use CSG to take
cross-sections of the surfaces.  The interest in algebraic surfaces began
because a friend of mine was struggling with a 6th order surface known as the
Hunt Surface, getting a good feel for the cusps on it was turning out to be
awful using polygonal subdivision.  In any case there is a public domain
version of all this sitting in pub on munnari.OZ.AU (128.250.1.21) which can
be got by anonymous ftp.  The file is vort.tar.Z.  Knowing a bit more about
the whole business now, it's a bit of an embarrassment!  Still it may be of
interest to someone and constructive criticism is always welcome.


[From a README file in his ray tracing distribution:]

By the by, for people who are interested, there are an excellent series of
papers on ray tracing and computer graphics in general published in the NATO
ASI Series of books.  The volume in question is in Vol.  40, series F, and is
titled "Theoretical Foundations of Computer Graphics and CAD".  It was
published in 1988 Springer-Verlag.  Roman Kuchkuda's paper in it "An
Introduction To Ray Tracing", would be the best introductory paper we have
seen to date.  Apart from that it was the first paper we found that actually
said what a superquadric was!

--------

NAME:   Hench, Stephen D.              SNAIL MAIL: 2621-C Stewart Drive
E MAIL: hench@csclea.ncsu.edu                      Raleigh, NC  27603

BRIEF: Undergrad in Mathematics and Computer Science at NCSU.
       Interested in ray tracing (would I want to subscribe 
       if I wasn't?), radiosity, and rendering in general.

--------

Marshall Levine
136 1937 Hall  Wilson College
Princeton University
Princeton, NJ 08544
(609) 734-6061

Home:
Marshall Levine
5212 Louise Avenue
Encino, California 91316
(818) 995-6528
(818) 906-7068

E-mail:
(1)  mplevine@phoenix.princeton.edu  or:
(2)  mplevine@gauguin.princeton.edu   or:
(3)  mplevine@bogey.princeton.edu

My main interests are helicopters and computer graphics.  Within graphics, I
am interested in animation and motion control.  While I think it is great to
see a ray-traced magnifying glass sitting on top of a cicuit board, I would
rather see the magnifying glass fly smoothly over a spinning board while the
camera flies smoothly through the scene.  I am currently designing a flexible
graphics language with a friend of mine, Chris Williams (Princeton U. '92).
If anyone is interested, I can say more about that later.

--------

Cornell Program of Computer Graphics

A ray tracing mailing list has been set up by Tim O'Connor:

	ray-tracing-news@wisdom.graphics.cornell.edu

	Program of Computer Graphics
	120 Rand Hall
	Cornell University
	Ithaca, NY 14853

People on this list who've already been intro'ed here include: Roy Hall,
Mark Reichert, Ben Trumbore, and Tim O'Connor.

New people and brief bio sketches:

Wash Wawrzynek - paw@squid.graphics.cornell.edu

Current interest are user interfaces and visualization for computational
mechanics.

--------

Len Wanger - lrw@freedom.graphics.cornell.edu

My sketch is on a piece of paper, but my interests are:  I am a graduate
student in the department of computer graphics at Cornell University.  I am
interested in modeling and visual perception.

--------

Filippo Tampieri - fxt@freedom.graphics.cornell.edu

Areas of interest:  parallel/distributed ray tracing, fast algorithms for ray
tracing.

--------

Ricardo Pomeranz - rxp@venus.graphics.cornell.edu

Interests: constructive solid geometry and rendering

--------

Paul Wanuga - phw@neptune.graphics.cornell.edu

Masters student at Cornell's Computer Graphics Lab.  Interests - rendering
realistic complex environments in realistic times.

--------

Kathy Kershaw - kershaw@hope.graphics.cornell.edu

I'm Kathy Kershaw.  I did the ray tracing thing once.  Maybe it'll have
something to do w/ my master's thesis; maybe not.

--------

Colin Summers - colin@scarpa.graphics.cornell.edu

Just recently interested in computer graphics and heading into the abyss from
the architecture side, I have a background in personal computers and spent a
year out of the design studio to computer consult in Manhattan.  Glad to be
back in the world of academia.  As soon as someone comes across with a
Macintosh like text processor for xWindows, let me know.

--------

Ted Himlan - thh@squid.Graphics.Cornell.EDU

Color science, radiometric measurement, array camera.
interest:  detailed measurements on an environment 
	 for comparison to simulation.

--------

Julie O'Brien Dorsey - job@hope.graphics.cornell.edu

Computer aided design applications, radiosity, lighting design

--------

Francois Sillion - fxs@bruno.graphics.cornell.edu

I am currently on a Post-Doc position at Cornell, after having completed my
PhD at the 'Ecole Normale Superieure' in Paris, France, where my work included
the development of a two-pass method for lighting calculations, combining ray
tracing and radiosity.

My interests are illumination models (local and global), animation and
interactivity.

-------------------------------------------------------------------------------

Solid Surface Modeler Information, by Eric Haines

The Solid Surface Modeler from NASA finally came out.  The disappointing news
is that even though it's "a non-profit unit of the University of Georgia," the
thing is priced at $1250 for a cartridge tape and documentation (which is $43
separately).  The reason I mention it is this newsletter is that it was used
for some rather elaborate databases that were both modeled and ray traced on
the AT&T Pixel Machine.  Unfortunately, it's unclear whether the Pixel Machine
driver program is included in the distribution.  The modeler itself sounds
reasonable, source code comes on the tape, and there seems to be no
restrictions on the use of the software.  It's a pity that it's pricey when
compared to, say, FSF stuff, but I guess someone has to pay for those glossy
advertisement folders.

From their literature:  "SSM was written in standard C with Silicon Graphic's
Iris Graphics Library calls and AT&T PicLib calls....  The program is
available for the Silicon Graphics IRIS workstation running version 3.1 of
IRIX, and a Sun Workstation with AT&T PXM964 running 4.2 BSD."

For more information contact:
COSMIC
The University of Georgia
382 East Broad Street
Athens, GA  30602
(404)-542-3265

-------------------------------------------------------------------------------

Minimum Bounding Sphere Program, by Marshall Levine

I think you will be interested in the following program.  It is a
minimum-bounding-sphere program.  As the explained in the header comments, the
main algorithm seems to solve the problem in linear time.  Please let me know
what you think.

{ clusters.p

Written by Marshall Levine  (Princeton University '92)
e-mail:  mplevine@phoenix.princeton.edu
Algorithm designed by Marshall Levine and Chris Williams (Princeton U. '92)

This program searches through a 3-dimensional space of randomly distributed
points for a cluster of 10 stars within the smallest radius possible.

I first implemented a "pri" list.  This is a linked list of real numbers
(representing distances).  The list is kept in order.  However, when a number
that would go farther into the list than the number of points per sphere
(NUMINSPHERE) tries to go into the list, the insert procedure stops it.  This
is done because the distance is useless.  For example, if NUMINSPHERE is 5 and
a number would be inserted into the 7th slot in the list, it is not inserted.
The minimum radius of a sphere with 5 points would be determined by the 5th
element of the list (not including the header), so any number inserted after
the 5th element is useless and is therefore not inserted.  If there are not
NUMINSPHERE elements in the pri, then there are not enough points to fill the
sphere.

The brute-force algorithm loops through every point in space.  For each point,
the algorithm finds the distance between that point and every other point and
puts that distance into the pri.  When all points have been compared against
this point, the NUMINSPHERE'th element is taken to be the minimum radius of a
sphere centered at this point containing NUMINSPHERE points.  However, points
are not compared against themselves, so the exact number of comparisons is
N^2-N, making this an N^2 algorithm.

The efficient algorithm designed by Chris Williams and me divides the space
into a 3-dimensional grid.  If the grid is divided into NUMPOINTS/NUMINSPHERE
sectors, then at least one of the sectors must have at least NUMINSPHERE
points.  Now, make spheres with the same volume as the sectors.  At least one
sphere surrounding one point will have at least NUMINSPHERE points.  It turns
out that the tradeoff between fewer computations and more overhead is
minimized by choosing the grid to have enough sectors such that each sector is
r/2 on each side (where r is the radius of the aforementioned sphere).  Our
algorithm starts with a sphere radius equal to the distance from one corner of
the unit cube to another (3^.5).  Given the first point in the list, we
compare that point against every other point in sectors touching the sphere
(In this case, every other point in space!)  By storing the distances and then
taking the NUMINSPHERE'th number from the pri list, as in the brute algorithm,
we frequently reduce the size of the sphere.  Then, we check the next point
with the new, smaller sphere size and continue in this way until we have
tested every point.  As we go along, the minimum sphere size keeps shrinking
until for any given point, we only check a few neighboring sectors, if any.
In practice, this radius shrinks so quickly that the algorithm displays LINEAR
BEHAVIOR!

NOTE:  This program was written for clarity, not for efficiency.  If it is to
be used in any real applications, there are many ways to speed it up.


                  Bruteforce:                     Our algorithm:
                                               (Average of 3 runs)
Points:   #Comparisons:  comps/points:     #Comparisons:  comps/points:
     50            2450         49.000               958         19.160
     75            5550         74.000              1241         16.547
    100            9900         99.000              2111         21.110
    150           22350        149.000              2785         18.567
    200                                             3689         18.445
    250                                             5120         20.480
    300                                             6010         20.033
    350                                             7149         20.426
    400                                             7658         19.145
    600                                            11404         19.007
    800                                            16781         20.976
   1000                                            20438         20.438



Testing 50 points.
Brute-force:
   Best sphere:    0.3067962678
   Number of comparisons:     2450
Efficient Algorithm:
   Best sphere:    0.3067962678
   Number of comparisons:      946

 %time  cumsecs  #call  ms/call  name
  31.6     0.10      1   100.01  _brutecluster      <====
  10.5     0.18      1    33.34  _elegantcluster    <====
   5.3     0.25    101     0.17  _clearprilist
   5.3     0.27    581     0.03  _insertprilist
   5.3     0.28      1    16.67  _makespace

Testing 300 points.
Brute-force:
   Best sphere:    0.1569231423
   Number of comparisons:    89700
Efficient Algorithm:
   Best sphere:    0.1569231423
   Number of comparisons:     5617

 %time  cumsecs  #call  ms/call  name
  44.2     3.27      1  3267.00  _brutecluster      <====
   2.9     6.82      1   216.69  _elegantcluster    <====
   1.1     7.00   2358     0.04  _insertprilist
   0.2     7.33    601     0.03  _clearprilist
   0.0     7.38      1     0.00  _makespace
}

{==========================================================================}

program clusters(input,output);

const
  MAXNUMPOINTS = 501;    { The maximum # of points we can handle  }
  NUMINSPHERE = 10;      { # stars to find inside sphere          }
  INFINITY = 999999.9;   { Larger than largest distance possible  }
  MAXUSESPACE = 20;      { Maximum length per edge of space-grid  }
  PI = 3.1415926535;

type
  datatype = real;
  point = record         { The type of a point }
            x : real;
            y : real;
            z : real;
            data : datatype;
          end;
  ptr = ^node;
  node = record          { Linked list for a distances list called "pri" }
           data : real;
           next : ptr;
         end;
  sptr = ^spacenode;     { Linked list for each sector in the space-grid }
  spacenode = record
                index : integer; { Stores index of that point in points[] }
                next : sptr;
              end;


var
  rndnm : integer;       { Needed for the random number generator }
  points : array [1..MAXNUMPOINTS] of point;   { All points in space }
  listhead : ptr;        { List head for distances list called "pri" }
  space : array[0..MAXUSESPACE, 0..MAXUSESPACE, 0..MAXUSESPACE] of sptr;
                         { The space-grid (hereafter called 'grid') }
  spacesize, usespace : integer;  { Size per edge of grid }
  NUMPOINTS : integer;   { The number of points we have in space }


{ **************** Support routines for random generators ************** }

procedure seed;        { Seed the random number generator }
begin
  writeln('seed:');
  readln(rndnm);
end;

function rndom(scale : integer) : real; { Make random real from 0 to scale }
begin
  rndnm := abs(abs((rndnm*921+1)) mod 32749);
  rndom := (rndnm*scale/32749)
end;

procedure randompoint(var pt : point);  { Generate a random point within }
begin                                   {   a unit cube.                 }
  pt.x := rndom(1);
  pt.y := rndom(1);
  pt.z := rndom(1)
end;

procedure generatepoints;           { Generate NUMPOINTS points in space }
var x : integer;
begin
  for x := 1 to NUMPOINTS do
    randompoint(points[x])
end;


{ *************** Support routines for the "pri" list ******************** }

procedure initprilist;    { Initialize the pri list }
begin
  new(listhead);
  listhead^.data := 0.0;
  new(listhead^.next);
  listhead^.next^.data := INFINITY;
  listhead^.next^.next := nil
end;

procedure clearprilist;   { Clear the pri list }
var p,oldp : ptr;
begin
  p := listhead;
  while p <> nil do
  begin
    oldp := p;
    p := p^.next;
    dispose(oldp)
  end;
  new(listhead);
  listhead^.data := 0.0;
  new(listhead^.next);
  listhead^.next^.data := INFINITY;
  listhead^.next^.next := nil
end;


procedure insertprilist(r : real);  { Insert a distance into pri list    }
var p,oldp,temp : ptr;       { "pri" is just a linked list of distances  }
    x : integer;             { kept in low -> high order. The catch is   }
begin                        { that if a number should be inserted after }
  x := 1;                    { the NUMINSPHERE'th node, we don't bother  }
  p := listhead^.next;       { inserting it, because it isn't in the     }
  oldp := listhead;          { smallest sphere with NUMINSPHERE points.  }
  while (r > p^.data) and (x <= NUMINSPHERE) do
  begin
    oldp := p;
    p := p^.next;
    x := x + 1
  end;
  if x <= NUMINSPHERE then
  begin
    new(temp);
    temp^.data := r;
    temp^.next := p;
    oldp^.next := temp
  end
end;

function getbiggestinsphere : real;  { Returns value of the NUMINSPHERE'th }
var x : integer;                     { element in pri list, or INFINITY    }
    p : ptr;                         { if the list isn't that long.        }
begin
  x := 1;
  p := listhead^.next;
  while (x < NUMINSPHERE) and (p <> nil) do
  begin
    x := x + 1;
    p := p^.next
  end;
  if (x < NUMINSPHERE) or (p = nil) then getbiggestinsphere := INFINITY
  else getbiggestinsphere := p^.data
end;

procedure printprilist;              { Print the pri list, for debugging }
var p : ptr;
begin
  p := listhead;  { DO print the head }
  while p <> nil do
  begin
    writeln(p^.data:15:10);
    p := p^.next
  end;
  writeln('nil')
end;


{ ******************* Miscellaneous support routines ******************** }

procedure printpoint(pt : point);   { Print out a point }
begin
  writeln('(',pt.x:8:5,',',pt.y:8:5,',',pt.z:8:5,')')
end;


function cube(x : real) : real;     { Return cube root of a number }
begin
  cube := exp((1/3)*ln(x))
end;


{ *********************** Brute Force algorithm ************************* }

procedure brutecluster;    { Find minimum sphere containing NUMINSPHERE }
                           {   points by testing the distance between   }
                           {   every point.                             }
var distx,disty,distz,dist : real;      { Find distance between two points }
    bestsphere,trysphere : real;        { Find minimum sphere              }
    numcomps : integer;                 { # comparisons                    }
    thispoint,againstpoint : integer;   { Counters                         }
begin
  clearprilist;                           { Kill the priority list          }
  bestsphere := INFINITY;
  numcomps := 0;
  for thispoint := 1 to NUMPOINTS do      { Test every point...             }
  begin
    clearprilist;
    for againstpoint := 1 to NUMPOINTS do { ...against every other point    }
      if thispoint <> againstpoint then   { Don't compare point against self}
      begin
        distx := points[thispoint].x - points[againstpoint].x;
        disty := points[thispoint].y - points[againstpoint].y;
        distz := points[thispoint].z - points[againstpoint].z;
        dist := sqrt(distx*distx + disty*disty + distz*distz);
        numcomps := numcomps + 1;
        if dist < bestsphere then       { If dist less than smallest sphere,}
          insertprilist(dist)           {   insert distance into pri list   }
      end;
    trysphere := getbiggestinsphere;   { Get 'NUMINSPHERE'th item from list }
    if trysphere < bestsphere then     { If this radius is the smallest yet,}
      bestsphere := trysphere;         {   then remember it.                }
  end;
  writeln('Brute-force:');
  writeln('   Best sphere: ',bestsphere:15:10);
  writeln('   Number of comparisons: ',numcomps:8)
end;


{ **************************** My algorithm *********************** }

procedure makespace;        { Build the space-grid.  See documentation at }
var x,y,z : integer;        { beginning of program for details.           }
    temp : sptr;
    thispoint : integer;
begin
  spacesize := trunc(cube(8*PI*NUMPOINTS/NUMINSPHERE));
  usespace := spacesize-1;
  if usespace > MAXUSESPACE then writeln('****** NOT ENOUGH MEMORY FOR GRID');
  for x := 0 to usespace do
    for y := 0 to usespace do
      for z := 0 to usespace do
        space[x,y,z] := nil;     { Clear the grid }
  for thispoint := 1 to NUMPOINTS do     { Go through every point... }
  begin
    new(temp);
    temp^.index := thispoint;
    x := trunc(points[thispoint].x * spacesize);
    y := trunc(points[thispoint].y * spacesize);
    z := trunc(points[thispoint].z * spacesize);
    temp^.next := space[x,y,z];          { Put this point into proper }
    space[x,y,z] := temp;                {   sector in grid.          }
  end
end;


procedure elegantcluster;    { Find smallest sphere containing NUMINSPHERE }
                             {   points by looping through every point,    }
                             {   checking ROUGHLY only the points within   }
                             {   a radius less than or equal to the        }
                             {   minimum radius found so far.              }
var bestsphere,trysphere : real;
    xmin,xmax,ymin,ymax,zmin,zmax : integer; { Dimensions of box to check }
    thispoint : integer;              { The current point to test against }
    x,y,z : integer;                  { The current grid we are testing   }
    distx,disty,distz,dist : real;    { For computing distances           }
    numcomps : integer;               { # comparisons                     }
    cpindex : sptr;          { Pointer into point list for a grid sector  }
begin
  makespace;
  bestsphere := 1.732050808;    { Start with radius of distance from one }
  numcomps := 0;                {   corner of unit cube to other: 3^.5   }
  for thispoint := 1 to NUMPOINTS do    { Loop for every point }
  begin
    clearprilist;
    xmin := trunc((points[thispoint].x - bestsphere) * spacesize);
    xmax := trunc((points[thispoint].x + bestsphere) * spacesize);
    ymin := trunc((points[thispoint].y - bestsphere) * spacesize);
    ymax := trunc((points[thispoint].y + bestsphere) * spacesize);
    zmin := trunc((points[thispoint].z - bestsphere) * spacesize);
    zmax := trunc((points[thispoint].z + bestsphere) * spacesize);
    if xmin < 0 then xmin := 0;
    if ymin < 0 then ymin := 0;               { Get dimensions of box      }
    if zmin < 0 then zmin := 0;               { containing every sector in }
    if xmax > usespace then xmax := usespace; { grid that we want to check }
    if ymax > usespace then ymax := usespace; { against the current point  }
    if zmax > usespace then zmax := usespace;
    for x := xmin to xmax do
      for y := ymin to ymax do
        for z := ymin to ymax do   { Loop through every sector in this box }
        begin
          cpindex := space[x,y,z];
          while cpindex <> nil do  { Test against every point in this sector}
          begin
            if thispoint <> cpindex^.index then  { Don't test point against }
            begin                                {   itself.                }
              distx := points[thispoint].x - points[cpindex^.index].x;
              disty := points[thispoint].y - points[cpindex^.index].y;
              distz := points[thispoint].z - points[cpindex^.index].z;
              dist := sqrt(distx*distx + disty*disty + distz*distz);
              numcomps := numcomps + 1;
              if dist < bestsphere then  { If dist less than smallest sphere}
                insertprilist(dist)      {   insert distance into pri list  }
            end;
            cpindex := cpindex^.next     { Get next point in this sector }
          end
        end;
    trysphere := getbiggestinsphere;
    if trysphere < bestsphere then
      bestsphere := trysphere
  end;
  writeln('Efficient Algorithm:');
  writeln('   Best sphere: ',bestsphere:15:10);
  writeln('   Number of comparisons: ',numcomps:8)
end;


begin
  seed;
  writeln('How many points?');
  readln(NUMPOINTS);
  if NUMPOINTS < NUMINSPHERE then
    writeln('***** Must have at least ',NUMINSPHERE:1,' points.')
  else
  begin
    writeln('Testing ',NUMPOINTS:1,' points.');
    initprilist;
    generatepoints;
    brutecluster;
    elegantcluster
  end
end.

-------------------------------------------------------------------------------

Parallelism & Modeler Info Request, by Brian Corrie
     ...!uw-beaver!uvicctr!bcorrie   bcorrie@uvicctr.UVic.ca

[soon to be a posting on USENET, but it hadn't reached my node yet.]


Howdy folks....

    It's survey time again, and I would appreciate your participation in this
version of twenty questions.

I am interested in parallel algorithms for ray tracing, and I am curious about
a couple of things.  Please note that I have most of the "standard references"
that get cited in the literature, but I am interested in some of the OTHER
stuff that is out there.

The papers that I have:

Cleary et al.  "Multiprocessor Ray Tracing", Internal Report, 83/128/17,
Department of Computer Science, University of Calgary, Calgary, Alberta,
Canada.

Dippe et al "An Adaptive Subdivision Algorithm and Parallel Architecture for
Realistic Image Synthesis", Computer Graphics, Volume 18, Number 3.

Gaudet et al "Multiprocessor Experiments for High Speed Ray Tracing", ACM
TOG, Volume 7, Number 3.

etc.....

What I am interested in are references to some of the goodies that are out
there in the real world.  Are there any papers on the hardware Pixar uses.
How about the AT&T pixel machine, the Connection Machine (there is a piece on
it in Scientific American, Volume 256, Number 6 that I already have), and
other bizarre architectures.  Dave Jevans from the University of Calgary (Hi
Dave, remember me?  I met you at SIGGRAPH this year) mentioned at one point he
implemented some stuff on a BBN Butterfly (I think).  Any more info on that
Dave?  Did you write it up?  Anybody else doing anything similar?

Here is the info I want....

1) What architecture do you run on?
2) Parallel, vectorized etc?

For parallel systems:

3) How many processors do you use?
4) How tightly coupled are they?
5) Do you perform any load balancing, and if so how?
6) Architectural requirements (memory/node, communications etc)?
7) Anything else you can think of that might be useful.

Thanks in advance for any help you can give me.  Replies by email are of
course the best route to take, but I read comp.graphics every morning, so a
reply here will be seen.  I will post a summary to the net if I get enough
information.

========

Question number two....

This should be quick and easy.  I would like to know what kind of modelling
software people use out there in the real world.

We have all seen the pretty pictures, but how do they get created?  I would
appreciate a quick or not so quick review of what kind of software is used at
your site to model 3D scenes.

For those of you in the RT News mailing list and don't read the net like I do,
I will send a copy of both this and the summary to Eric.

	Thanks,

	Brian

======== USENET cullings follow ===============================================

Ray Tracer Available, by Craig Kolb
	From: craig@weedeater.math.yale.edu
	Newsgroups: comp.graphics
	Organization: Math Department, Yale University

All of this talk of solid texturing and the like has convinced me to pull
together my raytracer for public consumption.  Although I'm calling this a
beta release, relatives of this version of rayshade have been making pretty
pictures for about a year now.  For examples, see slides 32 and 57 from the
SIGGRAPH '89 technical slide set and slides 67/68 from the stereo slide set.

If there's enough interest, I'll post rayshade to comp.sources.unix once the
bugfixes stop rolling in.

[I would like to add that Craig's ray tracer is fairly nice, and most of the
portability problems and minor bugs have been fixed since its release.  Its
input language is much more full featured than NFF (which, I'll say again, was
made only for testing ray tracers, not photorealism) and looks more mainstream
than some of the other public domain ray tracers I've seen.  If you're looking
for a reasonable input language, check his out.  His latest and greatest
version (i.e. newer that 2.21) might be available via ftp by now. - EAH]

--

Rayshade, a raytracing program, is available for "Beta" testing.  Rayshade
reads a multi-line ASCII file describing a scene to be rendered and produces a
Utah Raster RLE format file of the raytraced image.

Features:

        Primitives:
                boxes
                cones
                cylinders
                height fields
                planes
                polygons
                spheres
                triangles       (flat- or Phong-shaded)
		[he forgot to mention there are also superquadrics! - EAH]

        Composite objects

        Point, directional, and extended (area) light sources

        Solid texturing and bump mapping of primitives, objects, and
                individual instances of objects

        Antialiasing through adaptive supersampling or "jittered" sampling

        Arbitrary linear transformations of primitives,
                instances of objects, and texture/bump maps

        Use of uniform spatial subdivision and/or hierarchy of
                bounding volumes to speed rendering

        Options to facilitate rendering of stereo pairs

        Support for the Linda parallel programming language

An awk script is provided to translate NFF format scripts to rayshade format.

Rayshade is written in C with parsing support provided through lex and yacc.
The C, lex and yacc files comprise approximately eight thousand lines of
code.  Sites without lex and yacc can make use of the C source files produced
by lex and yacc which are included in this distribution.

Rayshade has been tested on a number of UNIX-based machines, including
Vaxes, Sun Workstations, Iris 4D Workstations, Encore Multimax, AT&T 3B2/310,
Cray XMP, and IBM RTs.  In addition, support is provided for the Amiga using
the Aztec C compiler.

Rayshade makes use of the Utah Raster toolkit, a package consisting of a
large number of useful image manipulation programs, test images, and a
library to read and write images written using the toolkit's RLE format.  The
toolkit is available via anonymous FTP from cs.utah.edu or from
weedeater.math.yale.edu.

Those sites that cannot or do not want to use the Utah Raster toolkit can
make use of a compile-time option to produce images written using a generic
file format identical to that used in Mark VandeWettering's "MTV" raytracer.

This version of rayshade is a "beta" release.  The first "real" release will
include an updated manual page and additional documentation as well as
any bugfixes or extensions born out of this release.

Rayshade is copyrighted in a "Gnu-like" manner.

Rayshade is available via anonymous ftp from weedeater.math.yale.edu
(192.26.88.42) in pub/Rayshade.2.21.tar.Z.  The Utah Raster toolkit
is available in pub/UtahToolkit.tar.Z.

-------------------------------------------------------------------------------

Source from Roy Hall's Book, by Tim O'Connor
	From: toc@batcomputer.tn.cornell.edu
	Newsgroups: comp.graphics

Straight from the dragon's mouth (so to speak) comes the source from
"Illumination and Color in Computer Generated Imagery" by Roy Hall.  It's now
available via anonymous ftp from:

	freedom.graphics.cornell.edu (128.84.247.85)

It's under pub/Hall and comes in two files:  1) README (of course) which also
contains some code necessary to convert 2) code.tar.Z.a which contains the
actual code.  So, as always, read README first.

Those of you who do not have ftp access may wish to drop me a short line (a
Subject:  of "gimme roy's source" is adequate).  If there's enough interest
I'll post to this group, if not I'll (shudder!)  attempt to mail it right to
you.

Also of interest on freedom are the Ray Tracing News archives (under
pub/RTNews) and the Xcu Widget Set.  (Sorry, this code available only in
stores, no mailing.)

	fishing in McElligot's Pool,
		to'c

-------------------------------------------------------------------------------
I decided to repost the above two notes again, since they are very worthwhile.
For the rest of the USENET cullings, check the archives.