From: mlab2@kuhub.cc.ukans.edu
Newsgroups: comp.sys.mac.programmer
Subject: Grad3D and What I Discovered Therein - part 2
Date: 28 Nov 90 00:01:13 GMT
Organization: University of Kansas Academic Computing Services

Graf3D and What I Discovered Therein - part 2

Yeah, part 1 was pretty much header info.  But, some people may not have it. 
Yes, I will present some code for setting up the 3D port and using it.  Wait
until about part 4 or 5 or so.  This is preliminary stuff to avoid a lot of
confusion later.

The only variable type I skipped over last time was the Port3D record.  Here it
is described:

Fields of the Port3D;
GPort      This is also documented as GrPort in the MPW docs.  In any event
           it is a pointer to the grafPort associated with the 3D port.  Thus
           standard Quickdraw calls to this port will show up with the 3D
           calls.  Want your 3D to appear white on black?  You can just
           InvertRect the portRect field of the G(r)Port field of your Port3D.

viewRect   Viewing rectangle within the grafPort.  In the 3D-way of describ-
           ing a 'point of view', this rectangle corresponds to the base of
           the pyramid formed by the user's "eye" and the four corners of the
           screen.

xLeft,     World coordinates corresponding to the viewRect.  You shouldn't
yTop,      have to manipulate these variables directly.  The procedures for
xRight,    setting up the camera take care of these.
yBottom

pen        Like the Quickdraw pen, but with 3 dimensional coordinates.

penPrime   The pen location as transformed by the xForm matrix.  Thus, calls
           to Yaw, Roll, etc will affect this pen's location.  Again, you
           shouldn't have to manipulate this variable.

eye        When you call ViewAngle, this variable is established.  It repres-
           ents the 3D point in space where the apex of the viewing pyramid
           is fixed.

hSize,     This will store the half-width and half-height of the viewRect in
vSize      screen coordinates.
 
hCenter,   Center of the viewRect in screen coordinates.
vCenter

xCotan,    Graf3D sets these up as viewing cotangents (when you call ViewAngle)
yCotan     for calls to Clip3D.

Ident      When TRUE, the transforming routines are skipped.  This is set to
           TRUE when you set the xForm matrix to the identity matrix (non-
           rotated).

xForm      This is a 4x4 matrix of variables for transforming points.  All
           calls to Yaw(), Roll(), etc are applied to this matrix and then
           Graf3D uses the matrix to transform points in space.  Unless
           reset by Identity, this matrix will continue to represent the net
           result of all transformation calls.

Setting up a port:
As with programs using Quickdraw, a call to IntGraf3D(@thePort3D) must be made
during the initialization portion of your program.  Here is how I've
initialized my 3D port:

var
  gPort3D                   :Port3D;
  gPort3DPtr                :Port3DPtr;
  origin                    :Point3D;
  viewScreen                :Rect;

begin
  InitGraf3D(@thePort3D);
  Open3DPort(@gPort3D);
  SetRect(viewScreen,100, 20, 348, 144);
  ViewPort(viewScreen);
  LookAt(-983040, 655360, 983040, -655360);
  ViewAngle(1604480);
  SetPt3D(origin, 0, 0, 0);
  gPort3D.eye:= origin;
  FillRect(gPort3D.viewRect, black);
  ...
end;

This will set up a small 248x124 3D port in the center of a 7-inch Mac screen. 
As well, it sets the eye at the 'origin' in space looking straight ahead
parallel to the "ground".  Finally it fills it black to look like outer space. 
Those lengthy numbers used in LookAt and ViewAngle are fixed type numbers.  The
ViewAngle (1604480) for example, represents an angle of 24 degrees
(1604480/65536).
Perhaps this is a good time to explain the view angles.  The view angle defines
the amount of perspective given to 3D points and lines when drawn to the
screen.  An angle of 0 represents no perspective (or orthographic) projection. 
10 degrees is similar to the perspective seen through a telephoto lens, 25
degrees is generally accepted as 'normal' perspective of the human eye, and 80
degree would give you a distorted 'fisheye'-like wide angle perspective.

Enough of Part 2.  Stay tuned for more.  Note: I can't get MAIL to work right. 
I can READ but can't reply.

john calhoun