home *** CD-ROM | disk | FTP | other *** search
- This document discusses:
-
- The transmission of light in the QRT world
- Removing sections from a planar object
-
-
- Transmission of light
- =====================
-
- Transmission of light through surfaces now works, allowing one to model
- glass surfaces. Some additions to and changes from the original grammar were
- necessary to provide the desired functionality. A new keyword, "DENSITY",
- has been added, and the function of the old "TRANS" keyword has been
- changed. Also, a "THRESHOLD" parameter has been added to the default
- structure. Since transmission is a complex operation, this entire Addendum
- will discuss aspects of modeling glass surfaces.
-
- The DENSITY keyword
- ~~~~~~~~~~~~~~~~~~~
-
- It was my previous intent that the TRANS keyword would specify the
- percent transmission of light though the surface. After thinking a little
- more about the nature of light transmission, it was clear that this wasn't
- adequate. The amount of light transmitted depends not only on a fixed
- coefficient of the surface, but on the thickness of the surface. For
- example, a hollow glass sphere will appear darker (transmit less light) near
- the edges, where the glass is thickest. To account for this effect, the
- "DENSITY" keyword was added. Density specifies what percentage of
- transmitted light will be removed per unit distance travelled though the
- object. For example, the following density attribute would remove 2 percent
- of all light per unit distance:
-
- DENSITY = (.02, .02, .02);
-
- If a sphere, at its widest point, was 10 units thick, 20 percent of the
- light would be removed. Near the edge of the sphere, less light would be
- removed.
-
- Since density is a function of distance, the same density factor will
- have different effects on objects of different sizes. To remove the same
- percentage of light from an object half as thick, double the density factor.
-
- Shadows from Transparent Surfaces
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- The old "TRANS" keyword still exists, but it performs a different
- function. It does not affect the appearance of the object, but rather, the
- attenuation of light passed through the surface. QRT knows how glass
- surfaces bend light, and so it can model the magnifying effects of looking
- through curved glass, etc. But for computing shadows, it cannot properly
- bend the light from lamps. This means that you can model lenses that the
- observer looks through, but not lenses used to focus light. In order to
- provide some attenuation effects, use "TRANS" to tell QRT how much light is
- passed through the surface. This information is ONLY used for computing
- shadows. For example, blue glass should cast a blue shadow. Use something
- similar to:
-
- TRANS = (0, 0, .7)
-
- to cast a blue shadow (this lets 70 percent of the blue light pass). Note
- that by using strange combinations of DENSITY and TRANS, you can model
- illogical objects which appear, for example, blue, but cast a red shadow.
- These shadows will be entirely of one intensity, and will not vary with the
- thickness of the glass.
-
- Using MIRROR with Transparent surfaces
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- Glass surfaces not only refract light, but also reflect a percentage of
- it. This means that to realistically model glass, the glass should reflect a
- small percentage of the light. Try starting with 20 to 25 percent
- reflection. Note that all glass objects reflect light from both the outside
- and the inside surfaces of the glass.
-
- Index of Refraction
- ~~~~~~~~~~~~~~~~~~~
-
- The index of refraction for an object governs how much the light is bent
- upon entering or exiting the object. A higher index will bend the light
- more. The index of refraction of air is 1.00, and for glass is roughly 1.33.
- Some substances, such as diamond, have a higher index.
-
- Modeling Hollow Objects
- ~~~~~~~~~~~~~~~~~~~~~~~
-
- When designing the QRT transmission routines, I wanted to be able to
- model both solid glass and hollow glass objects. To understand how this is
- done, it is necessary to understand a little about how QRT's transmission
- model works.
-
- A ray, after leaving the observer, has two states: either it is inside a
- glass object, or it is outside. The ray starts out outside. When it first
- encounters a glass surface, it is bent, and its state is toggled from
- OUTSIDE to INSIDE. It continues on until encountering another surface,
- whereupon it is bent again, and its state is once more toggled. This has
- several implications for modeling glass. The first is that ALL glass
- surfaces MUST have two sides - that is, once the ray enters the glass, there
- must be no way for it to exit without again passing through a surface. The
- second is that a ray must go from glass to air, or air to glass, but not
- from glass with index of refraction A to glass with index of refraction B;
- i.e, the two glass surfaces cannot touch each other, even though they may be
- placed very close together.
-
- As an example of how this works, consider a solid glass sphere. The ray
- encounters the sphere, and is bent (in this case, towards the normal
- vector). QRT now remembers that the ray is INSIDE a glass surface. The ray
- continues on until it hits the back side of the sphere, whereupon it is bent
- (away from the normal vector), and its state is toggled to OUTSIDE. In
- summary, the INSIDE/OUTSIDE flag tells QRT how to bend the ray.
-
- Consider now the case of a hollow glass sphere. This is modeled using two
- concentric spheres, one with a smaller radius. The ray will first hit the
- outside sphere, be bent, and have its state toggled to INSIDE. There are now
- two possible cases. First, the ray may miss the inside sphere, in which case
- the simulation proceeds as in the above paragraph. Second, it may hit the
- inside sphere. In this case, it is bent, and its state is toggled to
- OUTSIDE. The ray is now considered to be back in air, so that the inside
- sphere has modeled the hollow portion of the glass. In a similar manner, the
- ray reaches the other side of the inside sphere, enters the glass again, and
- finally leaves the outside sphere. Note that even though the inside sphere
- is thought of as the "air" in the center of the object, it MUST have the
- same index of refraction as the outside sphere. This is necessary so that
- QRT can correctly bend the light when it exits the glass.
-
- Chromatic Aberration
- ~~~~~~~~~~~~~~~~~~~~
-
- In QRT, all rays, regardless of color, are refracted exactly the same.
- This is contrast to the real world, in which the amount the light is bent
- depends on its wavelength. This appears, so far as I can tell, to be a bug
- in the real world, and I saw no reason to include it in a ray tracer.
-
- Threshold attribute
- ~~~~~~~~~~~~~~~~~~~
-
- A new keyword, THRESHOLD, has been added to the default structure. In
- previous versions of QRT, there was a mechanism for detecting infinite
- recursion provided that objects reflected less that 100 percent of the light
- reaching them. QRT stopped the recursion when the intensity of the light
- reached 1 percent of its original value. When transmission was added, I made
- this value adjustable. With glass objects, both surfaces reflect light, and
- if QRT waits until the 1 percent mark before stopping recursion, the time
- necessary to complete the image is greatly increased with little or no
- increase in image quality. The default is now 10 percent, and is changeable
- as follows:
-
- DEFAULT ( threshold = .05
- )
-
- This would stop recursion when the intensity reaches 5 percent of the
- original value. An added effect is that if the objects surface reflects (or
- transmits) less than the threshold amount of light, the reflection or
- transmission will be ignored completely.
-
- Affect of Glass on Speed
- ~~~~~~~~~~~~~~~~~~~~~~~~
-
- Unfortunately, the presence of any glass objects will slow the ray tracer
- down. This effect may range from barely noticeable, for few, small objects
- to excruciatingly miserably slow, for many, large objects. Sorry, there is
- nothing I can do to speed it up - the 68000 simply won't go any faster. The
- reason for the slowdown is that for every ray/glass surface intersection,
- TWO additional rays must be sent out (as opposed to one, for reflection).
- And remember, each ray intersects a glass object twice: once on the way in,
- and once on the way out. Also, the two generated rays may intersect the
- glass, as well. You can see how this process could get very slow.
-
- Notes, etc.
- ~~~~~~~~~~~
-
- Watch for control characters in the QRT input file. I had accidentally
- imbedded an invisible control character in a file I was working on, and the
- QRT parser refused to parse the file. After closely checking the file, I
- began to look for a bug in the parser code. Finally, I discovered the
- control character, but only after spending 1 hour checking the parser code.
- The QRT parser will generate a SYNTAX ERROR, CODE 207 upon encountering any
- special characters in the input file.
-
- Since transmission involves heavy recursion, don't forget to set the
- default stack size to something larger than the default 4000 bytes. A stack
- size of 40000 to 50000 bytes seems safe for most images.
-
-
- The REMOVE command
- ==================
-
- The 'REMOVE' command was added to allow sections of a planar primitive to
- be removed. This makes it much easier to create flat objects that are not
- shaped like QRT's planar primitives. For example, I had a QRT input file
- which created the image of a grand piano. The top of the piano, because of
- its complex shape, initially was created from 11 planar primitives. Now, it
- is only 1 PARALLELOGRAM primitive, and a section of the parallelogram is
- removed to create the shape of a piano top.
-
- Before the REMOVE command can be used, a pattern must be created using
- any of QRT's pattern primitives (the piano uses a polygon). This pattern
- need not be given any surface characteristics - it simply defines the region
- to be removed from the planar primitive. The pattern is attached to the
- primitive in exactly the same way as a normal pattern, except that the
- REMOVE command is used instead of the PATTERN command:
-
- PARALLELOGRAM ( loc = (0, 0, 0)
- v1 = (10, 0, 0)
- v2 = (0, 0, 10)
-
- diff = (1, 0, 0)
- remove = SECTION_TO_REMOVE
- pattern = ANY_PATTERN
- )
-
- This example shows that the PATTERN command can be used on the same
- primitive as the REMOVE command.
-
- Several things should be noted about the REMOVE command. First, the
- pattern defines the sections to remove, not the sections which will remain.
- In the piano example, the pattern mapped all of the parallelogram except the
- part that composed the actual piano top. Second, even though the remove
- command can be used with the curved surface primitives (SPHERE, QUADRATIC),
- the results will not be quite right. To use the sphere as an example, the
- front surface of the sphere would have the correct pattern removed from it,
- but the back surface of the sphere would be completely gone. This is
- because the SPHERE intersect routine ignores completely the back surface of
- the sphere. I will probably fix this in a future version.
-