home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / paint / m / qrt / QRTdocs / UserMan < prev   
Encoding:
Text File  |  1989-05-23  |  22.0 KB  |  555 lines

  1.                                 QRT Users Manual
  2.  
  3. INTRODUCTION
  4.            
  5.  QRT (Quick Ray Tracer) is an easy to use image generation system that uses
  6. a ray tracing algorithm for image rendering.
  7.  
  8. Here are some features of QRT:
  9.  
  10.  o Multiple primitive types, including user defined quadratic surfaces
  11.  
  12.  o Arbitrary levels of diffuse reflection, spectral reflection,
  13.    transmission, ambient lighting, and gloss
  14.  
  15.  o User defined pattern information for objects
  16.  
  17.  o Bounding boxes for groups of objects
  18.  
  19.  o Shadows
  20.  
  21.  o Multiple light sources with different characteristics
  22.  
  23.  o Arbitrary Phong spectral reflection coefficients
  24.  
  25.  o Colour dithering to increase the apparent number of colours
  26.  
  27.  o Easy to use, free format input language with error checking. Parameters
  28.    are by keyword and may appear in any order.
  29.  
  30.  Each of these features of QRT will be discussed is greater detail in this
  31. document.
  32.  
  33.  
  34. THE QRT WORLD
  35.  
  36.  QRT constructs an image of the world by performing certain manipulations on
  37. an internal representation of a group of objects. You must provide a
  38. description of these objects to QRT through the QRT input language.
  39.  
  40.  QRT writes a machine independent bitmap file which can be read by  a
  41. computer specific post processor. The post processor either displays the
  42. image or converts it into the proper form for display by system programs.
  43. (See the Machine Dependent Information section of this manual for details).
  44.  
  45.  QRT is capable of dealing with 5 types of primitive objects: spheres,
  46. parallelograms, triangles, rings (annulus), and quadratic surfaces. The
  47. latter can be used to model cones, oblong spheroids, and other interesting
  48. surfaces. Each of these objects can have an arbitrary orientation in space,
  49. and arbitrary surface characteristics.
  50.  
  51.  
  52. QRT INPUT LANGUAGE
  53.  
  54.  The QRT input language is free format, in that commands may be placed
  55. anywhere on a line, and newlines may be placed at any point. This makes it
  56. easy to use indentation. Comments are also supported by surrounding text
  57. with curly braces '{' and '}'. Comments may span lines.
  58.  
  59.  The QRT input language is not case sensitive. A full description of the
  60. language and a shorter, context free grammar can be found elsewhere in this
  61. manual.
  62.  
  63.  
  64. THE QRT ILLUMINATION MODEL
  65.  
  66.  Before meaningful images can be created, the QRT illumination model must be
  67. understood. The light that reaches the observer from each object is composed
  68. of several components:
  69.  
  70.  o Diffuse light - The "color" of the object
  71.  
  72.  o Ambient light - The color of the light that falls on the surface of the
  73.    object if no lamps are shining on this spot. Note that this specifies the
  74.    color of light, not the color of the object itself.
  75.  
  76.  o Reflected light - If the object acts as a mirror, some light is
  77.    reflected.
  78.  
  79.  o Specular highlights - The "bright spots" of a shiny object viewed in a
  80.    light.
  81.  
  82.  o Transmitted light - The object may transmit some of the light that
  83.    strikes the back of the object (glass surfaces)
  84.  
  85.  All of these light characteristics can be specified for any object. If none
  86. are specified, the current defaults are assumed. These defaults can be
  87. changed (see DEFAULT in Language Reference Guide).
  88.  
  89.  Most of these light characteristics deal with a percentage of light. For
  90. example, a light may reflect 80% of the red light that strikes it, 20% of
  91. the green, and 40% of the blue. This is the "color" of the object (diffuse
  92. light), and would be specified in QRT by the following syntax:
  93.  
  94.  diff = (.80, .20, .40)
  95.  
  96.  In QRT, 1.00 is 100%. The language is also free-format, so the above is
  97. equivalent to:
  98.  
  99.  diff = (.80,
  100.          .20,
  101.          .40 )
  102.  
  103.  The commas between parameters are optional, but make the input easier to
  104. read. Semicolons can also be used.
  105.  
  106.  Ambient light is specified in a similar manner:
  107.  
  108.  amb = (.20, .20, .20)
  109.  
  110.  The ambient light values should be fairly small. Most of the light hitting
  111. the object comes from lamps, but some parts of the object may be in the
  112. shadow of another object. If no ambient light is specified, these shadows
  113. will appear totally black, which looks unrealistic. Ambient light will give
  114. the affect of a small amount of light hitting areas in a shadow, producing a
  115. more realistic looking image.
  116.  
  117.  Reflection is specified using the MIRROR attribute:
  118.  
  119.  mirror = (.90, .90, .90)
  120.  
  121.  If a true mirrored surface is desired, the mirror values should be fairly
  122. high. If one of the values has a higher value than the others, the mirror
  123. will appear red, green, or blue.
  124.  
  125.  Transmission is specified as follows:
  126.  
  127.  trans = (.80, .80, .80)
  128.  density = (.022, .022, .022)
  129.  index = 1.33
  130.  
  131.  Note the addition of another parameter, the index of refraction. An
  132. explanation of the index of refraction for an object is beyond the scope of
  133. this document - see a book on elementary optics for details. The density
  134. factor is a light attenuation factor per unit distance the light travels
  135. through the object. The trans parameter tells QRT how much light to remove
  136. from shadows cast by this object.
  137.  
  138.  In addition, specular highlights are specified with two parameters:
  139.  
  140.  reflect = .50,
  141.  sreflect = 45
  142.  
  143.  "REFLECT" is the percentage of light reflected in the specular highlight,
  144. and sreflect is the Phong spectral reflection coefficient. Again, an
  145. explanation of the Phong coefficient is beyond the scope of this document;
  146. however, a higher value for the coefficient will result in smaller, tighter
  147. highlights for a more metallic looking object. Lower values of sreflect
  148. should be accompanied by lower values in reflect, and will produce duller
  149. looking surfaces, such as paper.
  150.  
  151.  QRT also accepts a dithering amount for each object:
  152.  
  153.  dither = 3
  154.  
  155.  Dithering is a mechanism for simulating colors not available on the display
  156. by blending other colors. The default dithering coefficient is 3; it should
  157. be kept small. Values of 1 to 6 are good. Larger objects should employ more
  158. dithering, and mirrored or glass objects should have little or no dithering.
  159.  
  160.  QRT also accepts an attribute "FUZZ", but this is not used in the present
  161. implementation. In a future implementation of QRT, FUZZ will effect small,
  162. random perturbations of the normal vector at a given location on an object.
  163. This will simulate rough surfaces, matted glass, or imperfectly reflecting
  164. mirrors.
  165.  
  166.  All of the above light characteristics may be attached to any object. The
  167. default is for a white, non reflecting, non transmitting dull surface with
  168. an average amount of dithering. In addition, any of the above colour
  169. information (which will be referred to from now on as COLORINFO) may also be
  170. attached to a pattern structure (see the PATTERN section of this document).
  171.  
  172.  
  173. LIGHT SOURCES
  174.  
  175.  Light sources in QRT are called "LAMPS". The lamp structure is simple:
  176.  
  177.  LAMP ( loc = (12, 34, 56),
  178.         dist = 50,
  179.         radius = 10 )
  180.  
  181.  The default is for a bright white lamp, but if you wish to change this, you
  182. can specify different values for the lamp's ambient light. The radius value
  183. is ignored by this implementation of QRT, but it must be supplied. In a
  184. future version, the radius may be used to implement penumbral shadows. I
  185. didn't include them in this version, since they take a very long time to
  186. compute, and don't add much to the image quality.
  187.  
  188.  The "dist" entry in the lamp structure specifies at what distance the light
  189. from the lamp is at full intensity. Beyond this value, the light will
  190. decrease in intensity. This value should be set so that the nearest object
  191. in the scene is slightly more than "dist" distance units from the lamp. This
  192. does not have to be exact. If objects are nearer than dist" units, they will
  193. be so bright that shading will not take place. Objects very far away will be
  194. dimly illuminated.
  195.  
  196.  By the way, QRT distance units are not tied to any real world unit. They
  197. can stand for feet, nautical miles, or furlongs, at your choice.
  198.  
  199.  
  200. THE OBSERVER
  201.  
  202.  After defining the world, you must tell QRT the position and orientation of
  203. the observer. This is done as follows:
  204.  
  205.  OBSERVER ( loc = (0, 10, 20),
  206.             lookat = (5, 5, 120),
  207.             up = (0, 1, 0)
  208.           )
  209.  
  210.  The x,y, and z are the location of the observer. The "lookat" variables
  211. give a location in space that the observer is looking at. Most ray tracers
  212. require you to give two angles for the observers view direction, but it is
  213. MUCH easier to know the location of an object or point in space you wish the
  214. observer to look at. This will be the center of your scene.
  215.  
  216.  The "up" variables define which direction is up. Usually, you will wish to
  217. use the values given above. QRT uses a right hand coordinate system:
  218. positive y is up, positive z is out of the screen, and positive x is to the
  219. right if you are looking in the negative z direction. The "up" parameter is
  220. optional, and if omitted, defaults to (0,1,0).
  221.  
  222.  QRT will generate an error message if no observer is defined.
  223.  
  224.  
  225. OUTPUT FILENAME
  226.  
  227.  QRT places its output in a file, so you must give it the name of this file:
  228.  
  229.  FILE_NAME = outfile.tmp
  230.  
  231.  This file must observe any file naming restrictions of the operating system
  232. and computer you are using. See the Machine Dependent Information section of
  233. this manual for information on file naming restrictions.
  234.  
  235.  
  236.  FOCAL LENGTH
  237.  
  238.  This is the focal length of the "lens" used by the observer. Think of it as
  239. a 35mm camera lens - higher numbers produce a telephoto effect, and smaller
  240. numbers are for wide angle lenses. Note that small numbers may produce some
  241. distortion of the image around the edges.
  242.  
  243.  FOC_LENGTH = 60
  244.  
  245.  
  246. SKY AND GROUND
  247.  
  248.  QRT has facilities for generating the sky and ground. To define the sky,
  249. you must give it two colors - one for the sky overhead (zenith), and one for
  250. the horizon:
  251.  
  252.  SKY ( zenith = (.10, .2, .4),
  253.        horiz = (.10, .2, .65),
  254.        dither = 6
  255.      )
  256.  
  257.  This will produce a blue sky, with a brighter color near the horizon. (The
  258. sky need not be blue - it could be red or hot pink, or vary from red to
  259. green). QRT will smoothly blend the colors from the zenith to the horizon.
  260. Since the sky is so large, you may want to specify a greater amount of
  261. dithering to compensate for the displays color resolution limit.
  262.  
  263.  The SKY structure will also produce sky colors below the horizon; any ray
  264. that does not strike an object will strike the SKY. To fix this, define a
  265. ground. There is no dedicated GROUND command, since you can define a very
  266. large parallelogram with the same effect. You can make it brown with patches
  267. of green using a PATTERN, or checkered green and yellow in the classic
  268. ray-tracing ground pattern. A very large sphere can also be used for the
  269. ground, which yields better results with mirrored objects.
  270.  
  271.  
  272. BOUNDING BOXES
  273.  
  274.  QRT supports the use of bounding boxes to speed the ray tracing process.
  275. For images composed of only a few (1 to 3) objects, bounding boxes will not
  276. do much to increase speed. However, for images where there are groups of
  277. objects physically close to each other, they can greatly reduce execution
  278. times. A bounding box is a conceptual structure that encloses a group of
  279. objects. When the ray tracer is finding line/object intersections, if a line
  280. does not strike a bounding box, it cannot possibly strike any objects within
  281. that bounding box. This saves the ray tracer the trouble of checking
  282. intersections with all objects within the box. In the case where the ray
  283. DOES enter the box, some additional overhead is incurred; however, this cost
  284. is easily justified by reduced times for negative tests.
  285.  
  286.  Bounding boxes can occasionally be useful for complex objects, such as
  287. quadratic surfaces, when the object is fairly small. Since the time to find
  288. the intersection with a quadratic surface is large, but bounding box
  289. intersections are fast, the ray tracer can save time for all the negative
  290. tests.
  291.  
  292.  Bounding boxes can contain other bounding boxes, in a recursive manner.
  293. This recursive structure defines an "object tree". There are two keywords
  294. that define the beginning and end of a bounding box: BEGIN_BBOX and
  295. END_BBOX. Here is an example:
  296.  
  297.  { ** QRT Code for a chessman ** }
  298.  
  299.  BEGIN_BBOX
  300.  
  301.    QUADRATIC ( { ** quadr defn ** }
  302.              )
  303.  
  304.    QUADRATIC ( { ** quadr defn 2 ** }
  305.              )
  306.  
  307.    SPHERE ( { ** sphere defn ** }
  308.           )
  309.  
  310.    BEGIN_BBOX
  311.  
  312.      SPHERE ( ) { ** two spheres ** }
  313.      SPHERE ( )
  314.  
  315.    END_BBOX
  316.  
  317.  END_BBOX
  318.  
  319.  
  320.  This structure may be nested to an arbitrary level; if you had a closely
  321. spaced group of chessmen, you could enclose all of them with a bounding box.
  322.  
  323.  There is no simple algorithm for knowing exactly where to place bounding
  324. boxes. You have to use common sense. Typically, bounding boxes do the most
  325. good for closely spaced objects, but if the entire group of objects is less
  326. than a third of the image area, it will be useful to enclose them all in a
  327. bounding box.
  328.  
  329.  
  330. PATTERNS
  331.  
  332.  QRT permits user defined patterns which can be mapped to the surface of any
  333. object. A pattern is basically an organized method for changing an object's
  334. COLORINFO over the surface of that object. For example, a checkered surface
  335. can be created, or a surface given the appearance of brick or tile. The
  336. current patterning in QRT is limited, yet powerful enough to describe many
  337. common patterns.
  338.  
  339.  A pattern is composed of a series of sub-patterns. Each sub-pattern defines
  340. a region on the surface of an object which will contain a given COLORINFO.
  341. These regions are presently limited to rectangles, but this may be expanded
  342. in a future implementation of QRT.
  343.  
  344.  A pattern can be defined once, and used for many objects. For example, a
  345. brick pattern might be defined:
  346.  
  347.  
  348.  PATTERN ( name = BRICK,
  349.            { ** other pattern info here ** }
  350.          )
  351.  
  352.  SPHERE ( { ** sphere definition ** }
  353.           pattern = BRICK
  354.         )
  355.  
  356.  PARALLELOGRAM ( { ** parallelogram definition ** }
  357.                  pattern = BRICK
  358.                )
  359.  
  360.  This example ignores what is actually in the pattern definition to
  361. demonstrate how patterns are attached to objects. A pattern must be defined
  362. before it can be used. It is given a name, such as BRICK, and any object can
  363. specify this pattern with "PATTERN = BRICK". There are no practical
  364. restrictions on the length of pattern names (if your computer has 1 megabyte
  365. of ram, you cannot have a pattern name longer than 1 million characters).
  366. Multiple patterns may be defined at the top of an input file, and used for
  367. any object in the file.
  368.  
  369.  What exactly makes up a pattern, you ask? A pattern can be viewed as a
  370. rectangle that is repeated over the surface of an object. If the pattern
  371. size is 10 x 10, and you have an object (say a parallelogram) that is 50 x
  372. 50, the pattern will repeat 5 times in each direction. Within this repeating
  373. rectangle, sub patterns can be defined. A sub-pattern is a rectangle or
  374. circle within the pattern rectangle with a certain COLORINFO. Any number of
  375. these sub-patterns can be created within one pattern definition. To create a
  376. brick wall, you might define several sub-patterns, each with a slightly
  377. different color of red or brown. The sub patterns need not cover the entire
  378. pattern rectangle; if they do not, the COLORINFO you defined for the object
  379. is used instead of the pattern COLORINFO. If you defined sub-patterns for
  380. bricks, the area not covered would be mortar, and the objects COLORINFO
  381. would define the color of the mortar. An actual brick pattern is given in
  382. appendix C. The proper use of patterns can be very effective in producing
  383. realistic looking scenes. However, complicated patterns will slow image
  384. creation, so it is recommended that you first display test scenes with no
  385. patterns, and then add pattern information when the scene is right.
  386.  
  387.  Patterns have one other use, in the REMOVE command. A pattern can be
  388. defined and thought of as a cut out from a surface. For example, suppose you
  389. wish to make a flat surface in the shape of a grand piano top. Rather than
  390. creating the piano top out of many parallelograms and triangles, define a
  391. pattern that includes everything in a parallelogram but NOT in the piano
  392. top; that is, the pattern maps the area to remove, not the area to keep.
  393. Attach this pattern to a planar object with the REMOVE command. In this
  394. case, since the area is removed, any associated COLORINFO is ignored.
  395.  
  396.  
  397. INSTANCES
  398.  
  399.  Often, several copies of a complex object must be created. Specifying their
  400. component primitives each time would be difficult. There is a solution to
  401. both these problems: INSTANCES. An INSTANCE is a method by which several
  402. primitives (actually, an arbitrary object tree) can be grouped and given a
  403. name. Copies of these objects may be easily created with one command. Here
  404. is an example of an instance definition.
  405.  
  406.  BEGIN_INSTANCES
  407.  
  408.    NAME = object1
  409.    BEGIN_BBOX
  410.      { ** a bunch of primitives here ** }
  411.    END_BBOX
  412.  
  413.    NAME = object2
  414.    BEGIN_BBOX
  415.      { ** a bunch more primitives here ** }
  416.  
  417.      NAME = spheres
  418.      BEGIN_BBOX
  419.        SPHERE ( ) { ** two sphere definitions ** }
  420.        SPHERE ( )
  421.      END_BBOX
  422.  
  423.    END_BBOX
  424.  
  425.  END_INSTANCES
  426.  
  427.  There can be only one of these instance definitions, and it must appear
  428. before any instances are used. However, any arbitrary object tree can appear
  429. within the begin/end instance statements. Several instances are now
  430. available for use. For example:
  431.  
  432.  INSTANCE_OF ( name = object1,
  433.                loc = (100, 10, 20),
  434.              )
  435.  
  436.  INSTANCE_OF ( name = spheres,
  437.                loc = (12.3, 24.5, 999)
  438.              )
  439.  
  440.  This example shows that any named portion of the object subtree can
  441. function as an instance (the "spheres" object is at a lower level than the
  442. "object1' object). The "offset" parameters are required. They specify a new
  443. position for the instance (offset from the origin). In the instance
  444. definition segment, all objects are defined relative to 0,0,0. They can then
  445. be moved in the INSTANCE_OF statement with the offset command.
  446.  
  447.  In addition, the instance can be given a new size:
  448.  
  449.  INSTANCE_OF ( name = object2,
  450.  
  451.                loc = (200, 100, 50),
  452.                scale = (1.5, 2.0, .25)
  453.              )
  454.  
  455.  The scale factors are optional, and are given the default of 1. The
  456. instance will be resized by the indicated amount in each of the directions.
  457. Note that there are some restrictions to this: if spheres are given a
  458. different scale factor in each direction, they will remain spheres (not
  459. change to QUADRATIC types). The new radius will be the old radius scaled by
  460. the smallest of the scale factors.
  461.  
  462.  
  463. DEFAULTS
  464.  
  465.  Each object in QRT is given certain default surface light characteristics
  466. (see the section on surface characteristics). If these defaults are not
  467. suitable, they can be changed with the DEFAULT command:
  468.  
  469.  DEFAULT ( diff = (1.00, .1, .1)
  470.            no_shadow )
  471.  
  472.  This will make all future objects red unless specified otherwise. More than
  473. one default command can be used in a file: each one affects all the objects
  474. created after it, but before the next default command. Any light
  475. characteristics can be changed (MIRROR, DITHER, etc).
  476.  
  477.  In addition, the keyword "no_shadow" can be included (as above).
  478. Ordinarily, QRT computes shadow information for all objects. This takes a
  479. lot of time, especially for scenes composed of many objects and many lamps.
  480. The "no_shadow" command causes QRT to bypass the shadow routines. This will
  481. result in a much faster image generation time, but the picture will not look
  482. as realistic.
  483.  
  484.  X and Y screen resolution and aspect ratio can also be changed with this
  485. command. If you wish to generate a preliminary image in a smaller
  486. resolution, say, 127 x 127, you would use the following default:
  487.  
  488.  DEFAULT ( x_res = 127,
  489.            y_res = 127,
  490.            aspect = .56
  491.          )
  492.  
  493.  The aspect ratio of .56 is correct for the Amiga in 4096 color mode; use
  494. 1.0 for high resolution mode.
  495.  
  496.  
  497. PROBLEMS WITH QRT
  498.  
  499.  There are several limitations in this version of QRT:
  500.  
  501.  o Patterning does not work well with some quadratic surfaces. This is a
  502.    problem with the 3d to 2d mapping function used for quadratics.
  503.  
  504.  o User defined texturing is not implemented - all objects in QRT appear
  505.    smooth. I have some ideas on how to add textures to objects, but these
  506.    have not been tested and are not incorporated into this version of QRT.
  507.  
  508.  
  509. FUTURE ENHANCEMENTS TO QRT
  510.  
  511.  The following are some things I'd like to add to QRT:
  512.  
  513.  o Enhanced patterning capability. The ability to use enumerated
  514.    (bit-mapped) patterns as well as analytic patterns would be useful.
  515.  
  516.  o Anti-dithering routines. These routines are very computationally
  517.    expensive (they can increase image generation times by a factor of 3 to
  518.    5), so they were not included in this version.
  519.  
  520.  o Penumbral shadows. This is also very computationally expensive for a
  521.    minimal utility level, so I didn't bother to include this feature.
  522.  
  523.  o Fractal generation. Fractals are, again, computationally expensive, but
  524.    some things, such as mountains, cannot be modeled with a ray tracer any
  525.    other way.
  526.  
  527.  o Wavy surfaces. This is useful for modeling water, rippled mirrors, etc. I
  528.    know how to do it, I just didn't have time to add it yet. It would be
  529.    nice if the waves were user definable in amplitude and x and y
  530.    wavelength. Wavy surfaces are very similar in implementation to textures.
  531.  
  532.  o Snowy surfaces. This is an idea from DBW, which adds snow to a surface
  533.    depending on its slope and altitude.
  534.  
  535.  o Interpolated normal surfaces. This is a mechanism to model arbitrary
  536.    curved surfaces by using a polygonal approximation to the surface, and
  537.    interpolating the normal vector between surfaces to avoid angular looking
  538.    surfaces.
  539.  
  540.  o Image plane object lists. This is a technique for increasing the speed
  541.    for positive line/object intersection test. (Bounding boxes increase
  542.    speed for negative line/object intersection tests). 
  543.  
  544.  o Heuristics for faster completion of images using area coherence.
  545.  
  546.  o An interactive editor. This is another large scale project in itself, and
  547.    I can't forsee having time to do it for a long time, but it would be
  548.    useful. The editor would display a preliminary image of the scene, and
  549.    when the user had placed objects to his satisfaction, it would write a
  550.    QRT input file and call QRT as a background task. There are certain
  551.    problems here - for instance, how do you quickly generate the outline of
  552.    a user defined quadratic that can take many forms (cone, spheroid, etc)?
  553.    And how can the user easily specify the object tree structure (bounding
  554.    boxes) with an interactive editor?
  555.