home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
wps
/
graphic
/
povframe
/
povdoc.inf
(
.txt
)
< prev
next >
Wrap
OS/2 Help File
|
1994-02-11
|
198KB
|
6,212 lines
ΓòÉΓòÉΓòÉ 1. Title Page ΓòÉΓòÉΓòÉ
Persistence of Vision Ray Tracer (POV-Ray)
Version 2.0
User's Documentation
Copyright 1993 POV-Ray Team
ΓòÉΓòÉΓòÉ 2. 1.0 Introduction to POV-Ray ΓòÉΓòÉΓòÉ
This document details the use of the Persistence of Vision Ray Tracer (POV-
Ray) and is broken down into several sections.
The first section describes the program POV-Ray, explains what ray tracing is
and also describes where to find the latest version of the POV-Ray software.
The next section is a quick start that helps you quickly begin to use the
software.
After the quick start is a more in-depth tutorial for beginning POV-Ray users.
Following the beginning tutorial is a scene description language reference that
describes the language used with POV-Ray to create an image.
The last sections include some tips and hints, suggested reading, and legal
information.
POV-Ray is based on DKBTrace 2.12 by David Buck & Aaron A. Collins
ΓòÉΓòÉΓòÉ 3. 2.0 About POV-Ray ΓòÉΓòÉΓòÉ
This section describes POV-Ray and explains what a ray tracer does. It also
describes where to find the latest version of the POV-Ray software.
ΓòÉΓòÉΓòÉ 3.1. 2.1 Program Description -- WHAT IS RAY TRACING? ΓòÉΓòÉΓòÉ
The Persistence of Vision Ray Tracer (POV-Ray) is a copyrighted freeware
program that allows a user to easily create fantastic, three dimensional,
photo-realistic images on just about any computer. POV-Ray reads standard ASCII
text files that describe the shapes, colors, textures and lighting in a scene
and mathematically simulates the rays of light moving through the scene to
produce a photo-realistic image!
No traditional artistic or programming skills are required to use POV-Ray.
First, you describe a picture in POV-Ray's scene description language, then
POV-Ray takes your description and automatically creates an image from it with
near perfect shading, perspective, reflections and lighting.
The standard POV-Ray package also includes a collection of sample scene files
that illustrate the program's features. Additionally the POV-Ray Team
distributes several volumes of scenes that have been created by other artists
using the program. These scenes can be rendered and enjoyed even before
learning the scene description language. They can also be modified to create
new scenes.
Here are some highlights of POV-Ray's features:
o Easy to use scene description language
o Large library of stunning example scene files
o Standard include files that pre-define many shapes, colors and textures
o Very high quality output image files (24-bit color.)
o 15 and 24 bit color display on IBM-PC's using appropriate hardware
o Create landscapes using smoothed height fields
o Spotlights for sophisticated lighting
o Phong and specular highlighting for more realistic-looking surfaces.
o Several image file output formats including Targa, dump and raw
o Wide range of shapes:
o Basic Shape Primitives such as... Sphere, Box, Quadric, Cylinder, Cone,
Triangle and Plane
o Advanced Shape Primitives such as... Torus (Donut), Hyperboloid, Paraboloid,
Bezier Patch, Height Fields (Mountains), Blobs, Quartics, Smooth Triangles
(Phong shaded)
o Shapes can easily be combined to create new complex shapes. This feature is
called Constructive Solid Geometry (CSG). POV-Ray supports unions, merges,
intersections and differences in CSG.
o Objects are assigned materials called textures. (A texture describes the
coloring and surface properties of a shape.)
o Built-in color patterns: Agate, Bozo, Checker, Granite, Gradient, Leopard,
Mandel, Marble, Onion, Spotted, Radial, Wood and image file mapping.
o Built-in surface bump patterns: Bumps, Dents, Ripples, Waves, Wrinkles and
mapping.
o Users can create their own textures or use pre-defined textures such as...
Mirror, Metals like Chrome, Brass, Gold and Silver, Bright Blue Sky with
Clouds, Sunset with Clouds, Sapphire Agate, Jade, Shiny, Brown Agate,
Apocalypse, Blood Marble, Glass, Brown Onion, Pine Wood, Cherry Wood
o Combine textures using layering of semi-transparent textures or tile or
material map files.
o Display preview of image while computing (not available on all computers)
o Halt rendering when part way through
o Continue rendering a halted partial scene later
ΓòÉΓòÉΓòÉ 3.2. 2.2 Which Version of POV-Ray should you use? ΓòÉΓòÉΓòÉ
There are specific versions of POV-Ray available for three different computers,
the IBM-PC, the Apple Macintosh, and the Commodore Amiga.
ΓòÉΓòÉΓòÉ 3.2.1. 2.2.1 IBM-PC's And Comapatibles ΓòÉΓòÉΓòÉ
The IBM-PC version is called POVRAY.EXE and is found in the self-extracting
archive POVIBM.EXE. It can be run on any IBM-PC with a 386 or 486 CPU and 2
megabytes of memory. A math co-processor is not required, but it is
recommended. This version of POV-Ray may be run under DOS, OS\2, and Windows.
It will not run under Desqview at this time. A version that runs on IBM-PC's
using the 286 CPU is also available in the self-extracting archive POV286.EXE.
ΓòÉΓòÉΓòÉ 3.2.2. 2.2.2 Apple Macintosh ΓòÉΓòÉΓòÉ
The Apple Macintosh version of POV-Ray can be found in the archive POVMAC.SEA
or POVMNF.SEA. POVMAC.SEA contains the preferred "high- performance"
executable for Macs with a floating point coprocessor (FPU). POVMNF.SEA
contains the slower more universal executable, which will run on any 68020 or
better Mac without an FPU.
The Macintosh version of POV-Ray needs a 68020 or better CPU (Mac II series,
SE/30, Quadras, some Powerbooks, etc.) It will run under Sytem 6.0.4 or newer
(System 7 preferred.) It also requires 32 bit Color Quickdraw, which is built
into System 7, and is an optional init in System 6. The init can be found on
the System 6 System disk "Printing", under the "Apple Color" folder. It should
also be available from any authorized Apple Service Center, or CompuServe or
local Macintosh bulletin boards. QuickTime 1.5 or newer is preferred but not
required. If installed, it will allow compression of the final PICT images.
It will also allow adding custom System 7 Thumbnail icons to the PICT files in
the Finder. Of course, a color monitor is preferred, but not required.
ΓòÉΓòÉΓòÉ 3.2.3. 2.2.3 Commodore Amiga ΓòÉΓòÉΓòÉ
The Commodore Amiga version of POV-Ray can be found in the file POVAMI.LZH. Two
executables are supplied, one for computers with a math co-processor, and one
for computers without a math co-processor. This version will run on Amiga 500,
1000, 2000, and 3000's and should work under AmigaDOS 1.3 or 2.xx. The Amiga
version supports HAM mode as well as HAM-E and the Firecracker.
ΓòÉΓòÉΓòÉ 3.2.4. 2.2.4 UNIX And Other Systems ΓòÉΓòÉΓòÉ
POV-Ray is written in highly portable C source code and it can be compiled and
run on many different computers. There is specific source code in the source
archive for UNIX, X-Windows, VAX, and generic computers. If you have one of
these, you can use the C compiler included with your operating system to
compile a POV-Ray executable for your own use. This executable may not be
distributed except under the terms specified in the file POVLEGAL.DOC. Users
on high powered computers like Suns, SGI, RS-6000's, Crays, and so on use this
method to run POV-Ray.
ΓòÉΓòÉΓòÉ 3.2.5. 2.2.5 ALL Versions ΓòÉΓòÉΓòÉ
All versions of the program share the same ray tracing features like shapes,
lighting and textures. In other words, an IBM-PC can create the same pictures
as a Cray supercomputer as long as it has enough memory.
The user will want to get the executable that best matches their computer
hardware. See the section "Where to find POV-Ray files" for where to find these
files. You can contact those sources to find out what the best version is for
you and your computer.
ΓòÉΓòÉΓòÉ 3.3. 2.3 Where to Find POV-Ray Files ΓòÉΓòÉΓòÉ
POV-Ray is a complex piece of software made up of many files. The POV-Ray
package is made up of several archives including executables, documentation,
and example scene files.
The average user will need an executable for their computer, the example scene
files and the documentation. The example scenes are invaluable for learning
about POV-Ray, and they include some exciting artwork.
Advanced users, developers, or the curious may want to download the C source
code as well.
There are also many different utilities for POV-Ray that generate scenes,
convert scene information from one format to another, create new materials, and
so on. You can find these files from the same sources as the other POV- Ray
files. No comprehensive list of these utilities is available at the time of
this writing.
The latest versions of the POV-Ray software are available from these sources:
ΓòÉΓòÉΓòÉ 3.3.1. 2.3.1 GRAPHICS DEVELOPER'S FORUM On CompuServe ΓòÉΓòÉΓòÉ
POV-Ray headquarters are on CompuServe Graphics Developer's Forum (GO GRAPHDEV)
sections 8 POV Sources and 9 POV Images. We meet there to share info and
graphics and discuss ray tracing. The forum is also home to development
projects on fractals, animation and morphing. It is the home of the Stone Soup
Group, developers of Fractint, a popular IBM-PC fractal program. Everyone is
welcome to join in on the action on CIS GraphDev. Hope to see you there! You
can get information on joining CompuServe by calling (800)848-8990. CompuServe
access is also available in Japan, Europe and many other countries.
ΓòÉΓòÉΓòÉ 3.3.2. 2.3.2 PC GRAPHICS Area On America On-Line ΓòÉΓòÉΓòÉ
There's an area now on America On-Line dedicated to POV-Ray support and
information. You can find it in the PC Graphics section of AOL. Jump keyword
"PCGRAPHICS". This area includes the Apple Macintosh executables also.
ΓòÉΓòÉΓòÉ 3.3.3. 2.3.3 YOU CAN CALL ME RAY BBS In Chicago ΓòÉΓòÉΓòÉ
There is a ray trace specific BBS in the (708) Area Code (Chicago suburbia,
United States) for all you Traceaholics out there. The phone number of this BBS
is (708) 358-5611. Bill Minus is the sysop and Aaron Collins is co- sysop of
that board, and it's filled with interesting stuff.
ΓòÉΓòÉΓòÉ 3.3.4. 2.3.4 THE GRAPHICS ALTERNATIVE BBS In EL Cerrito, CA ΓòÉΓòÉΓòÉ
For those on the West coast, you may want to find the POV-Ray files on The
Graphics Alternative BBS. It's a great graphics BBS run by Adam Shiffman. TGA
is high quality, active and progressive BBS system which offers both quality
messaging and files to its 1300+ users.
510-524-2780 (PM14400FXSA v.32bis 14.4k, Public)
510-524-2165 (USR DS v.32bis/HST 14.4k, Subscribers)
ΓòÉΓòÉΓòÉ 3.3.5. 2.3.5 PI SQUARED BBS In Maryland ΓòÉΓòÉΓòÉ
For those on the East coast you may want to try th Pi Squared BBS in Maryland.
The sysop Alfonso Hermida CIS: 72114,2060 is the creator of POVCAD. He carries
the latest POV files and utilities, plus supports his software. Call
(301)-725-9080 in Maryland USA running @ 14.4K bps 24 hrs.
ΓòÉΓòÉΓòÉ 3.3.6. 2.3.6 INTERNET ΓòÉΓòÉΓòÉ
The POV-Ray files are also available over Internet by anonymous FTP from
alfred.ccs.carleton.ca (134.117.1.1).
ΓòÉΓòÉΓòÉ 4. 3.0 Quick Start ΓòÉΓòÉΓòÉ
The next section describes how to quickly install POV-Ray and render a sample
scene on your computer.
ΓòÉΓòÉΓòÉ 4.1. 3.1 Installing POV-Ray ΓòÉΓòÉΓòÉ
Specific installation instructions are included with the executable program for
your computer. In general, there are two ways to install POV-Ray.
[ Note that the generic word "directory" is used throughout. Your operating
system may use another word (subdirectory, folder, etc.) ]
1-- The messy way: Create a directory called POVRAY and copy all POV-Ray files
into it. Edit and run all files and programs from this directory. This method
works, but is not recommended.
Or the preferred way:
2-- Create a directory called POVRAY and several subdirectories called INCLUDE,
DEMO, SCENES, UTIL. The self-extracting archives used in some versions of the
program will create subdirectories for you. If you create your own, the file
tree for this should look something like this:
\--
|
+POVRAY --
|
+INCLUDE
|
+DEMO
|
+SCENES
|
+UTIL
Copy the executable file and docs into the directory POVRAY. Copy the standard
include files into the subdirectory INCLUDE. Copy the sample scene files into
the subdirectory SCENES. And copy any POV-Ray related utility programs and
their related files into the subdirectory UTIL. Your own scene files will go
into the SCENES subdirectory. Also, you'll need to add the directories \POVRAY
and \POVRAY\UTIL to your "search path" so the executable programs can be run
from any directory.
*Note that some operating systems don't
*have an equivalent to the
*multi-path search command.
The second method is a bit more difficult to set-up, but is preferred. There
are many files associated with POV-Ray and they are far easier to deal with
when separated into several directories.
ΓòÉΓòÉΓòÉ 4.2. 3.2 Using Sample Scenes ΓòÉΓòÉΓòÉ
This section describes how to render a sample scene file. You can use these
steps to render any of the sample scene files included in the sample scenes
archive.
A scene file is a standard ASCII text file that contains a description of a
three dimensional scene in the POV-Ray language. The scene file text describes
objects and lights in the scene, and a camera to view the scene. Scene files
have the file extension .POV and can be created by any word processor or editor
that can save in standard ASCII text format.
Quite a few example scenes are provided with this distribution in the example
scenes archive. The scenes in the standard archives are designed to illustrate
and teach you the features of the program. Additionally the POV-Ray Team
distributes several volumes of scenes in its ongoing series "The POV-Ray Scene
Library" These scene files range from very simple to very complex. They have
been created by users of POV-Ray all over the world, and were picked to give
examples of the variety of features in POV- Ray. Many of them are stunning in
their own right.
The scenes were graciously donated by the artists because they wanted to share
what they had created with other users. Feel free to use these scenes for any
purpose. You can just marvel at them as-is, you can study the scene files to
learn the artists techniques, or you can use them as a starting point to create
new scenes of your own.
Here's how to make these sample scenes into images you can view on your
computer. We'll use SIMPLE.POV as an example, just substitute another filename
to render a different image.
Note: The sequence of commands is not the same for
every version of POV-Ray. There should be a
document with the executable describing the
specific commands to render a file.
The file SIMPLE.POV was included with the standard scene files and should now
be in the DEMO directory. Make that the active directory, and then at the
command line, type:
POVRAY +Isimple.pov +V +W80 +H60
POVRAY is the name of your executable, +Ifilename.pov tells POV-Ray what scene
file it should use as input, and +V tells the program to output its status to
the text screen as it's working. +W and +H set the width and height of the
image in pixels. This image will be 80 pixels wide by 60 pixels high.
POV-Ray will read in the text file SIMPLE.POV and begin working to render the
image. It will write the image to a file called DATA.TGA. The file DATA.TGA
contains a 24 bit image of the scene file SIMPLE.POV. Because many computers
can't display a 24 bit image, you will probably have to convert DATA.TGA to an
8 bit format before you can view it on your computer. The docs included with
your executable lists the specific steps required to convert a 24 bit file to
an 8 bit file.
ΓòÉΓòÉΓòÉ 4.3. 3.3 Command Line Parameters ΓòÉΓòÉΓòÉ
The following section gives a detailed description of the command-line options.
The command-line parameters may be specified in any order. Repeated parameters
overwrite the previous values except for the +L switch which defines include
file library paths. Up to 10 +L paths may be specified. Default parameters may
also be specified in a file called "povray.def" or by the environment variable
"POVRAYOPT".
Switches may be specified in upper or lower case. Switches must be preceded by
a + (plus) or - (minus). In switches which toggle a feature, the plus turns it
on and minus turns it off. For example +P turns on the "pause for keypress
when finished" option while -P turns it off. Other switches are used to
specify values and do not toggle a feature. Either plus or minus may be used
in that instance. For example +W320 sets the width to 320 pixels. You could
also use -W320 and get the same results. More examples follow this table.
Table 1 Command Line Parameters
Parameter......|.....Range........|...Description........................
-------------------------------------------------------------------------
+Annn | 0.0 to 3.0 | Render picture with anti-aliasing,or
| | "smoothing", on. Lower values cause
| | more smoothing.
+A | | Use default 0.3 anti-aliasing
-A | | Turn anti-aliasing off (default)
+Bnnn or -Bnnn | Varies w/ sys | Output file buffer size.
+C | | Continue an aborted partial image.
-C | | Start rendering from first line.
+Dxxx | Varies w/sys | Display image graphically while
| | rendering (Not available on all vers).
+Enn or +ERnn | 1 to 32,767 | End row for tracing
| or 0.0 to 1.0 | a portion of a scene.
+ECnn | 1 to 32,767 | End column for tracing
| or 0.0 to 1.0 | a portion of a scene.
+FT | | Output Targa format file
+FD | | Output dump format file
+FR | | Output raw format file
-F | | Disable file output.
+Hnnn | 1 to 32,767 | Height of image in pixels.
+Ifilespec | Varies w/ sys | Input scene file name, generally ends
| | in .pov.
+Jnnn.nnn | 0.0 to 1.0 | Set amount of jitter for anti-aliasing
+J | | Use anti-aliasing jitter 1.0 (default)
-J | | Turn off anti-aliasing jitter
+Knnn.nnn | any real value | Set "clock" float value for animation
+Lpathspec | Varies w/ sys | Library path: POV-Ray will search for
| | files in the directory listed here.
| | Multiple lib paths may be specified.
-MB | | Turn off bounding slabs
+MBnnn | 0 to 32,767 | Use bounding slabs if more than nnn
| | objects in scene.
+MSnnn | 300 or more | Set symbol table size (default 1000)
+MVn.m | 1.0 or 2.0 | Set version compatibility mode
+Ofilespec | Varies w/ sys | Output image filename.
+P | | Pause and wait for keypress after
| | tracing image.
-P | | Don't pause
+Qn | 0 to 9 | Image quality: 9 highest(default) to
| | 0 lowest.
+Rn or -Rn | 1 to 9 | Use n*n rays for anti-aliasing. Default
| | of 3 gives 9 rays; 4 gives 16 rays etc.
+Snn or +SRnn | 1-32,768 | Start row for tracing
| or 0.0 to 1.0 | a portion of a scene.
+SCnn | 1-32,768 | Start column for tracing
| or 0.0 to 1.0 | a portion of a scene.
+Vnn | Varies w/sys | Display verbose image stats while
| | rendering.
-V | | No stats during rendering
+Wnnn | 1-32,768 | Width of image in pixels.
+X | | Allow abort with keypress.(IBM-PC).
-X | | Disable abort with keypress.(IBM-PC).
--------------------------------------------------------------
ΓòÉΓòÉΓòÉ 4.3.1. 3.3.1 Anti-Aliasing ΓòÉΓòÉΓòÉ
+Annn Anti-alias with tolerance level nnn.
+A Anti-alias with tolerance level 0.3
-A Don't anti-alias (default)
+Jn.nn Scale factor for jittering
+J Jitter AA with scale 1.0 (default)
-J Turn off jittering
+Rn or -Rn Use n*n rays when anti-aliasing (default 3)
Anti-aliasing is a technique used to make the ray traced image look smoother.
Often the color difference between two objects creates a "jaggy" appearance.
When anti-aliasing is turned on, POV-Ray attempts to "smooth" the jaggies by
shooting more rays into the scene and averaging the results. This technique can
really improve the appearance of the final image. Be forewarned though,
anti-aliasing drastically slows the time required to render a scene since it
has do many more calculations to "smooth" the image. Lower numbers mean more
anti-aliasing and also more time. Use anti- aliasing for your final version of
a picture, not the rough draft.
The +A option enables adaptive anti-aliasing. The number after the +A option
determines the threshold for the anti-aliasing.
If the color of a pixel differs from its neighbor (to the left or above) by
more than the threshold, then the pixel is subdivided and super-sampled. If
r1,g1,b1 and r2,g2,b2 are the rgb components of two pixels then the difference
between pixels is computed by:
diff=abs(r1-r2)+abs(g1-g2)+abs(b1-b2)
The rgb values are in the range 0.0 to 1.0 thus the most two pixels can differ
is 3.0. If the anti-aliasing threshold is 0.0, then every pixel is
super-sampled. If the threshold is 3.0, then no anti-aliasing is done.
The lower the contrast, the lower the threshold should be. Higher contrast
pictures can get away with higher tolerance values.
Good values seem to be around 0.2 to 0.4.
The super-samples are jittered to introduce noise and to eliminate moire
interference patterns. Note that the jittering "noise" is non-random and
repeatable in nature, based on an object's 3-D orientation in space. Thus, it's
okay to use anti-aliasing for animation sequences, as the anti-aliased pixels
won't vary and flicker annoyingly from frame to frame. The +Jnn.nn switch
scales down the amount of jitter from its default value 1.0. For example +J0.5
uses half the normal jitter. Values over 1.0 jitter outside the pixel bounds
and are not recommended. Use -J to turn off jittering.
The +R switch controls the number of rows and columns of rays per pixel with
anti-aliasing. The default value 3 gives 3x3=9 rays per pixel.
The jittering and multiple rays are only used when +A is on.
ΓòÉΓòÉΓòÉ 4.3.2. 3.3.2 Buffering ΓòÉΓòÉΓòÉ
+Bnnn Use an output file buffer of nnn kilobytes.
-Bnnn Same as +Bnnn
The +B option allows you to assign large buffers to the output file. This
reduces the amount of time spent writing to the disk. If this parameter is not
specified, then as each scanline is finished, the line is written to the file
and the file is flushed. On most systems, this operation insures that the file
is written to the disk so that in the event of a system crash or other
catastrophic event, at least part of the picture has been stored properly and
retrievable on disk. (see also the +C option below.) A value of +B30 is a good
value to use to speed up small renderings. A value of +B0 defaults to a small
system-dependent buffer size. Note neither +B0 nor -B turns this feature off.
Once a buffer is set, subsequent +B commands can change its size but cannot
turn it off.
ΓòÉΓòÉΓòÉ 4.3.3. 3.3.3 Continuing An Interrupted Trace ΓòÉΓòÉΓòÉ
+C Continue partially complete rendering
-C Render from beginning (default)
If you abort a render while it's in progress or if you used the +E or +ER
options to end the render prematurely, you can use the +C option to continue
the render when you get back to it. This option reads in the previously
generated output file, displays the image to date on the screen, then proceeds
with the ray tracing. This option cannot be used if file output is disabled
with -F. It does not work with +S, +SR, +SC or +EC switches.
ΓòÉΓòÉΓòÉ 4.3.4. 3.3.4 Display Preview Image ΓòÉΓòÉΓòÉ
+D Use preview display
-D Turn preview display off (default)
If the +D option is used and your computer supports a graphic display, then the
image will be displayed while the program performs the ray tracing. On most
systems, the picture displayed is not as good as the one created by the
post-processor because it does not try to make optimum choices for the color
registers.
The +D parameters are system-dependent and are listed in the executable
documentation.
ΓòÉΓòÉΓòÉ 4.3.5. 3.3.5 Render Partial Image ΓòÉΓòÉΓòÉ
+Snnn or +SRnnn Start tracing at row number nnn.
+SCnnn Start tracing at column number nnn.
+Ennn or +ERnnn End tracing at row number nnn.
+ECnnn End tracing at column number nnn.
When doing test rendering it is often convenient to define a rectangular
section of the whole screen so you can quickly check out one area of the image.
The +S and +E switches let you define starting and ending rows and columns for
partial renderings.
The +S and +E options also allow you to begin and end the rendering of an image
at a specific scan line so you can render groups of scanlines on different
systems and concatenate them later.
WARNING: Image files created on with different executables on the same or
different computers may not look exactly the same due to different random
number generators used in some textures. If you are merging output files from
different systems, make sure that the random number generators are the same. If
not, the textures from one will not blend in with the textures from the other.
Note if the number following +SR, +SC, +ER or +EC is a greater 1 then it is
interpreted as a number of pixels. If it is a decimal value between 0.0 and
1.0 then it is interpreted as a percent of the total width or height of the
image. For example: +SR0.75 +SC0.75 starts on a row 75% down from the top at a
column 75% from the left and thus renders only the lower-right 25% of the
image.
ΓòÉΓòÉΓòÉ 4.3.6. 3.3.6 File Output Type ΓòÉΓòÉΓòÉ
+FT Uncompressed Targa-24 format (IBM-PC Default)
+FD Dump format (QRT-style)
+FR Raw format - one file each for Red, Green and Blue.
+F Use default file type for your system
-F Turn off file output
Normally, you don't need to specify any form of +F option. The default setting
will create the correct format image file for your computer. The docs included
with the executable specify which format is used.
You can disable image file output by using the command line option -F. This is
only useful if your computer has display options and should be used in
conjunction with the +P option. If you disable file output using -F, there will
be no record kept of the image file generated. This option is not normally
used.
Unless file output is disabled (-F) POV-Ray will create an image file of the
picture. This output file describes each pixel with 24 bits of color
information. Currently, three output file formats are directly supported. They
are +FT - Uncompressed Targa-24 format (IBM-PC Default), +FD - Dump format
(QRT-style) and +FR - Raw format - one file each for Red, Green and Blue.
ΓòÉΓòÉΓòÉ 4.3.7. 3.3.7 Height And Width of Rendered Image ΓòÉΓòÉΓòÉ
+Hnnn or -Hnnn Set height of image in pixels
+Wnnn or -Wnnn Set width of image in pixels
These switches set the height and width of the image in pixels. This specifies
the image size for file output. The preview display with the +D option will
generally attempt to pick a video mode to accommodate this size but the +D
settings do not in any way affect the resulting file output.
ΓòÉΓòÉΓòÉ 4.3.8. 3.3.8 Input And Output File Names ΓòÉΓòÉΓòÉ
+Ifilename Set the input filename
+Ofilename Set output filename
The default input filename is "object.pov". The default output filename is
"data" and the suffix for your default file type. The +O switch has no effect
unless file output is turned on with +F
IBM-PC default file type is Targa, so the file is "data.tga".
Amiga uses dump format and the default outfile name is "data.dis".
Raw mode writes three files, "data.red", "data.grn" and "data.blu". On IBM-
PC's, the default extensions for raw mode are ".r8", ".g8", and ".b8" to
conform to Piclab's "raw" format. Piclab is a widely used free-ware image
processing program. Normally, Targa files are used with Piclab, not raw files.
ΓòÉΓòÉΓòÉ 4.3.9. 3.3.10 Animation Clock Variable ΓòÉΓòÉΓòÉ
+Knnn or -Knnn Set the "clock" float value
The +K switch may be used to pass a single float value to the program for basic
animation. The value is stored in the float identifier "clock". If an object
had a "rotate <0,clock,0>" attached then you could rotate the object by
different amounts over different frames by setting +K10, +K20... etc. on
successive renderings.
ΓòÉΓòÉΓòÉ 4.3.10. 3.3.11 Librabry Search Path ΓòÉΓòÉΓòÉ
+Lpathspec Specify on of 10 library search paths
The +L option may be used to specify a "library" pathname to look in for
include, parameter and image files. Multiple uses of the +L switch do not
override previous settings. Up to ten +L options may be used to specify a
search path. The home (current) directory will be searched first followed by
the indicated library directories in order.
ΓòÉΓòÉΓòÉ 4.3.11. 3.3.12 Bounding Slabs Control ΓòÉΓòÉΓòÉ
-MB Turn off bounding slabs
+MBnnn Use bounding slabs if more than nnn objects in scene.
New in POV-Ray 2.0 is a spatial sub-division system called bounding slabs. It
compartmentalizes all of the objects in a scene into rectangular slabs and
computes which slabs a particular ray hits before testing the objects within
the slab. This can greatly improve rendering speed. However for scenes with
only a few objects the overhead of using slabs is not worth the effort. The
+MB switch sets the minimum number of objects before slabs are used. The
default is +MB25. The -MB switch turns off slabs completely.
ΓòÉΓòÉΓòÉ 4.3.12. 3.3.13 Symbol Table Size ΓòÉΓòÉΓòÉ
+MSnnn or -MSnnn Sets symbol table size (default 1000)
POV-Ray allocates a fixed number of spaces in its symbol table for declared
identifiers. The default of 1000 may be increased if you get a "Too many
symbols" error message.
ΓòÉΓòÉΓòÉ 4.3.13. 3.3.14 Version Comaptibility Mode ΓòÉΓòÉΓòÉ
+MVn.n or -MVn.n Set version compatibility mode
While many language changes have been made for POV-Ray 2.0, most version 1.0
syntax still works. One new feature in 2.0 that is incompatible with any 1.0
scene files is the parsing of float expressions. Setting +MV1.0 turns off
expression parsing as well as many warning messages so that nearly all 1.0
files will still work. The "#version" language directive also can be used to
change modes within scene files. The +MV switch affects only the initial
setting.
ΓòÉΓòÉΓòÉ 4.3.14. 3.3.15 Pause When Finished ΓòÉΓòÉΓòÉ
+P Pause when image is complete so preview image can
be seen.
-P Do not pause. (default)
Normally when preview display is on you want to look at the image awhile before
continuing. The +P switch pauses and waits for you to press a key before going
on.
ΓòÉΓòÉΓòÉ 4.3.15. 3.3.16 Quality Settings ΓòÉΓòÉΓòÉ
+Qn or -Qn Set rendering quality
The +Q option allows you to specify the image rendering quality, for quickly
rendering images for testing. You may also use -Q with no difference. The
parameter can range from 0 to 9. The values correspond to the following quality
levels:
0,1 Just show quick colors. Ambient lighting only.
Quick colors are used only at 5 or below.
2,3 Show Diffuse and Ambient light
4,5 Render shadows, use extended lights at 5 but not 4
6,7 Create surface textures
8,9 Compute reflected, refracted, and transmitted rays.
The default is +Q9 (maximum quality) if not specified.
ΓòÉΓòÉΓòÉ 4.3.16. 3.3.17 Verbose Statistics ΓòÉΓòÉΓòÉ
+V Verbose statistics on
-V Verbose statistics off
When the +D option is not used, it is often desirable to monitor progress of
the rendering. The +V switch turns on verbose reporting while -V turns it off.
The format of the output is system dependent.
ΓòÉΓòÉΓòÉ 4.3.17. 3.3.18 Allow Abort During Rendering ΓòÉΓòÉΓòÉ
+X Allow abort with keypress
-X Disable abort with keypress
On the IBM-PC versions only, when you specify the +X switch then any keypress
will abort rendering. The -X switch disables this feature.
ΓòÉΓòÉΓòÉ 4.4. 3.4 Default Parameter File and Environment Variables ΓòÉΓòÉΓòÉ
You may specify the default parameters by modifying the file "povray.def" which
contains the parameters in the above format. This filename contains a complete
command line as though you had typed it in, and is processed before any options
supplied on the command line are recognized. You may put commands on more than
one line in the "povray.def" file.
Examples:
POVRAY +Ibox.pov +Obox.tga +V +X +W320 +H200
+Ibox.pov = Use the scene file box.pov for input
+Obox.tga = Output the image as a Targa file to box.tga
+V = Show line numbers while rendering.
+X = Allow key press to abort render.
+W320 = Set image width to 320 pixels
+H200 = Set image height to 200 pixels
Some of these parameters could have been put in the POVRAYOPT environment
variable to save typing:
SET POVRAYOPT = +V +X +W320 +H200
Then you could just type:
POVRAY +Ibox.pov +Obox.tga
Or, you could create a file called POVRAY.DEF in the same directory as the
scene file. If POVRAY.DEF contains "+V +X +W320 +H200" then you could also
type:
POVRAY +Ibox.pov +Obox.tga
With the same results. You could also create an option file with a different
name and specify it on the command line:
For example, if QUICK.DEF contains "+V +X +W80 +H60" then you could also type:
POVRAY +Ibox.pov +Obox.tga QUICK.DEF
When POV-Ray sees QUICK.DEF, it will read it in just as if you typed it on the
command line.
The order that the options are read in for the IBM-PC version are as follows:
POVRAYOPT environment variable
POVRAY.DEF in current directory or, if not found,
in library path.
Command line and command line option files
For example, +V in POVRAY.DEF would override -V in POVRAYOPT. +X on the command
line would override -X in POVRAY.DEF and so on.
Other computer's versions may read in the POVRAY.DEF file before the POVRAYOPT
environment variable. See the documentation on your version.
ΓòÉΓòÉΓòÉ 5. 4.0 Beginning Tutorial ΓòÉΓòÉΓòÉ
This section describes how to create a scene using POV-Ray's scene description
language and how to render this scene.
ΓòÉΓòÉΓòÉ 5.1. 4.1 Your First Image ΓòÉΓòÉΓòÉ
Let's create the scene file for a simple picture. Since ray tracers thrive on
spheres, that's what we'll render first.
ΓòÉΓòÉΓòÉ 5.1.1. 4.1.1 The POV-Ray Coordinate System ΓòÉΓòÉΓòÉ
First, we have to tell POV-Ray where our camera is and where it's looking. To
do this, we use 3D coordinates. The usual coordinate system for POV-Ray has the
positive Y axis pointing up, the positive X axis pointing to the right, and the
positive Z axis pointing into the screen as follows:
^+Y
| /+Z
| /
| /
|/ +X
|-------->
The negative values of the axes point the other direction, as follows:
^+Y
| /+Z
| /
| /
-X |/ +X
<-------|-------->
/|
/ |
/ |
-Z/ |
v-Y
ΓòÉΓòÉΓòÉ 5.1.2. 4.1.2 Adding Standard Include Files ΓòÉΓòÉΓòÉ
Using your personal favorite text editor, create a file called "picture1.pov".
Now, type in the following (Note: The input is case sensitive, so be sure to
get capital and lowercase letters correct):
#include "colors.inc" // The include files contain
#include "shapes.inc" // pre-defined scene elements
#include "textures.inc"
camera {
location <0, 2, -3>
look_at <0, 1, 2>
}
The first include statement reads in definitions for various useful colors. The
second and third include statements read in some useful shapes and textures
respectively. When you get a chance, have a look through them to see but a few
of the many possible shapes and textures available.
You may have as many include files as needed in a scene file. Include files may
themselves contain include files, but you are limited to declaring includes
nested only 10 "deep".
Filenames specified in the include statements will be searched for in the home
(current) directory first, and if not found, will then be searched for in
directories specified by any "+L" (library path) options active. This would
facilitate keeping all your "include" (.inc) files such as shapes.inc,
colors.inc, and textures.inc in an "include" subdirectory, and giving an "+L"
option on the command line to where your library of include files are.
ΓòÉΓòÉΓòÉ 5.1.3. 4.1.3 Placing The Camera ΓòÉΓòÉΓòÉ
The camera declaration describes where and how the camera sees the scene. It
gives X, Y, Z coordinates to indicate the position of the camera and what part
of the scene it is pointing at. You describe X, Y, Z coordinates using a 3-part
"vector". A vector is specified by putting 3 numeric values between a pair of
angle brackets and separating the values with commas.
Briefly, "location <0, 2, -3>" places the camera up two units and back three
units from the center of the ray tracing universe which is at <0, 0, 0>.
Remember that by default +Z is into the screen and -Z is back out of the
screen.
Also "look_at <0, 1, 2>" rotates the camera to point at X, Y, Z coordinates <0,
1, 2>. A point 5 units in front of and 1 unit lower than the camera. The
look_at point should be the center of attention of your image.
ΓòÉΓòÉΓòÉ 5.1.4. 4.1.4 Describing An Object ΓòÉΓòÉΓòÉ
Now that the camera is set up to record the scene, let's place a red sphere
into the scene. Type the following into your scene file:
sphere {
<0, 1, 2>, 2
texture {
pigment {color Yellow} // Yellow is pre-defined in COLORS.INC
}
}
The first vector specifies center of the sphere. In this example the X
coordinate is zero so it is centered left and right. It is also at Y=1 or 1
unit up from the origin. The Z coordinate is 2 which is 5 units in front of the
camera at Z=-3. After the center vector is a comma followed by the radius which
in this case is 2 units. Since the radius is 1/2 the width of a sphere, the
sphere is 4 units wide.
ΓòÉΓòÉΓòÉ 5.1.5. 4.1.5 Adding Texture To An Object ΓòÉΓòÉΓòÉ
Now that we've defined the location and size of the sphere, we need to describe
the appearance of the surface. The texture {...} block specifies these
parameters. Texture blocks describe the color, bumpiness and finish properties
of an object. In this example we will specify the color only. This is the
minimum we must do. All other texture options except color will use the
default values.
The color you define is the way you want it to look if fully illuminated. If
you were painting a picture of a sphere you would use dark shades of a color to
indicate the shadowed side and bright shades on the illuminated side. However
ray tracing takes care of that for you. You pick the basic color inherent in
the object and POV-Ray brightens or darkens it depending on the lighting in the
scene. Because we are defining the basic color the object actually IS rather
than how it LOOKS the parameter is called "pigment".
Many types of color patterns are available for use in a pigment {...}
statement. The keyword "color" specifies that the whole object is to be one
solid color rather than some pattern of colors. The word "Yellow" is a color
identifier which was previously defined in the standard include file
"colors.inc".
If no standard color is available for your needs, you may define your own color
by using the color keyword followed by "red", "green" and "blue" keywords
specifying the amount of red, green and blue to be mixed. For example a nice
shade of pink can be specified by:
color red 1.0 green 0.8 blue 0.8
The values after each keyword should be in the range 0.0 to 1.0. Any of the
three components not specified will default to 0. A shortcut notation may also
be used. The following produces the same shade of pink:
color rgb <1.0, 0.8, 0.8>
Colors are explained in more detail later.
ΓòÉΓòÉΓòÉ 5.1.6. 4.1.6 Defining A Light Source ΓòÉΓòÉΓòÉ
One more detail is needed for our scene. We need a light source. Until you
create one, there is no light in this virtual world. Add the following text to
your scene file:
light_source { <2, 4, -3> color White}
The vector specifies the location of the light as 2 units to our right, 4 units
above the origin and 3 units back from the origin. The light_source is
invisible, it only casts light, so no texture is needed.
That's it! Close the file and render a small picture of it using this command:
POVRAY +W160 +H120 +P +X +D0 -V -Ipicture1.pov
If your computer does not use the command line, see the executable docs for the
correct command to render a scene.
You may set any other command line options you like, also. The scene is output
to the image file DATA.TGA (or some suffix other than TGA if your computer uses
a different file format). You can convert DATA.TGA to a GIF image using the
commands listed in the docs included with your executable.
ΓòÉΓòÉΓòÉ 5.2. 4.2 More Texture Options ΓòÉΓòÉΓòÉ
You've now rendered your first picture but it is somewhat boring. Let's add
some fancy features to the texture.
ΓòÉΓòÉΓòÉ 5.2.1. 4.2.1 Surface Finishes ΓòÉΓòÉΓòÉ
One of the main features of a ray tracer is its ability to do interesting
things with surface finishes such as highlights and reflection. Let's add a
nice little phong highlight (shiny spot) to the sphere. To do this you need a
"finish" parameter. Change the definition of the sphere to this:
sphere {
<0, 1, 2>, 2
texture {
pigment {color Yellow} // Yellow is pre-defined in COLORS.INC
finish {phong 1}
}
}
Now render this the same way you did before. The phong keyword adds a highlight
the same color of the light shining on the object. It adds a lot of credibility
to the picture and makes the object look smooth and shiny. Lower values of
phong will make the highlight less bright. Phong can be between 0 and 1.
ΓòÉΓòÉΓòÉ 5.2.2. 4.2.2 Adding Bumpiness ΓòÉΓòÉΓòÉ
The highlight you've added illustrates how much of our perception depends on
the reflective properties of an object. Ray tracing can exploit this by
playing tricks on our perception to make us see complex details that aren't
really there.
Suppose you wanted a very bumpy surface on the object. It would be very
difficult to mathematically model lots of bumps. We can however simulate the
way bumps look by altering the way light reflects off of the surface.
Reflection calculations depend on a vector called a "surface normal" vector.
This is a vector which points away from the surface and is perpendicular to it.
By artificially modifying (or perturbing) this normal vector you can simulate
bumps. Change the scene to read as follows and render it:
sphere {
<0, 1, 2>, 2
texture {
pigment {color Yellow}
normal {bumps 0.4 scale 0.2}
finish {phong 1}
}
}
This tells POV-Ray to use a bump pattern to modify the surface normal. The
value 0.4 controls the apparent depth of the bumps. Usually the bumps are
about 1 unit wide which doesn't work very well with a sphere of radius 2. The
scale makes the bumps 1/5th as wide but does not affect their depth.
ΓòÉΓòÉΓòÉ 5.2.3. 4.2.3 Creating Color Patterns ΓòÉΓòÉΓòÉ
You can do more than assign a solid color to an object. You can create complex
patterns in the pigment block. Consider this example:
sphere {
<0, 1, 2>, 2
texture {
pigment {
wood
color_map {
[0.0 color DarkTan]
[0.9 color DarkBrown]
[1.0 color VeryDarkBrown]
}
turbulence 0.05
scale <0.2, 0.3, 1>
}
finish {phong 1}
}
}
The keyword "wood" specifies a pigment pattern of concentric rings like rings
in wood. The color_map specifies that the color of the wood should blend from
DarkTan to DarkBrown over the first 90% of the vein and from DarkBrown to
VeryDarkBrown over the remaining 10%. The turbulence slightly stirs up the
pattern so the veins aren't perfect circles and the scale factor adjusts the
size of the pattern.
The most of the patterns are set up by default to give you one "feature" across
a sphere of radius 1.0. A "feature" is very roughly defined as a color
transition. For example, a wood texture would have one band on a sphere of
radius 1.0. In this example we scale the pattern using the "scale" keyword
followed by a vector. In this case we scaled 0.2 in the x direction, 0.3 in
the y direction an the z direction is scaled by 1, which leaves it unchanged.
Scale values larger than 1 will stretch an element. Scale values smaller than
one will squish an element. And scale value 1 will leave an element unchanged.
ΓòÉΓòÉΓòÉ 5.2.4. 4.2.4 Pre-Defined Textures ΓòÉΓòÉΓòÉ
POV-Ray has some very sophisticated textures pre-defined in the standard
include files "textures.inc" and "stones.inc". Some are entire textures with
pigment, normal and/or finish parameters already defined. Some are just
pigments or just finishes. Change the definition of our sphere to the
following and then re-render it:
sphere {
<0, 1, 2>, 2
texture {
pigment {
DMFWood4 // Pre-defined from textures.inc
scale 4 // Scale by the same amount in all
// directions
}
finish {Shiny} // This finish defined in textures.inc
}
}
The pigment identifier DMFWood4 has already been scaled down quite small when
it was defined. For this example we want to scale the pattern larger. Because
we want to scale it uniformly we can put a single value after the scale keyword
rather than a vector of x,y,z scale factors.
Look through the file TEXTURES.INC to see what pigments and finishes are
defined and try them out. Just insert the name of the new pigment where
DMFWood1 is now or try a different finish in place of Shiny and re-render your
file.
Here is an example of using a complete texture identifier rather than just the
pieces.
sphere {
<0, 1, 2>, 2
texture { PinkAlabaster }
}
ΓòÉΓòÉΓòÉ 5.3. 4.3 More Shapes ΓòÉΓòÉΓòÉ
So far, we've just used the sphere shape. There are many other types of shapes
that can be rendered by POV-Ray. First let's make some room in the image by
changing the sphere from a radius of 2 to a radius of 1 like this:
sphere {
<0, 1, 2>, 1
texture { ... and so on.
ΓòÉΓòÉΓòÉ 5.3.1. 4.3.1 Plane Object ΓòÉΓòÉΓòÉ
Let's try out a computer graphics standard - "The Checkered Floor." Add the
following object to your .pov file:
plane {
<0, 1, 0>, 0
pigment {
checker
color Red
color Blue
}
}
The object defined here is an infinite plane. The vector <0, 1, 0> is the
surface normal of the plane (i.e., if you were standing on the surface, the
normal points straight up.) The number afterward is the distance that the plane
is displaced along the normal from the origin - in this case, the floor is
placed at Y=0 so that the sphere at Y=1, radius= 1, is resting on it.
Notice that there is no "texture{...}" statement. There really is an implied
texture there. You might find that continually typing statements that are
nested like "texture {pigment {...}}" can get to be a tiresome so POV-Ray lets
you leave out the "texture{...}" under many circumstances. In general you only
need the texture block surrounding a texture identifier (like the PinkAlabaster
example above), or when creating layered textures (which are covered later).
This pigment uses the checker color pattern and specifies that the two colors
red and blue should be used.
Because the vectors <1,0,0>, <0,1,0> and <0,0,1> are used frequently, POV- Ray
has 3 built-in vector identifiers "x", "y", and "z" respectively that can be
used as shorthand. Thus the plane could be defined as:
plane {
y,0
pigment {... etc.
Note that you do not use angle brackets around vector identifiers.
Looking at the floor, you'll notice that the ball casts a shadow on the floor.
Shadows are calculated very accurately by the ray tracer and creates precise,
sharp shadows. In the real world, penumbral or "soft" shadows are often seen.
Later you'll learn how to use extended light sources to soften the shadows.
ΓòÉΓòÉΓòÉ 5.3.2. 4.3.2 Box Object ΓòÉΓòÉΓòÉ
There are several other simple shapes available in POV-Ray. The most common
are the box, cylinder and cone. Try these examples in place of the sphere:
box {
<-1,0 ,-1>, // Near lower left corner
< 1,0.5, 3> // Far upper right corner
pigment {
DMFWood4 // Pre-defined from textures.inc
scale 4 // Scale by the same amount in all
// directions
}
rotate y*20 // Equivalent to "rotate <0,20,0>"
}
In this example you can see that a box is defined by specifying the 3D
coordinates of opposite corners. The first vector must be the minimum x,y,z
coordinates and the 2nd vector must be the maximum x,y,z values. Box objects
can only be defined parallel to the axes. You can later rotate them to any
angle. Note that you can perform simple math on values and vectors. In the
rotate parameter we multiplied the vector identifier "y" by 20. This is the
same as "<0,1,0>*20" or "<0,20,0>".
ΓòÉΓòÉΓòÉ 5.3.3. 4.3.3 Cone Object ΓòÉΓòÉΓòÉ
Here's another example:
cone {
<0,1,0>,0.3 // Center and radius of one end
<1,2,3>,1.0 // Center and radius of other end
pigment {DMFWood4 scale 4 }
finish {Shiny}
}
The cone shape is defined by the center and radius of each end. In this
example one end is at location <0,1,0> and has radius of 0.3 while the other
end is centered at <1,2,3> with radius 1. If you want the cone to come to a
sharp point then use a 0 radius. The solid end caps are parallel to each other
and perpendicular to the cone axis. If you want a hollow cone with no end caps
then add the keyword "open" after the 2nd radius like this:
cone {
<0,1,0>,0.3 // Center and radius of one end
<1,2,3>,1.0 // Center and radius of other end
open // Removes end caps
pigment {DMFWood4 scale 4 }
finish {Shiny}
}
ΓòÉΓòÉΓòÉ 5.3.4. 4.3.4 Cylinder Object ΓòÉΓòÉΓòÉ
You may also define a cylinder like this:
cylinder {
<0,1,0>, // Center of one end
<1,2,3>, // Center of other end
0.5 // Radius
open // Remove end caps
pigment {DMFWood4 scale 4 }
finish {Shiny}
}
Finally the standard include file "shapes.inc" contains some pre-defined shapes
that are about the size of a sphere with a radius of one unit. You can invoke
them like this:
object {
UnitBox
pigment {DMFWood4 scale 4 }
finish {Shiny}
scale 0.75
rotate <-20,25,0>
translate y
}
That's the end of our brief tutorial. We've only scratched the surface. The
rest of this document provides a reference to all of POV-Ray's features.
ΓòÉΓòÉΓòÉ 6. 5.0 Scene Description Language Reference ΓòÉΓòÉΓòÉ
The Scene Description Language allows the user to describe the world in a
readable and convenient way. Files are created in plain ASCII text using an
editor of your choice. POV-Ray reads the file, processes it by creating an
internal model of the scene and the renders the scene.
ΓòÉΓòÉΓòÉ 6.1. 5.1 Language Basics ΓòÉΓòÉΓòÉ
The POV-Ray language consists of identifiers, reserved keywords, floating point
literals, string literals, special symbols and comments. The text of a POV-Ray
scene file is free format. You may put statements on separate lines or on the
same line as you desire. You may add blank lines, spaces or indentations as
long as you do not split any keywords or identifiers.
ΓòÉΓòÉΓòÉ 6.1.1. 5.1.1 Identifiers And Keywords ΓòÉΓòÉΓòÉ
POV-Ray allows you to define identifiers for later use in the file. An
identifier may be 1 to 40 characters long. It may consist of upper or lower
case letters, the digits 0 through 9 or an underscore character. The first
character must be an alphabetic character. The declaration of identifiers is
covered later.
POV-Ray has a number of reserved words which are used in the language. All
reserved words are fully lower case. Therefore it is recommended that your
identifiers contain at least 1 upper case character so it is sure to avoid
conflict with reserved words.
The following keywords are reserved in POV-Ray:
adaptive height_field rgbf
agate hexagon right
agate_turb iff ripples
all image_map rotate
alpha include roughness
ambient interpolate scale
area_light intersection sky
background inverse smooth
bicubic_patch ior smooth_triangle
blob jitter specular
blue lambda sphere
bounded_by leopard spotlight
box light_source spotted
bozo location sturm
brilliance looks_like texture
bumps look_at tga
bump_map mandel threshold
bump_size map_type tightness
camera marble tile2
checker material_map tiles
clipped_by max_intersections torus
clock max_trace_level translate
color merge triangle
color_map metallic turbulence
colour normal type
colour_map no_shadow union
component object up
composite octaves use_color
cone omega use_colour
crand once use_index
cubic onion u_steps
cylinder open version
declare phase v_steps
default phong water_level
dents phong_size waves
difference pigment wood
diffuse plane wrinkles
direction point_at x
disc poly y
distance pot z
dump quadric
falloff quartic
filter quick_color
finish quick_colour
flatness radial
fog radius
frequency raw
gif red
gradient reflection
granite refraction
green rgb
ΓòÉΓòÉΓòÉ 6.1.2. 5.1.2 Comments ΓòÉΓòÉΓòÉ
Comments are text in the scene file included to make the scene file easier to
read or understand. They are ignored by the ray tracer and are there for humans
to read. There are two types of comments in POV-Ray.
Two slashes are used for single line comments. Anything on a line after a
double slash // is ignored by the ray tracer. For example:
// This line is ignored
You can have scene file information on the line in front of the comment, as in:
object { FooBar } // this is an object
The other type of comment is used for multiple lines. This type of comment
starts with /* and ends with */ everything in-between is ignored. For example:
/* These lines
Are ignored
By the
Raytracer */
This can be useful if you want to temporarily remove elements from a scene
file. /*...*/ comments can "comment out" lines containing the other //
comments, and thus can be used to temporarily or permanently comment out parts
of a scene. /*..*/ comments can be nested, the following is legal:
/* This is a comment
// This too
/* This also */
*/
Use comments liberally and generously. Well used, they really improve the
readability of scene files.
ΓòÉΓòÉΓòÉ 6.1.3. 5.1.3 Include Files ΓòÉΓòÉΓòÉ
The language allows include files to be specified by placing the line:
#include "filename.inc"
at any point in the input file. The filename must be enclosed in double quotes
and may be up to 40 characters long (or your computer's limit), including the
two double-quote (") characters.
The include file is read in as if it were inserted at that point in the file.
Using include is the same as actually cutting and pasting the entire contents
of this file into your scene.
Include files may be nested. You may have at most 10 nested include files.
There is no limit on un-nested include files.
Generally, include files have data for scenes, but are not scenes in
themselves. By convention scene files end in .pov and include files end with
.inc.
ΓòÉΓòÉΓòÉ 6.1.4. 5.1.4 Float Expressions ΓòÉΓòÉΓòÉ
Many parts of the POV-Ray language require you to specify one or more floating
point numbers. A floating point number is a number with a decimal point.
Float literals are represented by an optional sign (-), some digits, an
optional decimal point, and more digits. If the number is an integer you may
omit the decimal point and trailing zero. If it is all fractional you may omit
the leading zero. POV-Ray supports scientific notation for very large or very
small numbers. The following are all valid float literals:
1.0 -2.0 -4 34 3.4e6 2e-5 .3 0.6
Float identifiers may be declared and used anywhere a float can be used. See
section 5.1.7 on declaring identifiers.
Complex float expressions can be created using + - * / ( ) with float literals
or identifiers. Assuming the identifiers have been previously declared as
floats, the following are valid float expressions:
1+2+3 2*5 1/3 Row*3 Col*5
(Offset-5)/2 This/That+Other*Thing
Expressions are evaluated left to right with innermost parenthesis evaluated
first, then unary + or -, then multiply or divide, then add or subtract.
There are two built-in float identifiers. The identifier "version" is the
current setting of the version compatibility switch (See +MV under command-
line switches). This allows you to save and restore the previous version
switch. For example suppose MYSTUFF.INC is in version 1.0 format. At the top
of the file you could put:
#declare Temp_Vers = version // Save previous value
#version 1.0 // Change to 1.0 mode
... // Version 1.0 stuff goes here...
#version Temp_Vers // Restore previous version
The other float identifier is "clock". Its value is set by the +K command-
line switch. (See +K under command-line switches). This allows you to do
limited animation control. For example you could move an object using:
translate <0.1*clock,0,0>
and render successive frames with +K1, +K2, +K3 etc. In each frame the object
would move 1/10th of a unit.
ΓòÉΓòÉΓòÉ 6.1.5. 5.1.5 Vector Expressions ΓòÉΓòÉΓòÉ
POV-Ray operates in a 3D x,y,z coordinate system. Often you will need to
specify x, y and z values. A "vector" is a set of three float values used for
such specification. Vectors consist of three float expressions that are
bracketed by angle brackets < and >. The three terms are separated by commas.
For example:
< 1.0, 3.2, -5.4578 >
The commas are necessary to keep the program from thinking that the 2nd term is
"3.2-5.4578" and that there is no 3rd term. If you see an error message "Float
expected but '>' found instead" it probably means two floats were combined
because a comma was missing.
The three values correspond to the x, y and z directions respectively. For
example, the vector <1,2,3> means the point that's 1 unit to the right, 2 units
up, and 3 units in front the center of the "universe" at <0,0,0>. Vectors are
not always points, though. They can also refer to an amount to size, move, or
rotate a scene element.
Vectors may also be combined in expressions the same as float values. For
example <1,2,3>+<4,5,6> evaluates as <5,7,9>. Subtraction, multiplication and
division are also performed on a term-by-term basis. You may also combine
floats with vectors. For example 5*<1,2,3> evaluates as <5,10,15>.
Sometimes POV-Ray requires you to specify floats and vectors side-by-side. Thus
commas are required separators whenever an ambiguity might arise. For example
<1,2,3>-4 evaluates as <-3,-2,-1> but <1,2,3>,-4 is a vector followed by a
float.
Vector identifiers may be declared and used anywhere a vector can be used. See
section 5.1.7 on declaring identifiers.
Because vectors almost always refer to the x, y and z coordinates, POV-Ray has
three built-in vector identifiers "x "y" and "z". Like all POV-Ray keywords
they must be lower case. The vector identifier x is equivalent to the vector
<1,0,0>. Similarly y is <0,1,0> and z is <0,0,1>.
Thus an expression like 5*x evaluates to 5*<1,0,0> or <5,0,0>. The use of
these identifiers can make the scene file easier to read.
ΓòÉΓòÉΓòÉ 6.1.6. 5.1.6 Transformations ΓòÉΓòÉΓòÉ
Vectors are used not only as a notation for a point in space but are used in
the transformations scale, rotate, and translate. Scale sizes a texture or
object. Translate moves a texture or object. And rotate turns a texture or
object.
ΓòÉΓòÉΓòÉ 6.1.6.1. 5.1.6.1 Translate ΓòÉΓòÉΓòÉ
An object or texture pattern may be moved by adding a "translate" parameter.
It consists of the keyword "translate" followed by a vector. The terms of the
vector specify the number of units to move in each of the x, y, and z
directions. Translate moves the element relative to it's current position. For
example,
sphere { <10, 10, 10>, 1
pigment { Green }
translate <-5, 2, 1>
}
Will move the sphere from <10, 10, 10> to <5, 12, 11>. It does not move it to
absolute location <5, 2, 1>. Translating by zero will leave the element
unchanged on that axis. For example,
sphere { <10, 10, 10>, 1
pigment { Green }
translate <0, 0, 0>
}
Will not move the sphere at all.
ΓòÉΓòÉΓòÉ 6.1.6.2. 5.1.6.2 Scale ΓòÉΓòÉΓòÉ
You may change the size of an object or texture pattern by adding a "scale"
parameter. It consists of the keyword "scale" followed by a vector or a single
float value. If a vector is used, terms of the vector specify the amount of
scaling in each of the x, y, and z directions. If a float value is used, the
item is uniformly scaled by the same amount in all directions.
Scale, is used to "stretch" or "squish" an element. Values larger than 1
stretch the element on that axis. Values smaller than one are used to squish
the element on that axis. Scale is relative to the current element size. If the
element has been previously re-sized using scale, then scale will size relative
to the new size. Multiple scale values may used.
ΓòÉΓòÉΓòÉ 6.1.6.3. 5.1.6.3 Rotate ΓòÉΓòÉΓòÉ
You may change the orientation of an object or texture pattern by adding a
"rotate" parameter. It consists of the keyword "rotate" followed by a vector.
The three terms of the vector specify the number of degrees to rotate about
each of the x, y, and z axes.
Note that the order of the rotations does matter. Rotations occur about the x
axis first, then the y axis, then the z axis. If you are not sure if this is
what you want then you should use multiple rotation statements to get a correct
rotation. You should only rotate on one axis at a time. As in,
rotate <0, 30, 0> // 30 degrees around Y axis then,
rotate <-20, 0, 0> // -20 degrees around X axis then,
rotate <0, 0, 10> // 10 degrees around Z axis.
Rotation is always performed relative to the axis. Thus if an object is some
distance from the axis of rotation, its will not only rotate but it will
"orbit" about the axis as though it was swinging around on an invisible string.
To work out the rotation directions, you must perform the famous "Computer
Graphics Aerobics" exercise. Hold up your left hand. Point your thumb in the
positive direction of the axis of rotation. Your fingers will curl in the
positive direction of rotation. Similarly if you point your thumb in the
negative direction of the axis your fingers will curl in the negative direction
of rotation. This is the famous "left-hand coordinate system".
^
+Y| +Z/ _
| /_| |_ _
| _| | | |/ \
| | | | | | |
| /| | | | | V
-X |/ | | | | | +X
<----------+--|-|-|-|-|------>
/| | \____
/ | | ___|
/ | \ /
/ | | /
-Z/ -Y|
/ |
In this illustration, the left hand is curling around the X axis. The thumb
points in the positive X direction and the fingers curl over in the positive
rotation direction.
If you want to use a right hand system, as some CAD systems such as AutoCAD do,
the "right" vector in the camera specification needs to be changed. See the
detailed description of the camera. In a right handed system you use your
right hand for the "Aerobics".
ΓòÉΓòÉΓòÉ 6.1.6.4. 5.1.6.4 Transforming Textures and Objects ΓòÉΓòÉΓòÉ
When an object is transformed, all textures attached to the object AT THAT TIME
are transformed as well. This means that if you have a translate, rotate, or
scale in an object BEFORE a texture, the texture will not be transformed. If
the scale, translate, or rotate is AFTER the texture then the texture will be
transformed with the object. If the transformation is INSIDE the "texture { }"
statement then ONLY THE TEXTURE is affected. The shape remains the same. For
example:
sphere { <0, 0, 0>, 1
texture { White_Marble } // texture identifier from TEXTURES.INC
scale 3 // This scale affects both the
// shape and texture
}
sphere { <0, 0, 0>, 1
scale 3 // This scale affects the shape only
texture { White_Marble }
}
sphere { <0, 0, 0>, 1
texture {
White_Marble
scale 3 // This scale affects the texture only
}
}
Transformations may also be independently applied to pigment patterns and
surface normal (bump) patterns. Note scaling a normal pattern affects only the
width and spacing. It does not affect the height or depth. For example:
box { <0, 0, 0>, <1, 1, 1>
texture {
pigment {
checker color Red color White
scale 0.25 // This affects only the color pattern
}
normal {
bumps 0.3 // This specifies apparent height of bumps
scale 0.2 // Scales diameter and space between bumps but not
// not the height. Has no effect on color pattern.
}
rotate y*45 // This affects the entire texture but not
} // the object.
}
ΓòÉΓòÉΓòÉ 6.1.6.5. 5.1.6.5 Transformation Order ΓòÉΓòÉΓòÉ
Because rotations are always relative to the axis and scaling is relative to
the origin, you will generally want to create an object at the origin and scale
and rotate it first. Then you may translate it into its proper position. It
is a common mistake to carefully position an object and then to decide to
rotate it. Because a rotation of an object causes it to orbit the axis, the
position of the object may change so much that it orbits out of the field of
view of the camera!
Similarly scaling after translation also moves an object unexpectedly. If you
scale after you translate, the scale will multiply the translate amount. For
example:
translate <5, 6, 7>
scale 4
Will translate to 20, 24, 28 instead of 5, 6, 7. Be careful when transforming
to get the order correct for your purposes.
ΓòÉΓòÉΓòÉ 6.1.7. 5.1.7 Declare ΓòÉΓòÉΓòÉ
The parameters used to describe the scene elements can be tedious to use at
times. Some parameters are often repeated and it seems wasteful to have to type
them over and over again. To make this task easier, the program allows users to
create identifiers as synonyms for a pre-defined set of parameters and use them
anywhere the parameters would normally be used. For example, the color white is
defined in the POV-Ray language as:
color red 1 green 1 blue 1
This can be pre-defined in the scene as:
#declare White = color red 1 green 1 blue 1
and then substituted for the full description in the scene file, for example:
sphere {
<0, 0, 0>, 1
pigment { color red 1 green 1 blue 1 }
}
becomes:
#declare White = color red 1 green 1 blue 1
sphere {
<0, 0, 0>, 1
pigment { color White }
}
This is much easier to type and to read. The pre-defined element may be used
many times in a scene.
You use the keyword "declare" to pre-define a scene element and give it a
one-word identifier. This pre-defined scene element is not used in the scene
until you invoke its identifier. Textures, objects, colors, numbers and more
can be predefined.
In most cases when you invoke an identifier you simply use the form
"keyword{identifier}" where the keyword used is the type of statement that was
declared. For example:
#declare Shiny = finish {phong 0.8 phong_size 50 reflection 0.2}
sphere {
<0, 0, 0>, 1
pigment { color White }
finish { Shiny }
}
The identifier "Shiny" was declared as a "finish" and is invoked by placing it
inside a "finish { }" statement.
One exception is object identifiers. If you declare any object of any kind
such as sphere, box, union, intersection etc. you should invoke it by placing
it in an "object { }" statement. Thus you might have:
#declare Thing = intersection {...}
object {Thing} // not "intersection{Thing}"
Pre-defined elements may be modified when they are used, for example:
#declare Mickey = // Pre-define a union object called Mickey
union {
sphere { < 0, 0, 0>, 2 }
sphere { <-2, 2, 0>, 1 }
sphere { < 2, 2, 0>, 1 }
}
// Use Mickey
object{ // Note use of "object", not "union" keyword
Mickey
scale 3
rotate y*20
translate <0, 8, 10>
pigment {color red 1}
finish {phong .7}
}
This scene will only have one "Mickey", the Mickey that is described doesn't
appear in the scene. Notice that Mickey is scaled, rotated, translated, and a
texture is added to it. The Mickey identifier could be used many times in a
scene file, and each could have a different size, position, orientation, and
texture.
Declare is especially powerful when used to create a complex object. Each part
of the object is defined separately using declare. These parts can be tested,
rotated, sized, positioned, and textured separately then combined in one shape
or object for the final sizing, positioning, etc. For example, you could define
all the parts of a car like this:
#declare Wheel = object {...}
#declare Seat = object {...}
#declare Body = object {...}
#declare Engine = object {...}
#declare Steering_Wheel = object {...}
#declare Car =
union {
object { Wheel translate < 1, 1, 2>}
object { Wheel translate <-1, 1, 2>}
object { Wheel translate < 1, 1,-2>}
object { Wheel translate <-1, 1,-2>}
object { Seat translate < .5, 1.4, 1>}
object { Seat translate <-.5, 1.4, 1>}
object { Steering_Wheel translate <-.5, 1.6, 1.3>}
object { Body texture { Brushed_Steel } }
object { Engine translate <0, 1.5, 1.5>
}
and then it like this:
// Here is a car
object {
Car
translate <4, 0, 23>
}
Notice that the Wheel and Seat are used more than once. A declared element can
be used as many times as you need. Declared elements may be placed in "include"
files so they can be used with more than one scene.
There are several files included with POV-Ray that use declare to pre- define
many shapes, colors, and textures. See the archive INCLUDE for more info.
NOTE: Declare is not the same as the C language's define. Declare creates an
internal object of the type specified that POV-Ray can copy for later use. The
"define" used in C creates a text substitution macro.
Here's a list of what can be declared, how to declare the element, and how to
use the declaration. See the reference section for element syntax.
Objects: (Any type may be declared, sphere, box, height_field, blob, etc.)
#declare Tree = union {...}
#declare Ball = sphere {...}
#declare Crate= box {...}
object {
Tree
(OBJECT_MODIFIERS...)
}
object {
Ball
(OBJECT_MODIFIERS...)
}
object {
Crate
(OBJECT_MODIFIERS...)
}
Textures:
#declare Fred = texture {...}
sphere { <0, 0, 0>, 1
texture {
Fred
(texture_modifiers)
}
}
Layered textures:
#declare Fred =
texture {...}
texture {...}
texture {...} (etc.)
sphere { <0, 0, 0>, 1
texture {
Fred
(texture_modifiers)
}
}
Pigment:
#declare Fred = pigment {checker color Red color White}
sphere { <0, 0, 0>, 1
pigment {
Fred
(pigment_modifiers)
}
}
Normal:
#declare Fred = normal {bumps 0.5}
sphere { <0, 0, 0>, 1
pigment {White}
normal {
Fred
(normal_modifiers)
}
}
Finish:
#declare Fred = finish {phong 0.7 reflection 0.2}
sphere { <0, 0, 0>, 1
pigment {White}
finish {
Fred
(finish_items)
}
}
Colors:
#declare Fred = color red 1 green 1 blue 1
sphere { <0, 0, 0>, 1
pigment { color Fred }
}
Color_map:
#declare Rainbow =
color_map {
[0.0 color Cyan]
[1/3 color Yellow]
[2/3 color Magenta]
[1.0 color Cyan]
}
sphere { <0, 0, 0>, 1
pigment { radial color_map{Rainbow} rotate -90*x}
}
Float Values:
#declare Fred = 3.45
#declare Fred2 = .02
#declare Fred3 = .5
// Use the numeric value identifier
// anywhere a number would go
sphere { <-Fred, 2, Fred>, Fred
pigment { color red 1 }
finish { phong Fred3 }
}
Camera:
#declare Fred = camera {..}
camera { Fred }
Vectors:
#declare Fred = <9, 3, 2>
#declare Fred2 = <4, 1, 4>
sphere { Fred, 1 // Note do not put < > brackets
scale Fred2 // around vector identifiers
}
ΓòÉΓòÉΓòÉ 6.2. 5.2 Objects ΓòÉΓòÉΓòÉ
Objects are the building blocks of your scene. There are 20 different types of
objects supported by POV-Ray. Seven of them are finite solid primitives, 4 are
finite patch primitives, 5 are infinite solid polynomial primitives, 3 are
types of Constructive Solid Geometry types and one is a specialized object that
is a light source.
The basic syntax of an object is a keyword describing its type, some floats,
vectors or other parameters which further define its location and/or shape and
some optional object modifiers such as texture, pigment, normal, finish,
bounding, clipping or transformations.
The texture describes what the object looks like, ie. its material. Textures
are combinations of pigments, normals and finishes. Pigment is the color or
pattern of colors inherent in the material. Normal is a method of simulating
various patterns of bumps, dents, ripples or waves by modifying the surface
normal vector. Finish describes the reflective and refractive properties of a
material.
Bounding shapes are finite, invisible shapes which wrap around complex, slow
rendering shapes in order to speed up rendering time. Clipping shapes are used
to cut away parts of shapes to expose a hollow interior. Transformations tell
the ray tracer how to move, size or rotate the shape and/or the texture in the
scene.
ΓòÉΓòÉΓòÉ 6.2.1. 5.2.1 Solid Finite Primitives ΓòÉΓòÉΓòÉ
There are 7 different solid finite primitive shapes: blob, box, cone, cylinder,
height_field, sphere, and torus. These have a well-defined "inside" and can be
used in Constructive Solid Geometry. Because these types are finite, POV-Ray
can use automatic bounding on them to speed up rendering time.
ΓòÉΓòÉΓòÉ 6.2.1.1. 5.2.1.1 Spheres ΓòÉΓòÉΓòÉ
Since spheres are so common in ray traced graphics, POV-Ray has a highly
optimized sphere primitive which renders much more quickly than the
corresponding polynomial quadric shape. The syntax is:
sphere { <CENTER>, RADIUS }
Where <CENTER> is a vector specifying the x,y,z coordinates of the center of
the sphere and RADIUS is a float value specifying the radius. You can also add
translations, rotations, and scaling to the sphere. For example, the following
two objects are identical:
sphere { <0, 25, 0>, 10
pigment {Blue}
}
sphere { <0, 0, 0>, 1.0
pigment {Blue}
scale 10
translate y*25
}
Note that Spheres may be scaled unevenly giving an ellipsoid shape.
Because spheres are highly optimized they make good bounding shapes. Because
they are finite they respond to automatic bounding. As with all shapes, they
can be translated, rotated and scaled.
ΓòÉΓòÉΓòÉ 6.2.1.2. 5.2.1.2 Boxes ΓòÉΓòÉΓòÉ
A simple box can be defined by listing two corners of the box like this:
box { <CORNER1>, <CORNER2> }
Where <CORNER1> and <CORNER2> are vectors defining the x,y,z coordinates of
opposite corners of the box. For example:
box { <0, 0, 0>, <1, 1, 1> }
Note that all boxes are defined with their faces parallel to the coordinate
axes. They may later be rotated to any orientation using a rotate parameter.
Each element of CORNER1 should always be less than the corresponding element in
CORNER2. If any elements of CORNER1 are larger than CORNER2, the box will not
appear in the scene.
Boxes are calculated efficiently and make good bounding shapes. Because they
are finite they respond to automatic bounding. As with all shapes, they can be
translated, rotated and scaled.
ΓòÉΓòÉΓòÉ 6.2.1.3. 5.2.1.3 Cylinders ΓòÉΓòÉΓòÉ
A finite length cylinder with parallel end caps may be defined by.
cylinder { <END1>, <END2>, RADIUS }
Where <END1> and <END2> are vectors defining the x,y,z coordinates of the
center of each end of the cylinder and RADIUS is a float value for the radius.
For example:
cylinder { <0,0,0>, <3,0,0>, 2}
is a cylinder 3 units long lying along the x axis from the origin to x=3 with a
radius of 2.
Normally the ends of a cylinder are closed by flat planes which are parallel to
each other and perpendicular to the length of the cylinder. Adding the optional
keyword "open" after the radius will remove the end caps and results in a
hollow tube.
Because they are finite they respond to automatic bounding. As with all shapes,
they can be translated, rotated and scaled.
ΓòÉΓòÉΓòÉ 6.2.1.4. 5.2.1.4 Cones ΓòÉΓòÉΓòÉ
A finite length cone or a frustum (a cone with the point cut off) may be
defined by.
cone { <END1>, RADIUS1, <END2>, RADIUS2 }
Where <END1> and <END2> are vectors defining the x,y,z coordinates of the
center of each end of the cone and RADIUS1 and RADIUS2 are float values for the
radius of those ends. For example:
cone { <0,0,0>,2 <0,3,0>, 0}
is a cone 3 units tall pointing up the y axis from the origin to y=3. The base
has a radius of 2. The other end has a radius of 0 which means it comes to a
sharp point. If neither radius is zero then the results look like a tapered
cylinder or a cone with the point cut off.
Like a cylinder, normally the ends of a cone are closed by flat planes which
are parallel to each other and perpendicular to the length of the cone. Adding
the optional keyword "open" after RADIUS2 will remove the end caps and results
in a tapered hollow tube like a megaphone or funnel.
Because they are finite they respond to automatic bounding. As with all shapes,
they can be translated, rotated and scaled.
ΓòÉΓòÉΓòÉ 6.2.1.5. 5.2.1.5 Torus ΓòÉΓòÉΓòÉ
A torus is a 4th order quartic polynomial shape that looks like a donut or
inner tube. Because this shape is so useful and quartics are difficult to
define, POV-Ray lets you take a short-cut and define a torus by:
torus { MAJOR, MINOR }
where MAJOR is a float value giving the major radius and MINOR is a float
specifying the minor radius. The major radius extends from the center of the
hole to the mid-line of the rim while the minor radius is the radius of the
cross-section of the rim. The torus is centered at the origin and lies in the
X-Z plane with the Y-axis sticking through the hole.
----------- - - - - - - - ---------- +Y
/ \ / \ |
/ \ / \ |
| | | |<-B-->| -X---|---+X
\ / \ / |
\__________/_ _ _ _ _ _ _ \__________/ |
|<-----A----->| -Y
A = Major Radius
B = Minor Radius
Internally the torus is computed the same as any other quartic or 4th order
polynomial however a torus defined this way will respond to automatic bounding
while a quartic must be manually bound if at all. As with all shapes, a torus
can be translated, rotated and scaled. Calculations for all higher order
polynomials must be very accurate. If this shape renders improperly you may
add the keyword "sturm" after the MINOR value to use POV-Ray's
slower-yet-more-accurate Sturmian root solver.
ΓòÉΓòÉΓòÉ 6.2.1.6. 5.2.1.6 Blob ΓòÉΓòÉΓòÉ
Blobs are an interesting shape type. Their components are "flexible" spheres
that attract or repel each other creating a "blobby" organic looking shape. The
spheres' surfaces actually stretch out smoothly and connect, as if coated in
silly putty (honey? glop?) and pulled apart.
Picture each blob component as a point floating in space. Each point has a
field around it that starts very strong at the center point and drops off to
zero at some radius. POV-Ray adds together the field strength of each component
and looks for the places that the strength of the field is exactly the same as
the "threshold" value that was specified. Points with a total field strength
greater than the threshold are considered inside the blob. Those less than the
threshold are outside. Points equal to the threshold are on the surface of the
blob.
A blob is defined as follows:
blob {
threshold THRESHOLD_VALUE
component STRENGTH, RADIUS, <CENTER>
component STRENGTH, RADIUS, <CENTER> // Repeat for any number
component STRENGTH, RADIUS, <CENTER> // of components
}
The keyword "threshold" is followed by a float THRESHOLD_VALUE. Each component
begins with the keyword "component". STRENGTH is a float value specifying the
field strength at its center. The strength may be positive or negative. A
positive value will make that component attract other components. Negative
strength will make that component repel other components. Components in
different, separate blob shapes do not affect each other. The strength tapers
off to zero at the value specified by the float RADIUS. The vector <CENTER>
specifies the x,y,z coordinates of the component. For example:
blob {
threshold 0.6
component 1.0, 1.0, <.75, 0, 0>
component 1.0, 1.0, <-.375, .64952, 0>
component 1.0, 1.0, <-.375, -.64952, 0>
scale 2
}
If you have a single blob component then the surface you see will look just
like a sphere, with the radius of the surface being somewhere inside the
"radius" value you specified for the component. The exact radius of this
sphere-like surface can be determined from the blob equation listed below (you
will probably never need to know this, blobs are more for visual appeal than
for exact modeling).
If you have a number of blob components, then their fields add together at
every point in space - this means that if the blob components are close
together the resulting surface will smoothly flow around the components.
The various numbers that you specify in the blob declaration interact in
several ways. The meaning of each can be roughly stated as:
THRESHOLD:
This is the total density value that POV-Ray is looking for. By following
the ray out into space and looking at how each blob component affects the ray,
POV-Ray will find the points in space where the density is equal to the
"threshold" value.
1. "threshold" must be greater than 0. POV-Ray only looks for positive
densities.
2. If "threshold" is greater than the strength of a component, then the
component will disappear.
3. As "threshold" gets larger the surface you see gets closer to the centers
of the components.
4. As "threshold" gets smaller, the surface you see gets closer to the spheres
at a distance of "radius" from the centers of the components.
STRENGTH:
Each component has a strength value - this defines the density of the
component at the center of the component. Changing this value will usually have
only a subtle effect.
1. "strength" may be positive or negative. Zero is a bad value, as the net
result is that no density was added - you might just as well have not used
this component.
2. If "strength" is positive, then POV-Ray will add its density to the space
around the center of the component. If this adds enough density to be
greater than "threshold you will see a surface.
3. If "strength" is negative, then POV-Ray will subtract its density from the
space around the center of the component. This will only do something if
there happen to be positive components nearby. What happens is that the
surface around any nearby positive components will be dented away from the
center of the negative component.
RADIUS:
Each component has a radius of influence. The component can only affect
space within "radius" of its center. This means that if all of the components
are farther than "radius" from each other, you will only see a bunch of
spheres. If a component is within the radius of another component, then the
two components start to affect each other. At first there is only a small bulge
outwards on each of the two components, as they get closer they bulge more and
more until they attach along a smooth neck. If the components are very close
(i.e. their centers are on top of each other), then you will only see a sphere
(this is just like having a component of more strength. bigger than the size of
each of the component radii)
1. "radius" must be bigger than 0.
2. As "radius" increases the apparent size of the component will increase.
CENTER:
This is simply a point in space. It defines the center of a blob component.
By changing the x/y/z values of the center you move the component around.
THE FORMULA
For the more mathematically minded, here's the formula used internally by
POV-Ray to create blobs. You don't need to understand this to use blobs.
The formula used for a single blob component is:
density = strength * (1 - radius^2)^2
This formula has the nice property that it is exactly equal to strength" at the
center of the component and drops off to exactly 0 at a distance of "radius"
from the center of the component. The density formula for more than one blob
component is just the sum of the individual component densities:
density = density1 + density2 + ...
Blobs can be used in CSG shapes and they can be scaled, rotated and translated.
Because they are finite they respond to automatic bounding. The calculations
for blobs must be very accurate. If this shape renders improperly you may add
the keyword "sturm" after the last component to use POV-Ray's
slower-yet-more-accurate Sturmian root solver.
ΓòÉΓòÉΓòÉ 6.2.1.7. 5.2.1.7 Height Fields ΓòÉΓòÉΓòÉ
Height fields are fast, efficient objects that are generally used to create
mountains or other raised surfaces out of hundreds of triangles in a mesh.
A height field is essentially a 1 unit wide by 1 unit long box with a
mountainous surface on top. The height of the mountain at each point is taken
from the color number (palette index) of the pixels in a graphic image file.
________ <---- image index 255
/ /|
+1y ---------- |
| | |
| | |+1z <- Image upper-right
| | /
0,0,0---------- +1x
^
|____ Image lower-left
NOTE: Image resolution is irrelevant to the scale of the heightfield.
The mesh of triangles corresponds directly to the pixels in the image file. In
fact, there are two small triangles for every pixel in the image file. The Y
(height) component of the triangles is determined by the palette index number
stored at each location in the image file. The higher the number, the higher
the triangle. The maximum height of an un-scaled height field is 1 unit.
The higher the resolution of the image file used to create the height field,
the smoother the height field will look. A 640 X 480 GIF will create a smoother
height field than a 320 x 200 GIF. The size/resolution of the image does not
affect the size of the height field. The un-scaled height field size will
always be 1x1. Higher resolution image files will create smaller triangles, not
larger height fields.
There are three types files which can define a height field as follows:
height_field { gif "filename.gif" }
height_field { tga "filename.tga" }
height_field { pot "filename.pot" }
The image file used to create a height field can be a GIF, TGA or POT format
file. The GIF format is the only one that can be created using a standard paint
program.
In a GIF file, the color number is the palette index at a given point. Use a
paint program to look at the palette of a GIF image. The first color is palette
index zero, the second is index 1, the third is index 2, and so on. The last
palette entry is index 255. Portions of the image that use low palette entries
will be lower on the height field. Portions of the image that use higher
palette entries will be higher on the height field. For example, an image that
was completely made up of entry 0 would be a flat 1x1 square. An image that was
completely made up of entry 255 would be a 1x1x1 cube.
The maximum number of colors in a GIF are 256, so a GIF height field can have
any number of triangles, but they will only 256 different height values.
The color of the palette entry does not affect the height of the pixel. Color
entry 0 could be red, blue, black, or orange, but the height of any pixel that
uses color entry 0 will always be 0. Color entry 255 could be indigo, hot pink,
white, or sky blue, but the height of any pixel that uses color entry 255 will
always be 1.
You can create height field GIF images with a paint program or a fractal
program like "Fractint". If you have access to an IBM-PC, you can get Fractint
from most of the same sources as POV-Ray.
A POT file is essentially a GIF file with a 16 bit palette. The maximum number
of colors in a POT file is greater than 32,000. This means a POT height field
can have over 32,000 possible height values. This makes it possible to have
much smoother height fields. Note that the maximum height of the field is still
1 even though more intermediate values are possible.
At the time of this writing, the only program that created POT files was a
freeware IBM-PC program called Fractint. POT files generated with this fractal
program create fantastic landscapes. If you have access to an IBM- PC, you can
get Fractint from most of the same sources as POV-Ray.
The TGA file format may be used as a storage device for 16 bit numbers rather
than an image file. The TGA format uses the red and green bytes of each pixel
to store the high and low bytes of a height value. TGA files are as smooth as
POT files, but they must be generated with special custom-made programs.
Currently, this format is of most use to programmers, though you may see TGA
height field generator programs arriving soon. There is example C source code
included with the POV-Ray source archive to create a TGA file for use with a
height field.
It is nearly impossible to take advantage of the 16 bits of resolution offered
by the use of tga files in height fields when the tga file is created in a
paint program. A gif file is a better choice for paint created height fields
in 8 bits. Also see Appendix B.5 for a tip on creating tga files for height
fields.
An optional "water_level" parameter may be added after the file name. It
consists of the keyword "water_level" followed by a float value tells the
program not to look for the height field below that value. Default value is 0,
and legal values are between 0 and 1. For example, "water_level .5" tells
POV-Ray to only render the top half of the height field. The other half is
"below the water" and couldn't be seen anyway. This term comes from the popular
use of height fields to render landscapes. A height field would be used to
create islands and another shape would be used to simulate water around the
islands. A large portion of the height field would be obscured by the "water"
so the "water_level" parameter was introduced to allow the ray-tracer to ignore
the unseen parts of the height field. Water_level is also used to "cut away"
unwanted lower values in a height field. For example, if you have an image of a
fractal on a solid colored background, where the background color is palette
entry 0, you can remove the background in the height field by specifying,
"water_level .001"
Normally height fields have a rough, jagged look because they are made of lots
of flat triangles. Adding the keyword "smooth" causes POV-Ray to modify the
surface normal vectors of the triangles in such a way that the lighting and
shading of the triangles will give a smooth look. This may allow you to use a
lower resolution file for your height field than would otherwise be needed.
Height fields can be used in CSG shapes and they can be scaled, rotated and
translated. Because they are finite they respond to automatic bounding.
Here are a notes and helpful hints on height fields from their creator, Doug
Muir:
The height field is mapped to the x-z plane, with its lower left corner sitting
at the origin. It extends to 1 in the positive x direction and to 1 in the
positive z direction. It is maximum 1 unit high in the y direction. You can
translate it, scale it, and rotate it to your heart's content.
When deciding on what water_level to use, remember, this applies to the un-
transformed height field. If you are a Fractint user, the water_level should be
used just like the water_level parameter for 3d projections in Fractint.
Here's a detailed explanation of how the ray-tracer creates the height field.
You can skip this if you aren't interested in the technical side of
ray-tracing. This information is not needed to create or use height fields.
To find an intersection with the height field, the ray tracer first checks to
see if the ray intersects the box which surrounds the height field. Before any
transformations, this box's two opposite vertexes are at (0, water_level, 0)
and (1, 1, 1). If the box is intersected, the ray tracer figures out where, and
then follows the line from where the ray enters the box to where it leaves the
box, checking each pixel it crosses for an intersection.
It checks the pixel by dividing it up into two triangles. The height vertex of
the triangle is determined by the color index at the corresponding position in
the GIF, POT, or TGA file.
If your file has a uses the color map randomly, your height field is going to
look pretty chaotic, with tall, thin spikes shooting up all over the place. Not
every GIF will make a good height field.
If you want to get an idea of what your height field will look like, I
recommend using the IBM-PC program Fractint's 3d projection features to do a
sort of preview. If it doesn't look good there, the ray tracer isn't going to
fix it. For those of you who can't use Fractint, convert the image palette to a
gray scale from black at entry 0 to white at entry 255 with smooth steps of
gray in-between. The dark parts will lower than the brighter parts, so you can
get a feel for how the image will look as a height field.
ΓòÉΓòÉΓòÉ 6.2.2. 5.2.2 Finite Patch Primitives ΓòÉΓòÉΓòÉ
There are 4 totally thin, finite objects which have NO well-defined inside.
They may be combined in CSG union but cannot be use in other types of CSG. They
are bicubic_patch, disc, smooth_triangle and triangle. Because these types are
finite, POV-Ray can use automatic bounding on them to speed up rendering time.
ΓòÉΓòÉΓòÉ 6.2.2.1. 5.2.2.1 Triangle and Smooth_triangle ΓòÉΓòÉΓòÉ
The triangle primitive is available in order to make more complex objects than
the built-in shapes will permit. Triangles are usually not created by hand,
but are converted from other files or generated by utilities.
A triangle is defined by:
triangle { <CORNER1>, <CORNER2>, <CORNER3> }
where <CORNERn> is a vector defining the x,y,z coordinates of each corner of
the triangle.
Because triangles are perfectly flat surfaces it would require extremely large
numbers of very small triangles to approximate a smooth, curved surface.
However much of our perception of smooth surfaces is dependent upon the way
light and shading is done. By artificially modifying the surface normals we
can simulate as smooth surface and hide the sharp-edged seams between
individual triangles.
The smooth_triangle primitive is used for just such purposes. The
smooth_triangles use a formula called Phong normal interpolation to calculate
the surface normal for any point on the triangle based on normal vectors which
you define for the three corners. This makes the triangle appear to be a
smooth curved surface. A smooth_triangle is defined by:
smooth_triangle {
<CORNER1>, <NORMAL1>,
<CORNER2>, <NORMAL2>,
<CORNER3>, <NORMAL3>
}
where the corners are defined as in regular triangles and <NORMALn> is a vector
describing the direction of the surface normal at each corner.
These normal vectors are prohibitively difficult to compute by hand. Therefore
smooth_triangles are almost always generated by utility programs. To achieve
smooth results, any triangles which share a common vertex should have the same
normal vector at that vertex. Generally the smoothed normal should be the
average of all the actual normals of the triangles which share that point.
ΓòÉΓòÉΓòÉ 6.2.2.2. 5.2.2.2 Bicubic_patch ΓòÉΓòÉΓòÉ
A bicubic patch is a 3D curved surface created from a mesh of triangles.
POV-Ray supports a type of bicubic patch called a Bezier patch. A bicubic
patch is defined as follows:
bicubic_patch {
type PATCH_TYPE
flatness FLATNESS_VALUE
u_steps NUM_U_STEPS
v_steps NUM_V_STEPS
<CP1>, <CP2>, <CP3>, <CP4>,
<CP5>, <CP6>, <CP7>, <CP8>,
<CP9>, <CP10>, <CP11>, <CP12>,
<CP13>, <CP14>, <CP15>, <CP16>
}
The keyword "type" is followed by a float PATCH_TYPE which currently must be
either 0 or 1. For type 0 only the control points are retained within POV-Ray.
This means that a minimal amount of memory is needed, but POV-Ray will need to
perform many extra calculations when trying to render the patch. Type 1
preprocesses the patch into many subpatches. This results in a significant
speedup in rendering, at the cost of memory.
These 4 parameters: type, flatness, u_steps & v_steps, may appear in any order.
They are followed by 16 vectors that define the x,y,z coordinates of the 16
control points which define the patch. The patch touches the 4 corner points
<CP1>, <CP4>, <CP13> and <CP16> while the other 12 points pull and stretch the
patch into shape.
The keywords "u_steps" and "v_steps" are each followed by float values which
tell how many rows and columns of triangles are the minimum to use to create
the surface. The maximum number of individual pieces of the patch that are
tested by POV-Ray can be calculated from the following:
sub-pieces = 2^u_steps * 2^v_steps
This means that you really should keep "u_steps" and "v_steps" under 4 or 5.
Most patches look just fine with "u_steps 3" and "v_steps 3", which translates
to 64 subpatches (128 smooth triangles).
As POV-Ray processes the Bezier patch, it makes a test of the current piece of
the patch to see if it is flat enough to just pretend it is a rectangle. The
statement that controls this test is: "flatness xxx". Typical flatness values
range from 0 to 1 (the lower the slower).
If the value for flatness is 0, then POV-Ray will always subdivide the patch to
the extend specified by u_steps and v_steps. If flatness is greater than 0,
then every time the patch is split, POV-Ray will check to see if there is any
need to split further.
There are both advantages and disadvantages to using a non-zero flatness. The
advantages include:
o If the patch isn't very curved, then this will be detected and POV-Ray won't
waste a lot of time looking at the wrong pieces.
o If the patch is only highly curved in a couple of places, POV-Ray will keep
subdividing there and concentrate it's efforts on the hard part.
The biggest disadvantage is that if POV-Ray stops subdividing at a particular
level on one part of the patch and at a different level on an adjacent part of
the patch, there is the potential for "cracking". This is typically visible as
spots within the patch where you can see through. How bad this appears depends
very highly on the angle at which you are viewing the patch.
Like triangles, the bicubic patch is not meant to be generated by hand. These
shapes should be created by a special utility. You may be able to acquire
utilities to generate these shapes from the same source from which you obtained
POV-Ray.
Example:
bicubic_patch {
type 1
flatness 0.01
u_steps 4
v_steps 4
<0, 0, 2>, <1, 0, 0>, <2, 0, 0>, <3, 0,-2>,
<0, 1 0>, <1, 1, 0>, <2, 1, 0>, <3, 1, 0>,
<0, 2, 0>, <1, 2, 0>, <2, 2, 0>, <3, 2, 0>,
<0, 3, 2>, <1, 3, 0>, <2, 3, 0>, <3, 3, -2>
}
The triangles in a POV-Ray bicubic_patch are automatically smoothed using
normal interpolation but it is up to the user (or the user's utility program)
to create control points which smoothly stitch together groups of patches.
As with the other shapes, bicubic_patch objects can be translated, rotated, and
scaled. Because they are finite they respond to automatic bounding. Since it's
made from triangles, a bicubic_patch cannot be used in CSG intersection or
difference types or inside a clipped_by modifier because triangles have no
clear "inside". The CSG union type works acceptably.
ΓòÉΓòÉΓòÉ 6.2.2.3. 5.2.2.3 Disc ΓòÉΓòÉΓòÉ
One other flat, finite object type is available with POV-Ray. Note that a disc
is infinitely thin. It has no thickness. If you want a disc with true
thickness you should use a very short cylinder. A disc shape may be defined by:
disc { <CENTER>, <NORMAL>, RADIUS }
or
disc { <CENTER>, <NORMAL>, RADIUS, HOLE_RADIUS }
The vector <CENTER> defines the x,y,z coordinates of the center of the disc.
The <NORMAL> vector describes its orientation by describing its surface normal
vector. This is followed by a float specifying the RADIUS. This may be
optionally followed by another float specifying the radius of a hole to be cut
from the center of the disc.
Example:
disc {
<-2,-0.5, 0>, //center location
<0, 1, 0>, //normal vector
2 //radius
pigment { color Cyan }
}
disc {
<0, 1, 0>, //center location
<-1, 3, -2>, //normal vector
1.5, //radius
0.5 //hole radius (optional)
pigment { color Yellow }
}
As with the other shapes, discs can be translated, rotated, and scaled. Because
they are finite they respond to automatic bounding. Disc cannot be used in CSG
intersection or difference types or inside a clipped_by modifier because it has
no clear "inside". The CSG union type works acceptably.
ΓòÉΓòÉΓòÉ 6.2.3. 5.2.3 Infinite Solid Primitives ΓòÉΓòÉΓòÉ
There are 5 polynomial primitive shapes that are possibly infinite and do not
respond to automatic bounding. They do have a well defined inside and may be
used in CSG. They are plane, cubic, poly, quadric, and quartic.
ΓòÉΓòÉΓòÉ 6.2.3.1. 5.2.3.1 Plane ΓòÉΓòÉΓòÉ
The plane primitive is a fast, efficient way to define an infinite flat
surface. The plane is specified as follows:
plane { <NORMAL>, DISTANCE }
The <NORMAL> vector defines the surface normal of the plane. A surface normal
is a vector which points up from the surface at a 90 degree angle. This is
followed by a float value that gives the distance along the normal that the
plane is from the origin. For example:
plane { <0,1,0>,4 }
This is a plane where "straight up" is defined in the positive y direction. The
plane is 4 units in that direction away from the origin. Because most planes
are defined with surface normals in the direction of an axis, you will often
see planes defined using the "x", "y", or "z" built-in vector identifiers. The
example above could be specified as:
plane { y,4 }
The plane extends infinitely in the x and z directions. It effectively divides
the world into two pieces. By definition the normal vector points to the
outside of the plane while any points away from the vector are defined as
inside. This inside/outside distinction is only important when using planes in
CSG.
As with the other shapes, planes can be translated, rotated, and scaled.
Because they are infinite they do not respond to automatic bounding. Plane can
be used freely in CSG because it has a clear defined "inside".
A plane is called a "polynomial" shape because it is defined by a first order
polynomial equation. Given a plane:
plane { <A, B, C>, D }
it can be represented by the formula:
A*x + B*y + C*z = D
Therefore our example "plane {y,4}" is actually the polynomial equation "y=4".
You can think of this as a set of all x,y,z points where all have y values
equal to 4, regardless of the x or z values.
This equation is a "first order" polynomial because each term contains only
single powers of x, y or z. A second order equation has terms like x^2, y^2,
z^2, xy, xz and yz. Another name for a 2nd order equation is a quadric
equation. Third order polys are called cubics. A 4th order equation is a
quartic. Such shapes are described in the sections below.
5.2.3.2 Quadric
Quadric surfaces can produce shapes like ellipsoids, spheres, cones, cylinders,
paraboloids (dish shapes), and hyperboloids (saddle or hourglass shapes). NOTE:
Do not confuse "quaDRic" with "quaRTic". A quadric is a 2nd order polynomial
while a quartic is 4th order.
A quadric is defined in POV-Ray by:
quadric { <A,B,C>, <D,E,F>, <G,H,I>, J }
where A through J are float expressions.
This defines a surface of x,y,z points which satisfy the equation:
A x^2 + B y^2 + C z^2
+ D xy + E xz + F yz
+ G x + H y + I z + J = 0
Different values of A,B,C,...J will give different shapes. So, if you take any
three dimensional point and use its x, y, and z coordinates in the above
equation, the answer will be 0 if the point is on the surface of the object.
The answer will be negative if the point is inside the object and positive if
the point is outside the object. Here are some examples:
X^2 + Y^2 + Z^2 - 1 = 0 Sphere
X^2 + Y^2 - 1 = 0 Infinitely long cylinder along the Z axis
X^2 + Y^2 - Z^2 = 0 Infinitely long cone along the Z axis
The easiest way to use these shapes is to include the standard file
"SHAPES.INC" into your program. It contains several pre-defined quadrics and
you can transform these pre-defined shapes (using translate, rotate, and scale)
into the ones you want.
You can invoke them by using the syntax,
object { Quadric_Name }
The pre-defined quadrics are centered about the origin <0, 0, 0> and have a
radius of 1. Don't confuse radius with width. The radius is half the diameter
or width making the standard quadrics 2 units wide.
Some of the pre-defined quadrics are,
o Ellipsoid
o Cylinder_X, Cylinder_Y, Cylinder_Z
o QCone_X, QCone_Y, QCone_Z
o Paraboloid_X, Paraboloid_Y, Paraboloid_Z
For a complete list, see the file SHAPES.INC.
ΓòÉΓòÉΓòÉ 6.2.3.2. 5.2.3.3 Poly, Cubic and Quartic. ΓòÉΓòÉΓòÉ
Higher order polynomial surfaces may be defined by the use of a poly shape. The
syntax is:
poly { ORDER, <T1, T2, T3, .... Tm> }
Where ORDER is a whole number from 2 to 7 inclusively that specifies the order
of the equation. T1, T2... Tm are float values for the coefficients of the
equation. There are "m" such terms where
m=((ORDER+1)*(ORDER+2)*(ORDER+3))/6
An alternate way to specify 3rd order polys is:
cubic { <T1, T2,... T20> }
Also 4th order equations may be specified with:
quartic { <T1, T2,... T35> }
Here's a more mathematical description of quartics for those who are
interested. Quartic surfaces are 4th order surfaces, and can be used to
describe a large class of shapes including the torus, the lemniscate, etc. The
general equation for a quartic equation in three variables is (hold onto your
hat):
a00 x^4 + a01 x^3 y + a02 x^3 z+ a03 x^3 + a04 x^2 y^2+
a05 x^2 y z+ a06 x^2 y + a07 x^2 z^2+a08 x^2 z+a09 x^2+
a10 x y^3+a11 x y^2 z+ a12 x y^2+a13 x y z^2+a14 x y z+
a15 x y + a16 x z^3 + a17 x z^2 + a18 x z + a19 x+
a20 y^4 + a21 y^3 z + a22 y^3+ a23 y^2 z^2 +a24 y^2 z+
a25 y^2 + a26 y z^3 + a27 y z^2 + a28 y z + a29 y+
a30 z^4 + a31 z^3 + a32 z^2 + a33 z + a34
To declare a quartic surface requires that each of the coefficients (a0 -> a34)
be placed in order into a single long vector of 35 terms.
As an example let's define a torus the hard way. A Torus can be represented by
the equation:
x^4 + y^4 + z^4 + 2 x^2 y^2 + 2 x^2 z^2 + 2 y^2 z^2
-2 (r0^2 + r1^2) x^2 + 2 (r0^2 - r1^2) y^2
-2 (r0^2 + r1^2) z^2 + (r0^2 - r1^2)^2 = 0
Where r0 is the "major" radius of the torus - the distance from the hole of the
donut to the middle of the ring of the donut, and r1 is the "minor" radius of
the torus - the distance from the middle of the ring of the donut to the outer
surface. The following object declaration is for a torus having major radius
6.3 minor radius 3.5 (Making the maximum width just under 10).
//Torus having major radius sqrt(40), minor radius sqrt(12)
quartic {
< 1, 0, 0, 0, 2, 0, 0, 2, 0,
-104, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 2, 0, 56, 0,
0, 0, 0, 1, 0, -104, 0, 784 >
sturm
bounded_by { // bounded_by speeds up the render,
// see bounded_by
// explanation later
// in docs for more info.
sphere { <0, 0, 0>, 10 }
}
}
Poly, cubic and quartics are just like quadrics in that you don't have to
understand what one is to use one. The file SHAPESQ.INC has plenty of pre-
defined quartics for you to play with. The most common one is the torus or
donut. The syntax for using a pre-defined quartic is:
object { Quartic_Name }
As with the other shapes, these shapes can be translated, rotated, and scaled.
Because they are infinite they do not respond to automatic bounding. They can
be used freely in CSG because they have a clear defined "inside".
Polys use highly complex computations and will not always render perfectly. If
the surface is not smooth, has dropouts, or extra random pixels, try using the
optional keyword "sturm" in the definition. This will cause a slower, but more
accurate calculation method to be used. Usually, but not always, this will
solve the problem. If sturm doesn't work, try rotating, or translating the
shape by some small amount. See the sub-directory MATH for examples of polys in
scenes.
There are really so many different quartic shapes, we can't even begin to list
or describe them all. If you are interested and mathematically inclined, an
excellent reference book for curves and surfaces where you'll find more quartic
shape formulas is:
"The CRC Handbook of Mathematical Curves and Surfaces"
David von Seggern
CRC Press
1990
ΓòÉΓòÉΓòÉ 6.2.4. 5.2.4 Constructive Solid Geometry (CSG) ΓòÉΓòÉΓòÉ
POV-Ray supports Constructive Solid Geometry (also called Boolean operations)
in order to make the shape definition abilities more powerful.
ΓòÉΓòÉΓòÉ 6.2.4.1. 5.2.4.1 About CSG ΓòÉΓòÉΓòÉ
The simple shapes used so far are nice, but not terribly useful on their own
for making realistic scenes. It's hard to make interesting objects when you're
limited to spheres, boxes, cylinders, planes, and so forth.
Constructive Solid Geometry (CSG) is a technique for taking these simple
building blocks and combining them together. You can use a cylinder to bore a
hole through a sphere. You can start with solid blocks and carve away pieces.
Objects may be combined in groups and treated as though they were single
objects.
Constructive Solid Geometry allows you to define shapes which are the union,
intersection, or difference of other shapes. Additionally you may clip
sections of objects revealing their hollow interiors.
Unions superimpose two or more shapes. This has the same effect as defining two
or more separate objects, but is simpler to create and/or manipulate. In
POV-Ray 2.0 the union keyword may be used anyplace composite was used in
previous versions of POV-Ray. Also a new type of union called "merge" can
eliminate internal surfaces on transparent or clipped objects.
Intersections define the space where the two or more surfaces overlap.
Differences allow you to cut one object out of another.
CSG intersections, unions, and differences can consist of two or more shapes.
For example:
union {
object{O1}
object{O2}
object{O3} // any number of objects
texture{T1}
}
CSG shapes may be used in CSG shapes. In fact, CSG shapes may be used anyplace
that a standard shape is used.
The order of the component shapes with the CSG doesn't matter except in a
difference shape. For CSG differences, the first shape is visible and the
remaining shapes are cut out of the first.
Constructive solid geometry shapes may be translated, rotated, or scaled in the
same way as any shape. The shapes making up the CSG shape may be individually
translated, rotated, and scaled as well.
When using CSG, it is often useful to invert a shape so that it's inside- out.
The appearance of the shape is not changed, just the way that POV-Ray perceives
it. The inverse keyword can be used to do this for any shape. When inverse is
used, the "inside" of the shape is flipped to become the "outside". For planes,
"inside" is defined to be "in the opposite direction to the "normal" or "up"
direction.
Note that performing an intersection between a shape and some other inverse
shapes is the same as performing a difference. In fact, the difference is
actually implemented in this way in the code.
ΓòÉΓòÉΓòÉ 6.2.4.2. 5.2.4.2 Inside and outside ΓòÉΓòÉΓòÉ
Most shape primitives, like spheres, boxes, and blobs, divide the world into
two regions. One region is inside the surface and one is outside. (The
exceptions to this rule are triangles, disc and bezier patches - we'll talk
about this later.)
Given any point in space, you can say it's either inside or outside any
particular primitive object (well, it could be exactly on the surface, but
numerical inaccuracies will put it to one side or the other).
Even planes have an inside and an outside. By definition, the surface normal of
the plane points towards the outside of the plane. (For a simple floor, for
example, the space above the floor is "outside" and the space below the floor
is "inside". For simple floors this in un-important, but for planes as parts of
CSG's it becomes much more important). CSG uses the concepts of inside and
outside to combine shapes together. Take the following situation:
Note: The diagrams shown here demonstrate the concepts in 2D and are intended
only as an analogy to the 3D case.
Note that the triangles and triangle-based shapes cannot be used as solid
objects in CSG since they have no clear inside and outside.
In this diagram, point 1 is inside object A only. Point 2 is inside B only.
Point 3 is inside both A and B while point 0 is outside everything.
* = Object A
% = Object B
* 0
* * %
* * % %
* *% %
* 1 %* %
* % * 2 %
* % 3 * %
*******%******* %
% %
%%%%%%%%%%%%%%%%%
Complex shapes may be created by combining other shapes using a technique
called "Constructive Solid Geometry" (or CSG for short). The CSG shapes are
difference, intersection, and union. The following gives a simple 2D overview
of how these functions work.
ΓòÉΓòÉΓòÉ 6.2.4.3. 5.2.4.3 Union ΓòÉΓòÉΓòÉ
Unions are simply "glue", used bind two or more shapes into a single entity
that can be manipulated as a single object. The diagram above shows the union
of A and B. The new object created by the union operation can then be scaled,
translated, and rotated as a single shape. The entire union can share a single
texture, but each object contained in the union may also have its own texture,
which will override any matching texture statements in the parent object:
union {
sphere { <0, 0.5, 0> 1 pigment { Red } }
sphere { <0, 0.0, 0> 1 }
sphere { <0,-0.5, 0> 1 }
pigment { Blue }
finish { Shiny }
}
This union will contain three spheres. The first sphere is explicitly colored
Red while the other two will be shiny blue. Note that the shiny finish does NOT
apply to the first sphere. This is because the "pigment{Red}" is actually
shorthand for "texture{pigment{Red}}". It attaches an entire texture with
default normals and finish. The textures or pieces of textures attached to the
union apply ONLY to components with no textures. These texturing rules also
apply to intersection, difference and merge as well.
Earlier versions of POV-Ray placed restrictions on unions so you often had to
combine objects with composite statements. Those earlier restrictions have
been lifted so composite is no longer needed. Composite is still supported for
backwards compatibility but it is recommended that union now be used in it's
place since future support for the composite keyword is not guarantied.
ΓòÉΓòÉΓòÉ 6.2.4.4. 5.2.4.4 Intersection ΓòÉΓòÉΓòÉ
A point is inside the intersection if it's inside both A AND B. This "logical
AND's" the shapes and gets the common part, most useful for "cutting" infinite
shapes off. The diagram below consists of only those parts common to A and B.
%*
% *
% 3 *
%*******
For example:
intersection {
sphere {<-0.75,0,0>,1}
sphere {< 0.75,0,0>,1}
pigment {Yellow}
}
ΓòÉΓòÉΓòÉ 6.2.4.5. 5.2.4.5 Difference ΓòÉΓòÉΓòÉ
A point is inside the difference if it's inside A but not inside B. The results
is a "subtraction" of the 2nd shape from the first shape:
*
* *
* *
* *
* 1 %
* %
* %
*******%
For example:
difference {
sphere {<-0.75,0,0>,1}
sphere {< 0.75,0,-0.25>,1}
pigment {Yellow}
}
ΓòÉΓòÉΓòÉ 6.2.4.6. 5.2.4.6 Merge ΓòÉΓòÉΓòÉ
As can be seen in the diagram for union, the inner surfaces where the objects
overlap is still present. On transparent or clipped objects these inner
surfaces cause problems. A merge object works just like union but it
eliminates the inner surfaces like this:
*
* * %
* * % %
* *% %
* %
* %
* %
*******% %
% %
%%%%%%%%%%%%%%%%%
ΓòÉΓòÉΓòÉ 6.2.5. 5.2.5 Light Sources ΓòÉΓòÉΓòÉ
The last object we'll cover is the light source. Light sources have no visible
shape of their own. They are just points or areas which emit light.
ΓòÉΓòÉΓòÉ 6.2.5.1. 5.2.5.1 Point Lights ΓòÉΓòÉΓòÉ
Most light sources are infinitely small points which emit light. Point light
sources are treated like shapes, but they are invisible points from which light
rays stream out. They light objects and create shadows and highlights. Because
of the way ray tracing works, lights do not reflect from a surface. You can
use many light sources in a scene, but each light source used will increase
rendering time. The brightness of a light is determined by its color. A bright
color is a bright light, a dark color, a dark one. White is the brightest
possible light, Black is completely dark and Gray is somewhere in the middle.
The syntax for a light source is:
light_source { <X, Y, Z> color red #, green #, blue #}
Where X, Y and Z are the coordinates of the location and "color" is any color
or color identifier. For example,
light_source { <3, 5, -6> color Gray50}
is a 50% Gray light at X=3, Y=5, Z=-6.
Point light sources in POV-Ray do not attenuate, or get dimmer, with distance.
ΓòÉΓòÉΓòÉ 6.2.5.2. 5.2.5.2 Spotlights ΓòÉΓòÉΓòÉ
A spotlight is a point light source where the rays of light are constrained by
a cone. The light is bright in the center of the spotlight and falls
off/darkens to soft shadows at the edges of the circle.
The syntax is:
Syntax: light_source { <CENTER>
color red #, green #, blue #
spotlight
point_at <POINT>
radius #
falloff #
tightness #
}
A spotlight is positioned using two vectors. The first vector is the usual
<CENTER> vector that you would use to position a point light source.
The second vector is the point_at <POINT>, the vector position of the point the
light is pointing at, similar to the look_at in a camera description.
The following illustrations will be helpful in understanding how these values
relate to each other:
(+) Spotlight <center>
/ \
/ \
/ \
/ \
/ \
/ \
+-----*-----+
^ point_at <point>
The center is specified the same way as a normal point light_source.
Point_at <POINT> is the location that the cone of light is aiming at.
Spotlights also have three other parameters: radius, falloff, and tightness.
If you think of a spotlight as two nested cones, the inner cone would be
specified by the radius parameter, and would be fully lit. The outer cone
would be the falloff cone and beyond it would be totally unlit. The values for
these two parameters are specified in degrees of the half angle at the peak of
each cone:
(+) Spotlight <center>
|\ <----- angle measured here
| \
|| \
|| \ shaded area = radius cone
||| \ outer line = falloff cone
|||| \
||||| \
+-------+
The radius# is the radius, in degrees, of the bright circular hotspot at the
center of the spotlight's area of affect.
The falloff# is the falloff angle of the radius of the total spotlight area, in
degrees. This is the value where the light "falls off" to zero brightness.
Falloff should be larger than the radius. Both values should be between 1 and
180.
The tightness value specifies how quickly the light dims, or falls off, in the
region between the radius (full brightness) cone and the falloff (full
darkness) cone. The default value for tightness is 10. Lower tightness values
will make the spot have very soft edges. High values will make the edges
sharper, the spot "tighter". Values from 1 to 100 are acceptable.
Spotlights may used anyplace that a normal light source is used. Like normal
light sources, they are invisible points. They are treated as shapes and may be
included in CSG shapes. They may also be used in conjunction with area_lights.
Example:
// This is the spotlight.
light_source {
<10, 10, 0>
color red 1, green 1, blue 0.5
spotlight
point_at <0, 1, 0>
tightness 50
radius 11
falloff 25
}
ΓòÉΓòÉΓòÉ 6.2.5.3. 5.2.3.3 Area Lights ΓòÉΓòÉΓòÉ
Regular light sources in POV-Ray are modeled as point light sources, that is
they emit light from a single point in space. Because of this the shadows
created by these lights have the characteristic sharp edges that most of us are
use to seeing in ray traced images. The reason for the distinct edges is that a
point light source is either fully in view or it is fully blocked by an object.
A point source can never be partially blocked.
Area lights on the other hand occupy a finite area of space. Since it is
possible for an area light to be partially blocked by an object the shadows
created will have soft or "fuzzy" edges. The softness of the edge is dependent
on the dimensions of the light source and it's distance from the object casting
the shadow.
The area lights used in POV-Ray are rectangular in shape, sort of like a flat
panel light. Rather than performing the complex calculations that would be
required to model a true area light, POV-Ray approximates an area light as an
array of "point" light sources spread out over the area occupied by the light.
The intensity of each individual point light in the array is dimmed so that the
total amount of light emitted by the light is equal to the light color
specified in the declaration.
Syntax:
light_source {
<X, Y, Z> color red # green # blue #
area_light <X1, Y1, Z1>, <X2, Y2, Z2>, N1, N2
adaptive #
jitter
[optional spotlight parameters]
}
The light's location and color are specified in the same way as a regular light
source.
The area_light command defines the size and orientation of the area light as
well as the number of lights in the light source array. The vectors <X1,Y1,Z1>
and <X2,Y2,Z2> specify the lengths and directions of the edges of the light.
Since the area lights are rectangular in shape these vectors should be
perpendicular to each other. The larger the size of the light the thicker that
the soft part of the shadow will be. The numbers N1 and N2 specify the
dimensions of the array of point lights. The larger the number of lights you
use the smoother your shadows will be but the longer they will take to render.
The adaptive command is used to enable adaptive sampling of the light source.
By default POV-Ray calculates the amount of light that reaches a surface from
an area light by shooting a test ray at every point light within the array. As
you can imagine this is VERY slow. Adaptive sampling on the other hand attempts
to approximate the same calculation by using a minimum number of test rays. The
number specified after the keyword controls how much adaptive sampling is used.
The higher the number the more accurate your shadows will be but the longer
they will take to render. If you're not sure what value to use a good starting
point is 'adaptive 1'. The adaptive command only accepts integer values and
cannot be set lower than 0. Adaptive sampling is explained in more detail
later.
The jitter command is optional. When used it causes the positions of the point
lights in the array to be randomly jittered to eliminate any shadow banding
that may occur. The jittering is completely random from render to render and
should not be used when generating animations.
Note: It's possible to specify spotlight parameters along with area_light
parameters to create "area spotlights." Using area spotlights is a good way to
speed up scenes that use area lights since you can confine the lengthy soft
shadow calculations to only the parts of your scene that need them.
Example:
light_source {
<0, 50, 0> color White
area_light <5, 0, 0>, <0, 0, 10>, 5, 5
adaptive 1
jitter
}
This defines an area light that extends 5 units along the x axis and 10 units
along the z axis and is centered at the location <0,50,0>. The light consists
of a 5 by 5 jittered array of point sources for a total of 25 point lights. A
minimum of 9 shadow rays will be used each time this light is tested.
/ * * * * *
/ * * * * * Y
<0,0,10> / * * * * * | Z
/ * * * * * | /
/ * * * * * | /
+-----------> +------X
<5,0,0>
An interesting effect that can be created using area lights is a linear light.
Rather than having a rectangular shape, a linear light stretches along a line
sort of like a thin fluorescent tube. To create a linear light just create an
area light with one of the array dimensions set to 1.
Example:
light_source {
<0, 50, 0> color White
area_light <40, 0, 0>, <0, 0, 1>, 100, 1
adaptive 4
jitter
}
This defines a linear light that extends from <-40/2,50,0> to <+40/2,50,0> and
consists of 100 point sources along it's length. The vector <0,0,1> is ignored
in this case since a linear light has no width. Note: If the linear light is
fairly long you'll usually need to set the adaptive parameter fairly high as in
the above example.
When performing adaptive sampling POV-Ray starts by shooting a test ray at each
of the four corners of the area light. If the amount of light received from all
four corners is approximately the same then the area light is assumed to be
either fully in view or fully blocked. The light intensity is then calculated
as the average intensity of the light received from the four corners. However,
if the light intensity from the four corners differs significantly then the
area light is partially blocked. The light is the split into four quarters and
each section is sampled as described above. This allows POV-Ray to rapidly
approximate how much of the area light is in view without having to shoot a
test ray at every light in the array.
While the adaptive sampling method is fast (relatively speaking) it can
sometimes produces inaccurate shadows. The solution is to reduce the amount of
adaptive sampling without completely turning it off. The number after the
adaptive keyword adjusts the number of times that the area light will be split
before the adaptive phase begins. For example if you use "adaptive 0" a minimum
of 4 rays will be shot at the light. If you use "adaptive 1" a minimum of 9
rays will be shot (adaptive 2 = 25 rays, adaptive 3 = 81 rays, etc). Obviously
the more shadow rays you shoot the slower the rendering will be so you should
use the lowest value that gives acceptable results.
The number of rays never exceeds the values you specify for rows and columns of
points. For example: area_light x,y,4,4 specifies a 4 by 4 array of lights.
If you specify adaptive 3 it would mean that you should start with a 5 by 5
array. In this case no adaptive sampling is done. The 4 by 4 array is used.
ΓòÉΓòÉΓòÉ 6.2.5.4. 5.2.3.4 Looks_like ΓòÉΓòÉΓòÉ
Normally the light source itself has no visible shape. The light simply
radiates from an invisible point or area. You may give a light source a any
shape by adding a "looks_like{OBJECT}" statement. For example:
light_source {
<100,200,-300> color White
looks_like {sphere{<0,0,0>,1 texture{T1}}
}
This creates a visible sphere which is automatically translated to the light's
location <100,200,-300> even though the sphere has <0,0,0> as its center.
There is an implied "no_shadow" also attached to the sphere so that light is
not blocked by the sphere. Without the automatic no_shadow, the light inside
the sphere would not escape. The sphere would, in effect, cast a shadow over
everything.
If you want the attached object to block light then you should attach it with a
union and not a looks_like as follows:
union {
light_source {<100,200,-300> color White}
object {My_Lamp_Shade}
}
Presumably parts of the lamp shade are open to let SOME light out.
ΓòÉΓòÉΓòÉ 6.3. 5.3 Object Modifiers ΓòÉΓòÉΓòÉ
A variety of modifiers may be attached to objects. Transformations such as
translate, rotate and scale have already been discussed. Textures are in a
section of their own below. Here are three other important modifiers:
clipped_by, bounded_by and no_shadow. Although the examples below use object
statements and object identifiers, these modifiers may be used on any type of
object such as sphere, box etc.
ΓòÉΓòÉΓòÉ 6.3.1. 5.3.1 Clipped_By ΓòÉΓòÉΓòÉ
The "clipped_by" statement is technically an object modifier but it provides a
type of CSG similar to CSG intersection. You attach a clipping object like
this:
object {
My_Thing
clipped_by{plane{y,0}}
}
Every part of the object "My_Thing" that is inside the plane is retained while
the remaining part is clipped off and discarded. In an intersection object,
the hole is closed off. With clipped_by it leaves an opening. For example
this diagram shows our object "A" being clipped_by a plane{y,0}.
* *
* *
* *
***************
Clipped_by may be used to slice off portions of any shape. In many cases it
will also result in faster rendering times than other methods of altering a
shape.
Often you will want to use the clipped_by and bounded_by options with the same
object. The following shortcut saves typing and uses less memory.
object {
My_Thing
bounded_by{box{<0,0,0>,<1,1,1>}}
clipped_by{bounded_by}
}
This tells POV-Ray to use the same box as a clip that was used as a bounds.
ΓòÉΓòÉΓòÉ 6.3.2. 5.3.1 Bounded_By ΓòÉΓòÉΓòÉ
The calculations necessary to test if a ray hits an object can be quite time
consuming. Each ray has to be tested against every object in the scene.
POV-Ray attempts so speed up the process by building a set of invisible boxes,
called bounding slabs, which cluster the objects together. This way a ray that
travels in one part of the scene doesn't have to be tested against objects in
another far away part of the scene. When large number objects are present the
slabs are nested inside each other. POV-Ray can use slabs on any finite
object. However infinite objects such as plane, quadric, quartic, cubic & poly
cannot be automatically bound. Also CSG objects cannot be efficiently bound by
automatic methods. By attaching a bounded_by statement to such shapes you can
speed up the testing of the shape and make it capable of using bounding slabs.
If you use bounding shapes around any complex objects you can speed up the
rendering. Bounding shapes tell the ray tracer that the object is totally
enclosed by a simple shape. When tracing rays, the ray is first tested against
the simple bounding shape. If it strikes the bounding shape, then the ray is
further tested against the more complicated object inside. Otherwise the entire
complex shape is skipped, which greatly speeds rendering.
To use bounding shapes, simply include the following lines in the declaration
of your object:
bounded_by {
object { ... }
}
An example of a Bounding Shape:
intersection {
sphere {<0,0,0>, 2}
plane {<0,1,0>, 0}
plane {<1,0,0>, 0}
bounded_by {sphere {<0,0,0>, 2}}
}
The best bounding shape is a sphere or a box since these shapes are highly
optimized, although, any shape may be used. If the bounding shape is itself a
finite shape which responds to bounding slabs then the object which it encloses
will also be used in the slab system.
CSG shapes can benefit from bounding slabs without a bounded_by statement
however they may do so inefficiently in intersection, difference and merge. In
these three CSG types the automatic bound used covers all of the component
objects in their entirety. However the result of these intersections may
result in a smaller object. Compare the sizes of the illustrations for union
and intersection in the CSG section above. It is possible to draw a much
smaller box around the intersection of A and B than the union of A and B yet
the automatic bounds are the size of union{A B} regardless of the kind of CSG
specified.
While it is almost always a good idea to manually add a bounded_by to
intersection, difference and merge, it is often best to NOT bound a union. If a
union has no bounded_by and no clipped_by then POV-Ray can internally split
apart the components of a union and apply automatic bounding slabs to any of
its finite parts. Note that some utilities such as RAW2POV may be able to
generate bounds more efficiently than POV-Ray's current system. However most
unions you create yourself can be easily bounded by the automatic system. For
technical reasons POV-Ray cannot split a merge object. It is probably best to
hand bound a merge, especially if it is very complex.
Note that if bounding shape is too small or positioned incorrectly, it may clip
the object in undefined ways or the object may not appear at all. To do true
clipping, use clipped_by as explained above. Often you will want to use the
clipped_by and bounded_by options with the same object. The following shortcut
saves typing and uses less memory.
object {
My_Thing
clipped_by{box{<0,0,0>,<1,1,1>}}
bounded_by{clipped_by}
}
This tells POV-Ray to use the same box as a bounds that was used as a clip.
ΓòÉΓòÉΓòÉ 6.3.3. 5.3.2 No_Shadow ΓòÉΓòÉΓòÉ
You may specify the no_shadow keyword in object and that object will not cast a
shadow. This is useful for special effects and for creating the illusion that
a light source actually is visible. This keyword was necessary in earlier
versions of POV-Ray which did not have the "looks_like" statement. Now it is
useful for creating things like laser beams or other unreal effects.
Simply attach the keyword as follows:
object {
My_Thing
no_shadow
}
ΓòÉΓòÉΓòÉ 6.4. 5.4 Textures ΓòÉΓòÉΓòÉ
Textures are the materials from which the objects in POV-Ray are made. They
specifically describe the surface coloring, shading, and properties like
transparency and reflection.
You can create your own textures using the parameters described below, or you
can use the many pre-defined high quality textures that have been provided in
the files TEXTURES.INC and STONES.INC. The tutorial in section 4 above
introduces the basics of defining textures and attaching them to objects. It
explains how textures are made up of three portions, a color pattern called
"pigment", a bump pattern called "normal", and surface properties called
"finish".
The most complete form for defining a texture is as follows:
texture {
TEXTURE_IDENTIFIER
pigment {...}
normal {...}
finish {...}
TRANSFORMATIONS...
}
Each of the items in a texture are optional but if they are present, the
identifier must be first and the transformations bust be last. The pigment,
normal and finish parameters modify any pigment, normal and finish already
specified in the TEXTURE_IDENTIFIER. If no texture identifier is specified
then the pigment, normal and finish statements modify the current default
values. TRANSFORMATIONs are translate, rotate and scale statements. They
should be specified last.
The sections below describe all of the options available in pigments, normals
and finishes.
ΓòÉΓòÉΓòÉ 6.4.1. 5.4.1 Pigment ΓòÉΓòÉΓòÉ
The color or pattern of colors for an object is defined by a pigment statement.
A pigment statement is part of a texture specification. However it can be
tedious to type "texture{pigment{...}}" just to add a color to an object.
Therefore you may attach a pigment directly to an object without explicitly
specifying that it as part of a texture. For example...
this... can be shortened to this...
object { object {
My_Object My_Object
texture { pigment {color Purple}
pigment {color Purple} }
}
}
The color you define is the way you want it to look if fully illuminated. You
pick the basic color inherent in the object and POV-Ray brightens or darkens it
depending on the lighting in the scene. The parameter is called "pigment"
because we are defining the basic color the object actually IS rather than how
it LOOKS.
The most complete form for defining a pigment is as follows:
pigment {
PIGMENT_IDENTIFIER
PATTERN_TYPE
PIGMENT_MODIFIERS
TRANSFORMATIONS...
}
Each of the items in a pigment are optional but if they are present, they
should be in the order shown above to insure that the results are as expected.
Any items after the PIGMENT_IDENTIFIER modify or override settings given in the
IDENTIFIER. If no identifier is specified then the items modify the pigment
values in the current default texture. TRANSFORMATIONs are translate, rotate
and scale statements. They apply only to the pigment and not to other parts of
the texture. They should be specified last.
The various PATTERN_TYPEs fall into roughly 4 categories. Each category is
discussed below. They are solid color, color list patterns, color mapped
patterns and image maps.
ΓòÉΓòÉΓòÉ 6.4.1.1. 5.4.1.1 Color ΓòÉΓòÉΓòÉ
The simplest type of pigment is a solid color. To specify a solid color you
simply put a color specification inside a pigment. For example...
pigment {color Orange}
A color specification consists of the keyword "color" followed a color
identifier or by a specification of the amount or red, green, blue and
transparency in the surface. For example:
color red 0.5 green 0.2 blue 1.0
The float values between 0.0 and 1.0 are used to specify the intensity of each
primary color of light. Note that we use additive color primaries like the
color phosphors on a color computer monitor or TV. Thus....
color red 1.0 green 1.0 blue 1.0
...specifies full intensity of all primary colors which is white light. The
primaries may be given in any order and if any primary is unspecified its value
defaults to zero.
In addition to the primary colors a 4th value called "filter" specifies the
amount of transparency. For example a piece of red tinted cellophane might
have...
color red 1.0 filter 1.0
Lowering the filter value would let less light through. The default value if
no filter is specified is 0.0 or no transparency. Note that the example has an
implied "green 0.0 blue 0.0" which means that no green or blue light can pass
through. Often users mistakenly specify a clear object by...
color filter 1.0
but this has implied red, green and blue values of zero. You've just specified
a totally black filter so no light passes through. The correct way is...
color red 1.0 green 1.0 blue 1.0 filter 1.0
Note in earlier versions of POV-Ray the keyword "alpha" was used for
transparency. However common usage of "alpha" in this context usually means
that light passes through unaffected. In POV-Ray however, light is filtered
when it passes through a colored surface. The program works the same as it
always did but the keyword has been changed to make its meaning clearer.
A short-cut way to specify a color is...
color rgb<0.2, 0.5, 0.9>
or
color rgbf<0.2, 0.8, 1.0, 0.7>
Color specifications are used elsewhere in POV-Ray. Unless stated otherwise,
all of the above information on color specs given above applies to any color
spec.
Color identifiers may be declared. For examples see COLORS.INC. A color
identifier contains red, blue, green and filter values even if they are not
explicitly specified. For example:
color filter 1.0 My_Color // here My_Color overwrites the filter
color My_Color filter 1.0 // this changes My_Color's filter value to 1.0
When using a color specification to give an object a solid color pigment, the
keyword "color" may be omitted. For example...
pigment {red 1 blue 0.5}
or
pigment {My_Color}
are legal.
ΓòÉΓòÉΓòÉ 6.4.1.2. 5.4.1.2 Color List Patterns -- checker and hexagon ΓòÉΓòÉΓòÉ
Two of the simplest color patterns available are the checker and hexagon
patterns. These patterns take a simple list of colors one after the other. For
example a checker pattern is specified by...
pigment {checker color C1 color C2}
This produces a checkered pattern consisting of alternating squares of color C1
and C2. If no colors are specified then default blue and green colors are
used.
All color patterns in POV-Ray are 3 dimensional. For every x,y,z point in
space, the pattern has a unique color. In the case of a checker pattern it is
actually a series of cubes that are one unit in size. Imagine a bunch of 1
inch cubes made from two different colors of modeling clay. Now imagine
arranging the cubes in an alternating check pattern and stacking them in layer
after layer so that the colors still alternated in every direction. Eventually
you would have a larger cube. The pattern of checks on each side is what the
POV-Ray checker pattern produces when applied to a box object. Finally imagine
cutting away at the cube until it is carved into a smooth sphere or any other
shape. This is what the checker pattern would look like on an object of any
kind.
Color patterns do not wrap around the surfaces like putting wallpaper on an
object. The patterns exist in 3-d and the objects are carved from them like
carving stacked colored cubes. In a later section we describe wood and marble
patterns for example. The wood grain or stone swirls exist through the whole
object but they appear only at the surface.
Another pattern that uses a list of colors is the hexagon pattern. A hexagon
pattern is specified by...
pigment {hexagon color C1 color C2 color C3}
Hex pattern generates a repeating pattern of hexagons in the XZ plane. In this
instance imagine tall rods that are hexagonal in shape and are parallel to the
Y axis and grouped in bundles like this...
_____
/ \
/ C2 \_____
|\ / \
| \_____/ C3 \
| / \ /|
/ C1 \_____/ |
|\ /| | |
| \_____/ | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | |
| | | | |
| |
| |
The three colors will repeat the pattern shown above with hexagon C1 centered
at the origin. Each side of the hexagon is one unit long. The hexagonal
"rods" of color extend infinitely in the +Y and -Y directions. If no colors are
specified then default blue, green, and red colors are used.
ΓòÉΓòÉΓòÉ 6.4.1.3. 5.4.1.3 Color Mapped Patterns ΓòÉΓòÉΓòÉ
Most of the color patterns do not use abrupt color changes of just two or three
colors like those in the checker or hexagon patterns. They instead use smooth
transitions of many colors that gradually change from one point to the next.
The colors are defined in a color map that describes how the pattern blends
from one color to the next.
ΓòÉΓòÉΓòÉ 6.4.1.3.1. 5.4.1.3.1 Gradient ΓòÉΓòÉΓòÉ
This simplest such pattern is the "gradient" pattern. It is specified as
follows...
pigment {gradient VECTOR}
where VECTOR is a vector pointing in the direction that the colors blend. For
example:
sphere {
<0, 1, 2>, 2
pigment { gradient x } // bands of color vary as you move
// along the "x" direction.
}
This produces a series of smooth bands of color that look like layers of color
next to each other. Points at x=0 are black. As the X location increases it
smoothly turns to white at x=1. Then it starts over with black and gradually
turns white at x=2. The pattern reverses for negative values of X. Using
"gradient y" or "gradient z" makes the colors blend along the y or z axis. Any
vector may be used but x, y and z are most common.
ΓòÉΓòÉΓòÉ 6.4.1.3.2. 5.4.1.3.2 Color Maps ΓòÉΓòÉΓòÉ
The gray scale default colors of the gradient pattern isn't a very interesting
sight. The real power comes from specifying a color map to define how the
colors should blend.
Each of the various pattern types available is in fact a mathematical function
that takes any x,y,z location and turns it into a number between 0.0 and 1.0.
That number is used to specify what mix of colors to use from the color map.
A color map is specified by...
color_map {
[ NUM_1 color C1]
[ NUM_2 color C2]
[ NUM_3 color C3]
...
}
Where NUM_1, NUM_2... are float values between 0.0 and 1.0 inclusive. C1, C2
... are color specifications. NOTE: the [] brackets are part of the actual
statement. They are not notational symbols denoting optional parts. The
brackets surround each entry in the color map. There may be from 2 to 20
entries in the map.
For example,
sphere {
<0,1,2>, 2
pigment {
gradient x
color_map {
[0.1 color Red]
[0.3 color Yellow]
[0.6 color Blue]
[0.6 color Green]
[0.8 color Cyan]
}
}
}
The pattern function is evaluated and the result is a value from 0.0 to 1.0.
If the value is less than the first entry (in this case 0.1) then the first
color (Red) is used. Values from 0.1 to 0.3 use a blend of red and yellow
using linear interpolation of the two colors. Similarly values from 0.3 to 0.6
blend from yellow to blue. Note that the 3rd and 4th entries both have values
of 0.6. This causes an immediate abrupt shift of color from blue to green.
Specifically a value that is less than 0.6 will be blue but exactly equal to
0.6 will be green. Moving along, values from 0.6 to 0.8 will be a blend of
green and cyan. Finally any value greater than or equal to 0.8 will be cyan.
If you want areas of unchanging color you simply specify the same color for two
adjacent entries. For example:
color_map {
[0.1 color Red]
[0.3 color Yellow]
[0.6 color Yellow]
[0.8 color Green]
}
In this case any value from 0.3 to 0.6 will be pure yellow.
ΓòÉΓòÉΓòÉ 6.4.1.3.3. 5.4.1.3.3 Marble ΓòÉΓòÉΓòÉ
A "gradient x" pattern uses colors from the color map from 0.0 up to 1.0 at
location x=1 but then jumps back to the first color for x=1.00000001 (or some
tiny fraction above 1.0) and repeats the pattern again and again. The marble
pattern is similar except that it uses the color map from 0 to 1 but then it
reverses the map and blends from 1 back to zero. For example:
pigment {
gradient x
color_map {
[0.0 color Yellow]
[1.0 color Cyan]
}
}
This blends from yellow to cyan and then it abruptly changes back to yellow and
repeats. However replacing "gradient x" with "marble" smoothly blends from
yellow to cyan as the x coordinate goes from 0.0 to 0.5 and then smoothly
blends back from cyan to yellow by x=1.0.
When used with a "turbulence" modifier and an appropriate color map, this
pattern looks like veins of color of real marble, jade or other types of stone.
By default, marble has no turbulence.
ΓòÉΓòÉΓòÉ 6.4.1.3.4. 5.4.1.3.4 Wood ΓòÉΓòÉΓòÉ
Wood uses the color map to create concentric cylindrical bands of color
centered on the Z axis. These bands look like the growth rings and veins in
real wood. Small amounts of turbulence should be added to make it look more
realistic. By default, wood has no turbulence.
Like marble, wood uses color map values 0 to 1 then repeats the colors in
reverse order from 1 to 0.
ΓòÉΓòÉΓòÉ 6.4.1.3.5. 5.4.1.3.5 Onion ΓòÉΓòÉΓòÉ
Onion is a pattern of concentric spheres like the layers of an onion. It uses
colors from a color map from 0 to 1, 0 to 1 etc without reversing.
ΓòÉΓòÉΓòÉ 6.4.1.3.6. 5.4.1.3.6 Leopard ΓòÉΓòÉΓòÉ
Leopard creates regular geometric pattern of circular spots. It uses colors
from a color map from 0 to 1, 0 to 1 etc without reversing.
ΓòÉΓòÉΓòÉ 6.4.1.3.7. 5.4.1.3.7 Granite ΓòÉΓòÉΓòÉ
This pattern uses a simple 1/f fractal noise function to give a pretty darn
good granite pattern. Typically used with small scaling values (2.0 to 5.0).
This pattern is used with creative color maps in STONES.INC to create some
gorgeous layered stone textures. By default, granite has no turbulence. It
uses colors from a color map from 0 to 1, 0 to 1 etc without reversing.
ΓòÉΓòÉΓòÉ 6.4.1.3.8. 5.4.1.3.8 Bozo ΓòÉΓòÉΓòÉ
The bozo color pattern takes a noise function and maps it onto the surface of
an object. It uses colors from a color map from 0 to 1, 0 to 1 etc without
reversing.
Noise in ray tracing is sort of like a random number generator, but it has the
following properties:
1. It's defined over 3D space i.e., it takes x, y, and z and returns the noise
value there.
2. If two points are far apart, the noise values at those points are
relatively random.
3. If two points are close together, the noise values at those points are
close to each other.
You can visualize this as having a large room and a thermometer that ranges
from 0.0 to 1.0. Each point in the room has a temperature. Points that are far
apart have relatively random temperatures. Points that are close together have
close temperatures. The temperature changes smoothly, but randomly as we move
through the room.
Now, let's place an object into this room along with an artist. The artist
measures the temperature at each point on the object and paints that point a
different color depending on the temperature. What do we get? A POV-Ray bozo
texture!
ΓòÉΓòÉΓòÉ 6.4.1.3.9. 5.4.1.3.9 Spotted ΓòÉΓòÉΓòÉ
This uses the same noise pattern as bozo but it is unaffected by turbulence.
It uses colors from a color map from 0 to 1, 0 to 1 etc without reversing.
ΓòÉΓòÉΓòÉ 6.4.1.3.10. 5.4.1.3.10 Agate ΓòÉΓòÉΓòÉ
This pattern is very beautiful and similar to marble, but uses a different
turbulence function. The turbulence keyword has no effect, and as such it is
always very turbulent. You may control the amount of the built-in turbulence by
adding the "agate_turb" keyword followed by a float value. For example:
pigment {
agate
agate_turb 0.5
color_map {
...
}
}
ΓòÉΓòÉΓòÉ 6.4.1.3.11. 5.4.1.3.11 Mandel ΓòÉΓòÉΓòÉ
The mandel pattern computes the standard Mandelbrot fractal pattern and
projects it onto the X-Y plane. It uses the X and Y coordinates to compute the
Mandelbrot set. The pattern is specified with the keyword mandel followed by
an integer number. This number is the maximum number of iterations to be used
to compute the set. Typical values range from 10 up to 256 but any positive
integer may be used. For example:
sphere {
<0, 0, 0>, 1
pigment {
mandel 25
color_map {
[0.0 color Cyan]
[0.3 color Yellow]
[0.6 color Magenta]
[1.0 color Cyan]
}
scale .5
}
}
The value passed to the color map is computed by the formula:
value = number_of_iterations / max_iterations
The color extends infinitely in the Z direction similar to a planar image map.
ΓòÉΓòÉΓòÉ 6.4.1.3.12. 5.4.1.3.12 Radial ΓòÉΓòÉΓòÉ
The radial pattern is a radial blend that wraps around the +Y axis. The color
for value 0.0 starts at the +X direction and wraps the color map around from
east to west with 0.25 in the -Z direction, 0.5 in -X, 0.75 at +Z and back to
1.0 at +X. See the "frequency" and "phase" pigment modifiers below for
examples.
ΓòÉΓòÉΓòÉ 6.4.1.4. 5.4.1.4 Image Maps ΓòÉΓòÉΓòÉ
When all else fails and none of the above pigment pattern types meets your
needs, you can use an image map to wrap a 2-D bit-mapped image around your 3-D
objects.
ΓòÉΓòÉΓòÉ 6.4.1.4.1. 5.4.1.4.1 Specifying an image map. ΓòÉΓòÉΓòÉ
The syntax for image_map is...
pigment {
image_map {
FILE_TYPE "filename"
MODIFIERS...
}
}
Where FILE_TYPE is one of the following keywords "gif", "tga", "iff" or "dump".
This is followed by the name of the file in quotes. Several optional modifiers
may follow the file specification. The modifiers are described below. Note:
Earlier versions of POV-Ray allowed some modifiers before the FILE_TYPE but
that syntax is being phased out in favor of the syntax described here.
Filenames specified in the image_map statements will be searched for in the
home (current) directory first, and if not found, will then be searched for in
directories specified by any "-L" (library path) options active. This would
facilitate keeping all your image maps files in a separate subdirectory, and
giving an "-L" option on the command line to where your library of image maps
are.
By default, the image is mapped onto the X-Y plane. The image is "projected"
onto the object as though there were a slide projector somewhere in the -Z
direction. The image exactly fills the square area from x,y coordinates (0,0)
to (1,1) regardless of the image's original size in pixels. If you would like
to change this default, you may translate, rotate or scale the pigment or
texture to map it onto the object's surface as desired.
In the section 5.4.1.2 above when we explained checker pigment patterns, we
described the checks as solid cubes of colored clay from which objects are
carved. With image maps you should imagine that each pixel is a long, thin,
square, colored rod that extends parallel to the Z axis. The image is made
from rows and columns of these rods bundled together and the object is then
carved from the bundle.
If you would like to change this default orientation, you may translate, rotate
or scale the pigment or texture to map it onto the object's surface as desired.
ΓòÉΓòÉΓòÉ 6.4.1.4.2. 5.4.1.4.2 The "once" option. ΓòÉΓòÉΓòÉ
Normally there are an infinite number of repeating images created over every
unit square of the X-Y plane like tiles. By adding the keyword "once" after a
file name, you can eliminate all other copies of the image except the one at
(0,0) to (1,1). Areas outside this unit square are treated as fully
transparent.
Note: The "once" keyword may also be used with bump_map and material_map
statements.
ΓòÉΓòÉΓòÉ 6.4.1.4.3. 5.4.1.4.3 The "map_type" option. ΓòÉΓòÉΓòÉ
The default projection of the image onto the X-Y plane is called a "planar map
type". This option may be changed by adding the "map_type" keyword followed by
a number specifying the way to wrap the image around the object.
A "map_type 0" gives the default planar mapping already described.
A "map_type 1" is a spherical mapping. It assumes that the object is a sphere
of any size sitting at the origin. The Y axis is the north/south pole of the
spherical mapping. The top and bottom edges of the image just touch the pole
regardless of any scaling. The left edge of the image begins at the positive X
axis and wraps the image around the sphere from "west" to "east" in a -Y
rotation. The image covers the sphere exactly once. The "once" keyword has no
meaning for this type.
With "map_type 2" you get a cylindrical mapping. It assumes that a cylinder of
any diameter lies along the Y axis. The image wraps around the cylinder just
like the spherical map but the image remains 1 unit tall from y=0 to y=1. This
band of color is repeated at all heights unless the "once" keyword is applied.
Finally "map_type 5" is a torus or donut shaped mapping. It assumes that a
torus of major radius 1 sits at the origin in the X-Z plane. The image is
wrapped around similar to spherical or cylindrical maps. However the top and
bottom edges of the map wrap over and under the torus where they meet each
other on the inner rim.
Types 3 and 4 are still under development.
Note: The "map_type" option may also be applied to bump_map and material_map
statements.
ΓòÉΓòÉΓòÉ 6.4.1.4.4. 5.4.1.4.4 The "filter" options. ΓòÉΓòÉΓòÉ
To make all or part of an image map transparent, you can specify filter values
for the color palette/registers of GIF or IFF pictures (at least for the modes
that use palettes/color maps). You can do this by adding the keyword "filter"
following the filename. The keyword is followed by two numbers. The first
number is the palette/register number value and 2nd is the amount of
transparency. The values should be separated by a comma. For example:
image_map {
gif "mypic.gif"
map_type 0
filter 0, 0.5 // Make color 0 50% transparent
filter 5, 1.0 // Make color 5 100% transparent
filter 8, 0.3 // Make color 8 30% transparent
}
You can give the entire image a filter value using "filter all VALUE". For
example:
image_map {
gif "stnglass.gif"
map_type 0
filter all 0.9
}
NOTE: Transparency works by filtering light by its original color. Adding
"filter" to the color black still leaves you with black no matter how high the
filter value is. If you want a color to be clear, add filter 1 to the color
white.
ΓòÉΓòÉΓòÉ 6.4.1.4.5. 5.4.1.4.5 The "interpolate" option. ΓòÉΓòÉΓòÉ
Adding the "interpolate" keyword can smooths the jagged look of an image or
bump map. When POV-Ray asks a color or bump amount for an image or bump map,
it often asks for a point that is not directly on top of one pixel, but sort of
between several different colored pixels. Interpolations returns an
"in-between" value so that the steps between the pixels in the image or bump
map will look smoother.
There are currently two types of interpolation:
Normalized Distance -- interpolate 4
Bilinear -- interpolate 2
Default is no interpolation. Normalized distance is the slightly faster of the
two, bilinear does a better job of picking the between color. Normally,
bilinear is used.
If your bump or image map looks jaggy, try using interpolation instead of going
to a higher resolution image. The results can be very good. For example:
image_map {
gif "mypic.gif"
map_type 0
interpolate 2
}
ΓòÉΓòÉΓòÉ 6.4.1.5. 5.4.1.5 Pigment Modifiers ΓòÉΓòÉΓòÉ
After specifying the pigment type such as marble, wood etc and adding an
optional color map, you may add any of several modifiers.
ΓòÉΓòÉΓòÉ 6.4.1.5.1. 5.4.1.5.1 Turbulence ΓòÉΓòÉΓòÉ
The keyword "turbulence" followed by a float or vector may be used to stir up
the color pattern. Typical values range from the default 0.0 which is no
turbulence to 1.0 which is very turbulent. If a vector is specified then
different amounts of turbulence are applied in the x, y and z directions. For
example "turbulence <1.0, 0.6, 0.1>" has much turbulence in the x direction, a
moderate amount in the y direction and a small amount in the z direction.
Turbulence uses a noise function called DNoise. This is sort of like noise
used in the bozo pattern except that instead of giving a single value it gives
a direction. You can think of it as the direction that the wind is blowing at
that spot.
Turbulence which uses DNoise to push a point around a few times. We locate the
point we want to color (P), then push it around a bit using turbulence to get
to a final point (Q) then look up the color of point Q in our ordinary boring
textures. That's the color that's used for the point P.
It in effect says "Don't give me the color at this spot... take a few random
steps in a different direction and give me that color. Each step is typically
half as long as the one before. For example:
P ------------------------->
First Move /
/
/
/Second
/ Move
/
______/
\
\
Q - Final point.
The magnitude of these steps is controlled by the turbulence value.
ΓòÉΓòÉΓòÉ 6.4.1.5.2. 5.4.1.5.2 Octaves ΓòÉΓòÉΓòÉ
The number of steps used by turbulence is controlled by the "octaves" value.
The values may range from 1 up to 10. The default value of "octaves 6" is
fairly close to the upper limit; you won't see much change by setting it to a
higher value because the extra steps are too small. You can achieve some very
interesting wavy effects by specifying lower values. Setting octaves higher can
slow down rendering because more steps are computed.
ΓòÉΓòÉΓòÉ 6.4.1.5.3. 5.4.1.5.3 Omega ΓòÉΓòÉΓòÉ
The keyword "omega" followed by a float value may be added to change the
turbulence calculations. Each successive octave of turbulence is multiplied by
the omega value. The default "omega 0.5" means that each octave is 1/2 the size
of the previous one. Higher omega values mean that 2nd, 3rd, 4th and up
octaves contribute more turbulence giving a sharper, "krinkly" look while
smaller omegas give a fuzzy kind of turbulence that gets blury in places.
ΓòÉΓòÉΓòÉ 6.4.1.5.4. 5.4.1.5.4 Lambda ΓòÉΓòÉΓòÉ
The lambda parameter controls how statistically different the random move of an
octave is compared to its previous octave. The default value for this is
"lambda 2". Values close to lambda 1.0 will straighten out the randomness of
the path in the diagram above. Higher values can look more "swirly" under some
circumstances. More tinkering by POV-Ray users may lead us to discover ways to
make good use of this parameter. For now just tinker and enjoy.
ΓòÉΓòÉΓòÉ 6.4.1.5.5. 5.4.1.5.5 Quick_color ΓòÉΓòÉΓòÉ
When developing POV-Ray scenes its often useful to do low quality test runs
that render faster. The +Q command line switch can be used to turn off some
time consuming color pattern and lighting calculations to speed things up.
However all settings of +Q5 or lower turns off pigment calculations and creates
gray objects.
By adding a "quick_color" to a pigment you tell POV-Ray what solid color to use
for quick renders instead of a patterned pigment. For example:
pigment {
gradient x
color_map{
[0 color Yellow][0.3 color Cyan][0.6 color Magenta][1 color Cyan]
}
turbulence 0.5 lambda 1.5 omega 0.75 octaves 8
quick_color Neon_Pink
}
This tells POV-Ray to use solid Neon_Pink for test runs at quality +Q5 or lower
but to use the turbulent gradient pattern for rendering at +Q6 and higher.
Note that solid color pigments such as:
pigment {color Magenta}
automatically set the quick_color to that value. You may override this if you
want. Suppose you have 10 spheres on the screen and all are Yellow. If you
want to identify them individually you could give each a different quick_color
like this:
sphere {<1,2,3>,4 pigment {color Yellow quick_color Red}}
sphere {<-1,-2,-3>,4 pigment {color Yellow quick_color Blue}}
...and so on. At +Q6 or higher they will all be Yellow but at +Q5 or lower
each would be different colors so you could identify them.
ΓòÉΓòÉΓòÉ 6.4.1.5.6. 5.4.1.5.6 Frequency and Phase ΓòÉΓòÉΓòÉ
The frequency and phase keywords were originally intended for the normal
patterns ripples and waves discussed in the next section. With version 2.0
they were extended to pigments to make the radial and mandel pigment pattern
easier to use. As it turned out it was simple to make them apply to any color
map pattern.
The frequency keyword adjusts the number of times that a color map repeats over
one cycle of a pattern. For example gradient x covers color map values 0 to 1
over the range x=0 to x=1. By adding "frequency 2" the color map repeats twice
over that same range. The same effect can be achieved using "scale x*0.5" so
the frequency keyword isn't that useful for patterns like gradient.
However the radial pattern wraps the color map around the +Y axis once. If you
wanted two copies of the map (or 3 or 10 or 100) you'd have to build a bigger
map. Adding "frequency 2" causes the color map to be used twice per
revolution. Try this:
sphere {<0,0,0>,3
pigment {
radial
color_map{[0.5 color Red][0.5 color White]}
frequency 6
}
rotate -x*90
}
The result is 6 sets of red and white radial stripes evenly spaced around the
sphere.
Note "frequency -1" reverses the entries in a color_map.
The phase keyword takes values from 0.0 to 1.0 and rotates the color map
entries. In the example above if you render successive frames at phase 0 then
phase 0.1, phase 0.2 etc you could create an animation that rotates the
stripes. The same effect can be easily achieved by rotating the radial pigment
using "rotate y*Angle" but there are other uses where phase can be handy.
Sometimes you create a great looking gradient or wood color map but you want
the grain slightly adjusted in or out. You could re-order the color map
entries but that's a pain. A phase adjustment will shift everything but keep
the same scale. Try animating a mandel pigment for a color palette rotation
effect.
ΓòÉΓòÉΓòÉ 6.4.1.5.7. 5.4.1.5.7 Transforming pigments ΓòÉΓòÉΓòÉ
You may modify pigment patterns with "translate", "rotate" and "scale"
commands. Note that placing these transforms inside the texture but outside the
pigment will transform the entire texture. However placing them inside the
pigment transforms just the pigment. For example:
sphere {<0,0,0>,3
texture {
pigment {
checker color Red color White
scale <2,1,3> // affects pigment only... not normal
}
normal {
bumps 0.3
scale 0.4 // affects bump normal only... not pigment
}
finish {Shiny}
translate 5*x // affects entire texture
}
translate y*2 // affects object and texture
}
Note that transforms affect the entire pigment regardless of the ordering of
other parameters. For example:
This... ...is the same as this...
pigment { pigment {
bozo bozo
turbulence 0.3 scale 2
scale 2 turbulence 0.3
} }
The scaling before or after turbulence makes no difference. In general it is
best to put all transformations last for the sake of clarity.
ΓòÉΓòÉΓòÉ 6.4.2. 5.4.2 Normal ΓòÉΓòÉΓòÉ
Ray tracing is known for the dramatic way it depicts reflection, refraction and
lighting effects. Much of our perception depends on the reflective properties
of an object. Ray tracing can exploit this by playing tricks on our perception
to make us see complex details that aren't really there.
Suppose you wanted a very bumpy surface on the object. It would be very
difficult to mathematically model lots of bumps. We can however simulate the
way bumps look by altering the way light reflects off of the surface.
Reflection calculations depend on a vector called a "surface normal" vector.
This is a vector which points away from the surface and is perpendicular to it.
By artificially modifying (or perturbing) this normal vector you can simulate
bumps.
The "normal {...}" statement is the part of a texture which defines the pattern
of normal perturbations to be applied to an object. Like the pigment
statement, you can omit the surrounding texture block to save typing. Do not
forget however that there is a texture implied. For example...
this... can be shortened to this...
object { object {
My_Object My_Object
texture { pigment {color Purple}
pigment {color Purple} normal {bumps 0.3}
normal {bumps 0.3} }
}
}
Note that attaching a normal pattern does not really modify the surface. It
ONLY affects the way light reflects or refracts at the surface so that it LOOKS
bumpy.
The most complete form for defining a normal is as follows:
normal {
NORMAL_IDENTIFIER
NORMAL_PATTERN_TYPE
NORMAL_MODIFIERS
TRANSFORMATIONS...
}
Each of the items in a normal are optional but if they are present, they should
be in the order shown above to insure that the results are as expected. Any
items after the NORMAL_IDENTIFIER modify or override settings given in the
IDENTIFIER. If no identifier is specified then the items modify the normal
values in the current default texture. TRANSFORMATIONs are translate, rotate
and scale statements. They apply only to the normal and not to other parts of
the texture. They should be specified last.
There are 6 different NORMAL_PATTERN_TYPEs discussed below. They are bumps,
dents, ripples, waves, wrinkles and bump_map.
ΓòÉΓòÉΓòÉ 6.4.2.1. 5.4.2.1 Bumps ΓòÉΓòÉΓòÉ
A smoothly rolling random pattern of bumps can be created with the "bumps"
normal pattern. Bumps uses the same random noise function as the bozo and
spotted pigment patterns, but uses the derived value to perturb the surface
normal or, in other words, make the surface look bumpy. This gives the
impression of a "bumpy" surface, random and irregular, sort of like an orange.
After the bumps keyword, you supply a single floating point value for the
amount of surface perturbation. Values typically range from 0.0 (No Bumps) to
1.0 or greater (Extremely Bumpy). For example:
sphere {
<0, 1, 2>, 2
texture {
pigment {color Yellow}
normal {bumps 0.4 scale 0.2}
finish {phong 1}
}
}
This tells POV-Ray to use a bump pattern to modify the surface normal. The
value 0.4 controls the apparent depth of the bumps. Usually the bumps are
about 1 unit wide which doesn't work very well with a sphere of radius 2. The
scale makes the bumps 1/5th as wide but does not affect their depth.
ΓòÉΓòÉΓòÉ 6.4.2.2. 5.4.2.2 Dents ΓòÉΓòÉΓòÉ
The "dents" pattern is especially interesting when used with metallic textures,
it gives impressions into the metal surface that look like dents have been
beaten into the surface with a hammer. A single value is supplied after the
dents keyword to indicate the amount of denting required. Values range from 0.0
(Showroom New) to 1.0 (Insurance Wreck). Scale the pattern to make the pitting
more or less frequent.
ΓòÉΓòÉΓòÉ 6.4.2.3. 5.4.2.3 Ripples ΓòÉΓòÉΓòÉ
The ripples bump pattern make a surface look like ripples of water. The ripples
option requires a value to determine how deep the ripples are. Values range
from 0.0 to 1.0 or more. The ripples radiate from 10 random locations inside
the unit cube area <0,0,0> to <1,1,1>. Scale the pattern to make the centers
closer or farther apart.
The frequency keyword changes the spacing between ripples. The phase keyword
can be used to move the ripples outwards for realistic animation.
ΓòÉΓòÉΓòÉ 6.4.2.4. 5.4.2.4 Waves ΓòÉΓòÉΓòÉ
This works in a similar way to ripples except that it makes waves with
different frequencies. The effect is to make waves that look more like deep
ocean waves. The waves option requires a value to determine how deep the waves
are. Values range from 0.0 to 1.0 or more. The waves radiate from 10 random
locations inside the unit cube area <0,0,0> to <1,1,1>. Scale the pattern to
make the centers closer or farther apart.
The frequency keyword changes the spacing between waves. The phase keyword can
be used to move the waves outwards for realistic animation.
ΓòÉΓòÉΓòÉ 6.4.2.5. 5.4.2.5 Wrinkles ΓòÉΓòÉΓòÉ
This is sort of a 3-D bumpy granite. It uses a similar 1/f fractal noise
function to perturb the surface normal in 3-D space. With a transparent color
pattern, could look like wrinkled cellophane. Requires a single value after the
wrinkles keyword to indicate the amount of wrinkling desired. Values from 0.0
(No Wrinkles) to 1.0 (Very Wrinkled) are typical.
ΓòÉΓòÉΓòÉ 6.4.2.6. 5.4.2.6 Bump_map ΓòÉΓòÉΓòÉ
When all else fails and none of the above normal pattern types meets your
needs, you can use a bump map to wrap a 2-D bit-mapped bump pattern around your
3-D objects.
Instead of placing the color of the image on the shape like an image_map,
bump_map perturbs the surface normal based on the color of the image at that
point. The result looks like the image has been embossed into the surface. By
default, bump_map uses the brightness of the actual color of the pixel. Colors
are converted to gray scale internally before calculating height. Black is a
low spot, white is a high spot. The image's index values may be used instead
(see use_index) below.
ΓòÉΓòÉΓòÉ 6.4.2.6.1. 5.4.2.6.1 Specifying a bump map. ΓòÉΓòÉΓòÉ
The syntax for bump_map is...
normal {
bump_map {
FILE_TYPE "filename"
MODIFIERS...
}
}
Where FILE_TYPE is one of the following keywords "gif", "tga", "iff" or "dump".
This is followed by the name of the file in quotes. Several optional modifiers
may follow the file specification. The modifiers are described below. Note:
Earlier versions of POV-Ray allowed some modifiers before the FILE_TYPE but
that syntax is being phased out in favor of the syntax described here.
Filenames specified in the bump_map statements will be searched for in the home
(current) directory first, and if not found, will then be searched for in
directories specified by any "-L" (library path) options active. This would
facilitate keeping all your bump maps files in a separate subdirectory, and
giving an "-L" option on the command line to where your library of bump maps
are.
By default, the bump is mapped onto the X-Y plane. The bump is "projected"
onto the object as though there were a slide projector somewhere in the -Z
direction. The bump exactly fills the square area from x,y coordinates (0,0)
to (1,1) regardless of the bump's original size in pixels. If you would like
to change this default, you may translate, rotate or scale the normal or
texture to map it onto the object's surface as desired.
If you would like to change this default orientation, you may translate, rotate
or scale the normal or texture to map it onto the object's surface as desired.
ΓòÉΓòÉΓòÉ 6.4.2.6.2. 5.4.2.6.2 Bump_size ΓòÉΓòÉΓòÉ
The relative bump_size can be scaled using bump_size modifier. The bump_size
number can be any number other than 0. Valid numbers are 2, .5, -33, 1000, etc.
For example:
normal {
bump_map {
gif "stuff.gif"
bump_size 5
}
}
ΓòÉΓòÉΓòÉ 6.4.2.6.3. 5.4.2.6.3 Use_index & use_color ΓòÉΓòÉΓòÉ
Usually the bump_map converts the color of the pixel in the map to a grayscale
intensity value in the range 0.0 to 1.0 and calculates the bumps based on that
value. If you specify use_index, bump_map uses the color's palette number to
compute as the height of the bump at that point. So, color #0 would be low and
color #255 would be high. The actual color of the pixels doesn't matter when
using the index. The "use_color" keyword may be specified to explicitly note
that the color methods should be used instead.
ΓòÉΓòÉΓòÉ 6.4.2.6.4. 5.4.2.6.4 The "once" option. ΓòÉΓòÉΓòÉ
Normally there are an infinite number of repeating bump_maps created over every
unit square of the X-Y plane like tiles. By adding the keyword "once" after a
file name, you can eliminate all other copies of the bump_map except the one at
(0,0) to (1,1). Areas outside this unit square are treated as fully
transparent.
Note: The "once" keyword may also be used with image_map and material_map
statements.
ΓòÉΓòÉΓòÉ 6.4.2.6.5. 5.4.2.6.5 The "map_type" option. ΓòÉΓòÉΓòÉ
The default projection of the bump onto the X-Y plane is called a "planar map
type". This option may be changed by adding the "map_type" keyword followed by
a number specifying the way to wrap the bump around the object.
A "map_type 0" gives the default planar mapping already described.
A "map_type 1" is a spherical mapping. It assumes that the object is a sphere
of any size sitting at the origin. The Y axis is the north/south pole of the
spherical mapping. The top and bottom edges of the bump_map just touch the
pole regardless of any scaling. The left edge of the bump_map begins at the
positive X axis and wraps the pattern around the sphere from "west" to "east"
in a -Y rotation. The pattern covers the sphere exactly once. The "once"
keyword has no meaning for this type.
With "map_type 2" you get a cylindrical mapping. It assumes that a cylinder of
any diameter lies along the Y axis. The bump pattern wraps around the cylinder
just like the spherical map but remains 1 unit tall from y=0 to y=1. This band
of bumps is repeated at all heights unless the "once" keyword is applied.
Finally "map_type 5" is a torus or donut shaped mapping. It assumes that a
torus of major radius 1 sits at the origin in the X-Z plane. The bump pattern
is wrapped around similar to spherical or cylindrical maps. However the top and
bottom edges of the map wrap over and under the torus where they meet each
other on the inner rim.
Types 3 and 4 are still under development.
Note: The "map_type" option may also be applied to image_map and material_map
statements.
ΓòÉΓòÉΓòÉ 6.4.2.6.6. 5.4.2.6.6 The "interpolate" option. ΓòÉΓòÉΓòÉ
Adding the "interpolate" keyword can smooths the jagged look of a bump map.
When POV-Ray asks bump amount for a bump map, it often asks for a point that is
not directly on top of one pixel, but sort of between several different colored
pixels. Interpolations returns an "in-between" value so that the steps between
the pixels in the bump map will look smoother.
There are currently two types of interpolation:
Normalized Distance -- interpolate 4
Bilinear -- interpolate 2
Default is no interpolation. Normalized distance is the slightly faster of the
two, bilinear does a better job of picking the between color. Normally,
bilinear is used.
If your bump map looks jaggy, try using interpolation instead of going to a
higher resolution image. The results can be very good.
ΓòÉΓòÉΓòÉ 6.4.2.7. 5.4.2.7 Normal Modifiers ΓòÉΓòÉΓòÉ
After specifying the normal type such as bumps, dents etc you may add any of
several modifiers.
ΓòÉΓòÉΓòÉ 6.4.2.7.1. 5.4.2.7.1 Turbulence ΓòÉΓòÉΓòÉ
The keyword "turbulence" followed by a float or vector may be used to stir up
the color pattern. Typical values range from the default 0.0 which is no
turbulence to 1.0 which is very turbulent. If a vector is specified then
different amounts of turbulence is applied in the x, y and z directions. For
example "turbulence <1.0, 0.6, 0.1>" has much turbulence in the x direction, a
moderate amount in the y direction and a small amount in the z direction.
A complete discussion of turbulence is given under Pigment Modifiers in section
5.4.1.5 above. The "octaves", "omega", and "lambda" options are also available
as normal modifiers. They discussed under that section as well.
ΓòÉΓòÉΓòÉ 6.4.2.7.2. 5.4.2.7.2 Frequency and Phase ΓòÉΓòÉΓòÉ
Both waves and ripples respond to a parameter called phase. The phase option
allows you to create animations in which the water seems to move. This is done
by making the phase increment slowly between frames. The range from 0.0 to 1.0
gives one complete cycle of a wave.
The waves and ripples textures also respond to a parameter called frequency. If
you increase the frequency of the waves, they get closer together. If you
decrease it, they get farther apart.
Bumps, dents, wrinkles and bump_map do not respond to frequency or phase.
ΓòÉΓòÉΓòÉ 6.4.2.7.3. 5.4.2.7.3 Transforming normals ΓòÉΓòÉΓòÉ
You may modify normal patterns with "translate", "rotate" and "scale" commands.
Note that placing these transforms inside the texture but outside the normal
will transform the entire texture. However placing them inside the normal
transforms just the normal.
See section 5.4.1.5.7 Transforming Pigments for examples
ΓòÉΓòÉΓòÉ 6.4.3. 5.4.3 Finish ΓòÉΓòÉΓòÉ
The finish properties of a surface can greatly affect its appearance. How does
light reflect? What happens when light passes through? What kind of
highlights are visible. To answer these questions you need a finish statement.
The "finish {...}" statement is the part of a texture which defines the various
finish properties to be applied to an object. Like the pigment or normal
statement, you can omit the surrounding texture block to save typing. Do not
forget however that there is a texture implied. For example...
this... can be shortened to this...
object { object {
My_Object My_Object
texture { pigment {color Purple}
pigment {color Purple} finish {phong 0.3}
finish {phong 0.3} }
}
}
The most complete form for defining a finish is as follows:
finish {
FINISH_IDENTIFIER
FINISH_ITEMS...
}
The FINISH_IDENTIFIER is optional but should proceed all other items. Any
items after the FINISH_IDENTIFIER modify or override settings given in the
IDENTIFIER. If no identifier is specified then the items modify the finish
values in the current default texture. Note that transformations are not
allowed inside a finish because finish items cover the entire surface
uniformly.
ΓòÉΓòÉΓòÉ 6.4.3.1. 5.4.3.1 Diffuse Reflection Items ΓòÉΓòÉΓòÉ
When light reflects off of a surface, the laws of physics say that it should
leave the surface at the exact same angle it came in. This is similar to the
way a billiard ball bounces off a bumper of a pool table. This perfect
reflection is called "specular" reflection. However only very smooth polished
surfaces reflect light in this way. Most of the time, light reflects and is
scattered in all directions by the roughness of the surface. This scattering
is called "diffuse reflection" because the light diffuses or spreads in a
variety of directions. It accounts for the majority of the reflected light we
see.
In the real world, light may come from any of three possible sources. 1)It can
come directly from actual light sources which are illuminating an object. 2)It
can bounce from other objects such as mirrors via specular reflection. For
example shine a flashlight onto a mirror. 3)It can bounce from other objects
via diffuse reflections. Look at some dark area under a desk or in a corner.
Even though a lamp may not directly illuminate that spot you can still see a
little bit because light comes from diffuse reflection off of nearby objects.
ΓòÉΓòÉΓòÉ 6.4.3.1.1. 5.4.3.1.1 Diffuse ΓòÉΓòÉΓòÉ
POV-Ray and most other ray tracers can only simulate directly, one of these
three types of illumination. That is the light which comes directly from the
light source which diffuses in all directions. The keyword "diffuse" is used
in a finish statement to control how much light of this direct light is
reflected via diffuse reflection. For example:
finish {diffuse 0.7}
means that 70% of the light seen comes from direct illumination from light
sources. The default value is diffuse 0.6.
ΓòÉΓòÉΓòÉ 6.4.3.1.2. 5.4.3.1.2 Brilliance ΓòÉΓòÉΓòÉ
The amount of direct light that diffuses from an object depends upon the angle
at which it hits the surface. When light hits at a shallow angle it
illuminates less. When it is directly above a surface it illuminates more. The
"brilliance" keyword can be used in a finish statement to vary the way light
falls off depending upon the angle of incidence. This controls the tightness
of the basic diffuse illumination on objects and slightly adjusts the
appearance of surface shininess. Objects may appear more metallic by
increasing their brilliance. The default value is 1.0. Higher values from 3.0
to about 10.0 cause the light to fall off less at medium to low angles. There
are no limits to the brilliance value. Experiment to see what works best for a
particular situation. This is best used in concert with highlighting.
ΓòÉΓòÉΓòÉ 6.4.3.1.3. 5.4.3.1.3 Crand Graininess ΓòÉΓòÉΓòÉ
Very rough surfaces, such as concrete or sand, exhibit a dark graininess in
their apparent color. This is caused by the shadows of the pits or holes in
the surface. The "crand" keyword can be added to cause a minor random
darkening the diffuse reflection of direct illumination. Typical values range
from "crand 0.01" to "crand 0.5" or higher. The default value is 0. For
example:
finish {crand 0.05}
The grain or noise introduced by this feature is applied on a pixel-by- pixel
basis. This means that it will look the same on far away objects as on close
objects. The effect also looks different depending upon the resolution you are
using for the rendering. For these reasons it is not a very accurate way to
model the rough surface effect, but some objects still look better with a
little crand thrown in.
In previous versions of POV-Ray there was no "crand" keyword. Any lone float
value found inside a texture{...} which was not preceded by a keyword was
interpreted as a randomness value.
NOTE: This should not be used when rendering animations. This is the one of a
few truly random features in POV-Ray, and will produce an annoying flicker of
flying pixels on any textures animated with a "crand" value.
ΓòÉΓòÉΓòÉ 6.4.3.1.4. 5.4.3.1.4 Ambient ΓòÉΓòÉΓòÉ
The light you see in dark shadowed areas comes from diffuse reflection off of
other objects. This light cannot be directly modeled using ray tracing.
However we can use a trick called "ambient lighting" to simulate the light
inside a shadowed area.
Ambient light is light that is scattered everywhere in the room. It bounces all
over the place and manages to light objects up a bit even where no light is
directly shining. Computing real ambient light would take far too much time,
so we simulate ambient light by adding a small amount of white light to each
texture whether or not a light is actually shining on that texture.
This means that the portions of a shape that are completely in shadow will
still have a little bit of their surface color. It's almost as if the texture
glows, though the ambient light in a texture only affects the shape it is used
on.
The default value is very little ambient light (0.1). The value can range from
0.0 to 1.0. Ambient light affects both shadowed and non-shadowed areas so if
you turn up the ambient value you may want to turn down the diffuse value.
Note that this method doesn't account for the color of surrounding objects. If
you walk into a room that has red walls, floor and ceiling then your white
clothing will look pink from the reflected light. POV-Ray's ambient shortcut
doesn't account for this. There is also no way to model specular reflected
indirect illumination such as the flashlight shining in a mirror.
ΓòÉΓòÉΓòÉ 6.4.3.2. 5.4.3.2 Specular Reflection Items ΓòÉΓòÉΓòÉ
When light does not diffuse and it DOES reflect at the same angle as it hits an
object, it is called "specular reflection". Such mirror-like reflection is
controlled by the "reflection" keyword in a finish statement. For example:
finish {reflection 1.0 ambient 0 diffuse 0}
This gives the object a mirrored finish. It will reflect all other elements in
the scene. The value can range from 0.0 to 1.0. By default there is no
reflection.
Adding reflection to a texture makes it take longer to render because an
additional ray must be traced.
NOTE: Although such reflection is called "specular" it is not controlled by the
POV-Ray "specular" keyword. That keyword controls a "specular" highlight.
ΓòÉΓòÉΓòÉ 6.4.3.3. 5.4.3.3 Highlights ΓòÉΓòÉΓòÉ
A highlights are the bright spots that appear when a light source reflects off
of a smooth object. They are a blend of specular reflection and diffuse
reflection. They are specular-like because they depend upon viewing angle and
illumination angle. However they are diffuse-like because some scattering
occurs. In order to exactly model a highlight you would have to calculate
specular reflection off of thousands of microscopic bumps called micro facets.
The more that micro facets are facing the viewer, the shinier the object
appears, and the tighter the highlights become. POV-Ray uses two different
models to simulate highlights without calculating micro facets. They are the
specular and phong models.
Note that specular and phong highlights are NOT mutually exclusive. It is
possible to specify both and they will both take effect. Normally, however, you
will only specify one or the other.
ΓòÉΓòÉΓòÉ 6.4.3.3.1. 5.4.3.3.1 Phong Highlights ΓòÉΓòÉΓòÉ
The "phong" keyword controls the amount of Phong highlighting on the object.
It causes bright shiny spots on the object that are the color of the light
source being reflected.
The Phong method measures the average of the facets facing in the mirror
direction from the light sources to the viewer.
Phong's value is typically from 0.0 to 1.0, where 1.0 causes complete
saturation to the light source's color at the brightest area (center) of the
highlight. The default phong 0.0 gives no highlight.
The size of the highlight spot is defined by the phong_size value. The larger
the phong_size, the tighter, or smaller, the highlight and the shinier the
appearance. The smaller the phong_size, the looser, or larger, the highlight
and the less glossy the appearance.
Typical values range from 1.0 (Very Dull) to 250 (Highly Polished) though any
values may be used. Default phong_size is 40 (plastic) if phong_size is not
specified. For example:
finish {phong 0.9 phong_size 60}
If "phong" is not specified then "phong_size" has no effect.
ΓòÉΓòÉΓòÉ 6.4.3.3.2. 5.4.3.3.2 Specular Highlight ΓòÉΓòÉΓòÉ
A specular highlight is very similar to Phong highlighting, but uses slightly
different model. The specular model more closely resembles real specular
reflection and provides a more credible spreading of the highlights occur near
the object horizons.
Specular's value is typically from 0.0 to 1.0, where 1.0 causes complete
saturation to the light source's color at the brightest area (center) of the
highlight. The default specular 0.0 gives no highlight.
The size of the spot is defined by the value given for roughness. Typical
values range from 1.0 (Very Rough -- large highlight) to 0.0005 (Very Smooth --
small highlight). The default value, if roughness is not specified, is 0.05
(Plastic).
It is possible to specify "wrong" values for roughness that will generate an
error when you try to render the file. Don't use 0 and if you get errors, check
to see if you are using a very, very small roughness value that may be causing
the error. For example:
finish {specular 0.9 roughness 0.02}
If "specular" is not specified then "roughness" has no effect.
ΓòÉΓòÉΓòÉ 6.4.3.3.3. 5.4.3.3.3 Metallic Highlight Modifier ΓòÉΓòÉΓòÉ
The keyword "metallic" may be used with phong or specular highlights. This
keyword indicates that the color of the highlights will be filtered by the
surface color instead of directly using the light_source color. Note that the
keyword has no numeric value after it. You either have it or you don't. For
example:
finish {phong 0.9 phong_size 60 metallic}
If "phong" or "specular" is not specified then "metallic" has no effect.
ΓòÉΓòÉΓòÉ 6.4.3.4. 5.4.3.4 Refraction ΓòÉΓòÉΓòÉ
When light passes through a surface either into or out of a dense medium, the
path of the ray of light is bent. Such bending is called refraction. Normally
transparent or semi-transparent surfaces in POV-Ray do not refract light.
Adding "refraction 1.0" to the finish statement turns on refraction.
Note: It is recommended that you only use "refraction 0" or "refraction 1".
Values in between will darken the refracted light in ways that do not
correspond to any physical property. Many POV-Ray scenes were created with
intermediate refraction values before this "bug" was discovered so the
"feature" has been maintained. A more appropriate way to reduce the brightness
of refracted light is to change the "filter" value in the colors specified in
the pigment statement. Note also that "refraction" does not cause the object to
be transparent. Transparency is only occurs if there is a non-zero "filter"
value in the color.
The amount of bending or refracting of light depends upon the density of the
material. Air, water, crystal, diamonds all have different density and thus
refract differently. The "index of refraction" or "ior" value is used by
scientists to describe the relative density of substances. The "ior" keyword
is used in POV-Ray to specify the value. For example:
texture {
pigment { White filter 0.9 }
finish {
refraction 1
ior 1.5
}
}
The default ior value of 1.0 will give no refraction. The index of refraction
for air is 1.0, water is 1.33, glass is 1.5, and diamond is 2.4. The file
IOR.INC pre-defines several useful values for ior.
NOTE: If a texture has a filter component and no value for refraction and ior
are supplied, the renderer will simply transmit the ray through the surface
with no bending. In layered textures, the refraction and ior keywords MUST be
in the last texture, otherwise they will not take effect.
ΓòÉΓòÉΓòÉ 6.4.4. 5.4.4 Special Textures ΓòÉΓòÉΓòÉ
Most textures consist of a single pigment, normal and finish specification
which applies to the entire surface. However two special textures have been
implemented that extend the "checker" and "image_map" concepts to cover not
just pigment but the entire texture.
ΓòÉΓòÉΓòÉ 6.4.4.1. 5.4.4.1 Tiles ΓòÉΓòÉΓòÉ
This first special texture is the "tiles" texture. It works just like the
"checker" pigment pattern except it colors the blocks with entire textures
rather than solid colors.
The syntax is:
texture{
tiles {
texture {... put in a texture here ... }
tile2
texture {... this is the second tile texture }
}
// Optionally put translate, rotate or scale here
}
For example:
texture{
tiles {
texture { Jade }
tile2
texture { Red_Marble }
}
}
The textures used in each tile may be any type of texture including more tiles
or regular textures made from pigment, normal and finish statements. Note that
no other pigment, normal or finish statements may be added to the texture. This
is illegal:
texture {
tiles {
texture {T1}
tile2
texture {T2}
}
finish {phong 1.0}
}
The finish must be individually added to each texture.
Note that earlier versions of POV-Ray used only the pigment parts of the
textures in the tiles. Normals and finish were ignored. Also layered textures
were not supported. In order to correct these problems the above restrictions
on syntax were necessary. This means some POV-Ray 1.0 scenes using tiles many
need minor modifications that cannot be done automatically with the version
compatibility mode.
The textures within a tiles texture may be layered but tiles textures do don't
work as part of a layered texture.
ΓòÉΓòÉΓòÉ 6.4.4.2. 5.4.4.2 Material_Map ΓòÉΓòÉΓòÉ
The "material_map" special texture extends the concept of "image_map" to apply
to entire textures rather than solid colors. A material_map allows you to wrap
a 2-D bit-mapped texture pattern around your 3-D objects.
Instead of placing a solid color of the image on the shape like an image_map,
an entire texture is specified based on the index or color of the image at that
point. You must specify a list of textures to be used like a "texture palette"
rather than the usual color palette.
When used with mapped file types such as GIF, the index of the pixel is used as
an index into the list of textures you supply. For unmapped file types such as
TGA, the 8 bit value of the red component in the range 0-255 is used as an
index.
If the index of a pixel is greater than the number of textures in your list
then the index is taken modulo N where N is the length of your list of
textures.
ΓòÉΓòÉΓòÉ 6.4.4.2.1. 5.4.4.2.1 Specifying a material map. ΓòÉΓòÉΓòÉ
The syntax for material_map is...
texture {
material_map {
FILE_TYPE "filename"
MODIFIERS...
texture {...} // First used for index 0
texture {...} // Second texture used for index 1
texture {...} // Third texture used for index 2
texture {...} // Fourth texture used for index 3
// and so on for however many used.
}
TRANSFORMATION...
}
If particular index values are not used in an image then it may be necessary to
supply dummy textures. It may be necessary to use a paint program or other
utility to examine the map file's palette to determine how to arrange the
texture list.
In the syntax above, FILE_TYPE is one of the following keywords "gif", "tga",
"iff" or "dump". This is followed by the name of the file in quotes. Several
optional modifiers may follow the file specification. The modifiers are
described below. Note: Earlier versions of POV-Ray allowed some modifiers
before the FILE_TYPE but that syntax is being phased out in favor of the syntax
described here.
Filenames specified in the material_map statements will be searched for in the
home (current) directory first, and if not found, will then be searched for in
directories specified by any "-L" (library path) options active. This would
facilitate keeping all your material maps files in a separate subdirectory, and
giving an "-L" option on the command line to where your library of material
maps are.
By default, the material is mapped onto the X-Y plane. The material is
"projected" onto the object as though there were a slide projector somewhere in
the -Z direction. The material exactly fills the square area from x,y
coordinates (0,0) to (1,1) regardless of the material's original size in
pixels. If you would like to change this default, you may translate, rotate or
scale the normal or texture to map it onto the object's surface as desired.
If you would like to change this default orientation, you may translate, rotate
or scale the texture to map it onto the object's surface as desired.
Note that no other pigment, normal or finish statements may be added to the
texture outside the material_map. This is illegal:
texture {
material_map {
gif "matmap.gif"
texture {T1}
texture {T2}
texture {T3}
}
finish {phong 1.0}
}
The finish must be individually added to each texture.
Note that earlier versions of POV-Ray allowed such specifications but they were
ignored. The above restrictions on syntax were necessary for various bug
fixes. This means some POV-Ray 1.0 scenes using material_maps many need minor
modifications that cannot be done automatically with the version compatibility
mode.
The textures within a material_map texture may be layered but material_map
textures do don't work as part of a layered texture. To use a layered texture
inside a material_map you must declare it as a texture identifier and invoke it
in the texture list.
ΓòÉΓòÉΓòÉ 6.4.4.2.2. 5.4.4.2.2 Material_map options. ΓòÉΓòÉΓòÉ
The "once" and "map_type" options may be used with material_maps exactly like
image_map or bump_map. The "interpolate" keyword also is allowed but it
interpolates the map indices rather than the colors. In most cases this
results in a worse image instead of a better image. Future versions will fix
this problem.
ΓòÉΓòÉΓòÉ 6.4.5. 5.4.5 Layered Textures ΓòÉΓòÉΓòÉ
It is possible to create a variety of special effects using layered textures.
A layered texture is one where several textures that are partially transparent
are laid one on top of the other to create a more complex texture. The
different texture layers show through the transparent portions to create the
appearance of one texture that is a combination of several textures.
You create layered textures by listing two or more textures one right after the
other. The last texture listed will be the top layer, the first one listed will
be the bottom layer. All textures in a layered texture other than the bottom
layer should have some transparency. For example:
object {
My_Object
texture {T1} // the bottom layer
texture {T2} // a semi-transparent layer
texture {T3} // the top semi-transparent layer
}
In this example T2 shows only where T3 is transparent and T1 shows only where
T2 and T3 are transparent.
The color of underlying layers is filtered by upper layers but the results do
not look exactly like a series of transparent surfaces. If you had a stack of
surfaces with the textures applied to each, the light would be filtered twice:
once on the way in as the lower layers are illuminated by filtered light and
once on the way out. Layered textures do not filter the illumination on the
way in. Other parts of the lighting calculations work differently as well.
The result look great and allow for fantastic looking textures but they are
simply different from multiple surfaces. See STONES.INC in the standard
include files for some magnificent layered textures.
Note layered textures must use the "texture{...}" wrapped around any pigment,
normal or finish statements. Do not use multiple pigment, normal or finish
statements without putting them inside the texture statement.
Layered textures may be declared. For example:
#declare Layered_Examp=
texture {T1}
texture {T2}
texture {T3}
Then invoke it as follows:
object {
My_Object
texture {
Layer_Examp
// Any pigment, normal or finish here
// modifies the bottom layer only.
}
}
ΓòÉΓòÉΓòÉ 6.4.6. 5.4.6 Default Texture ΓòÉΓòÉΓòÉ
POV-Ray creates a default texture when it begins processing. You may change
those defaults as described below. Every time you specify a "texture{...}"
statement, POV-Ray creates a copy of the default texture. Anything items you
put in the texture statement override the default settings. If you attach a
pigment, normal or finish to an object without any texture statement then
POV-Ray checks to see if a texture has already been attached. If it has a
texture then the pigment, normal or finish will modify that existing texture.
If no texture has yet been attached to the object then the default texture is
copied and the pigment, normal or finish will modify that texture.
You may change the default texture, pigment, normal or finish using the
language directive "#default {...}" as follows:
#default {
texture {
pigment {...}
normal {...}
finish {...}
}
}
Or you may change just part of it like this:
#default {
pigment {...}
}
This still changes the pigment of the default texture. At any time there is
only one default texture made from the default pigment, normal and finish. The
example above does not make a separate default for pigments alone. Note:
Special textures tiles and material_map may not be used as defaults.
You may change the defaults several times throughout a scene as you wish.
Subsequent #default statements begin with the defaults that were in effect at
the time. If you wish to reset to the original POV-Ray defaults then you
should first save them as follows:
//At top of file
#declare Original_Default = texture {}
later after changing defaults you may restore it with...
#default {texture {Original_Default}}
If you do not specify a texture for an object then the default texture is
attached when the object appears in the scene. It is not attached when an
object is declared. For example:
#declare My_Object=
sphere{<0,0,0>,1} // Default texture not applied
object{My_Object} // Default texture added here
You may force a default texture to be added by using an empty texture statement
as follows:
#declare My_Thing=
sphere{<0,0,0>,1 texture{}} // Default texture applied
The original POV-Ray defaults for all items are given throughout the
documentation under each appropriate section.
ΓòÉΓòÉΓòÉ 6.5. 5.5 Camera ΓòÉΓòÉΓòÉ
Every scene in POV-Ray has a camera defined. If you do not specify a camera
then a default camera is used. The camera definition describes the position,
angle and properties of the camera viewing the scene. POV-Ray uses this
definition to do a simulation of the camera in the ray tracing universe and
"take a picture" of your scene.
The camera simulated in POV-Ray is a pinhole camera. Pinhole cameras have a
fixed focus so all elements of the scene will always be perfectly in focus. The
pinhole camera is not able to do soft focus or depth of field effects.
A total of 6 vectors may be specified to define the camera but only a few of
those are needed to in most cases. Here is an introduction to simple camera
placement.
ΓòÉΓòÉΓòÉ 6.5.1. 5.5.1 Location And Look_At ΓòÉΓòÉΓòÉ
Under many circumstances just two vectors in the camera statement are all you
need: location and look_at. For example:
camera {
location <3,5,-10>
look_at <0,2,1>
}
The location is simply the X, Y, Z coordinates of the camera. The camera can be
located anywhere in the ray tracing universe. The default location is <0,0,0>.
The look_at vector tells POV-Ray to pan and tilt the camera until it is looking
at the specified X, Y, Z coordinate. By default the camera looks at a point
one unit in the +Z direction from the location.
The look_at specification should almost always be the LAST item in the camera
statement. If other camera items are placed after the look_at vector then the
camera may not continue to look at the specified point.
ΓòÉΓòÉΓòÉ 6.5.2. 5.5.2 The Sky Vector ΓòÉΓòÉΓòÉ
Normally POV-Ray pans left or right by rotating about the Y axis until it lines
up with the look_at point and then tilts straight up or down until the point is
met exactly. However you may want to slant the camera sideways like an
airplane making a banked turn. You may change the tilt of the camera using the
"sky" vector. For example:
camera {
location <3,5,-10>
sky <1,1,0>
look_at <0,2,1>
}
This tells POV-Ray to roll the camera until the top of the camera is in line
with the sky vector. Imagine that the sky vector is an antenna pointing out of
the top of the camera. Then it uses the "sky" vector as the axis of rotation
left or right and then to tilt up or down in line with the "sky" vector. In
effect you're telling POV-Ray to assume that the sky isn't straight up. Note
that the sky vector must appear before the look_at vector. The sky vector does
nothing on its own. It only modifies the way the look_at vector turns the
camera. The default value for sky is <0,1,0>.
ΓòÉΓòÉΓòÉ 6.5.3. 5.5.3 The Direction Vector ΓòÉΓòÉΓòÉ
The "direction" vector serves two purposes. It tells POV-Ray the initial
direction to point the camera before moving it with look_at or rotate vectors.
It also controls the field of view.
Note that this is only the initial direction. Normally, you will use the
look_at keyword, not the direction vector to point the camera in its actual
direction.
The length of the direction vector tells POV-Ray to use a telephoto or
wide-angle view. It is the distance from the camera location to the imaginary
"view window" that you are looking through. A short direction vector gives a
wide angle view while a long direction gives a narrow, telephoto view.
This figure illustrates the effect:
|\ |\
| \ | \
| \ | \
| \ | \
Location | | Location | |
*------------> | *--------------------------> |
Direction| | | |
| | | |
| | | |
\ | \ |
\ | \ |
\| \|
Short direction gives wide view... long direction narrows view.
The default value is "direction <0,0,1>".
Be careful with short direction vector lengths like 1.0 and less. You may
experience distortion on the edges of your images. Objects will appear to be
shaped strangely. If this happens, move the location back and make the
direction vector longer.
Wide angle example:
camera {
location <3,5,-10>
direction <0,0,1>
look_at <0,2,1>
}
Zoomed in telephoto example:
camera {
location <3,5,-10>
direction <0,0,8>
look_at <0,2,1>
}
ΓòÉΓòÉΓòÉ 6.5.4. 5.5.4 Up And Right Vectors ΓòÉΓòÉΓòÉ
The "up" vector defines the height of the view window. The "right" vector
defines the width of the view window. This figure illustrates the relationship
of these vectors:
--------------------------
| ^ |
| up <0,1,0>| |
| | |
| | |
| | |
| | |
| | |
|------------------------->|
| right<1.33,0,0> |
| | |
| | |
| | |
| | |
| | |
| | |
--------------------------
ΓòÉΓòÉΓòÉ 6.5.4.1. 5.5.4.1 Aspect Ratio ΓòÉΓòÉΓòÉ
Together these vectors define the "aspect ratio" (height to width ratio) of the
resulting image. The default values "up <0,1,0>" and "right <1.33,0,0>"
results in an aspect ratio of about 4 to 3. This is the aspect ratio of a
typical computer monitor. If you wanted a tall skinny image or a short wide
panoramic image or a perfectly square image then you should adjust the up and
right vectors to the appropriate proportions.
Most computer video modes and graphics printers use perfectly square pixels.
For example Macintosh displays and IBM S-VGA modes 640x480, 800x600 and
1024x768 all use square pixels. When your intended viewing method uses square
pixels then the width and height you set with the +W and +H switches should
also have the same ratio as the right and up vectors. Note that 640/480=4/3 so
the ratio is proper for this square pixel mode.
Not all display modes use square pixels however. For example IBM VGA mode
320x200 and Amiga 320x400 modes do not use square pixels. These two modes
still produce a 4/3 aspect ratio image. Therefore images intended to be viewed
on such hardware should still use 4/3 ratio on their up & right vectors but the
+W and +H settings will not be 4/3.
For example:
camera {
location <3,5,-10>
up <0,1,0>
right <1,0,0>
look_at <0,2,1>
}
This specifies a perfectly square image. On a square pixel display like SVGA
you would use +W and +H settings such as +W480 +H480 or +W600 +H600. However on
the non-square pixel Amiga 320x400 mode you would want to use values of +W240
+H400 to render a square image.
ΓòÉΓòÉΓòÉ 6.5.4.2. 5.5.4.2 Handedness ΓòÉΓòÉΓòÉ
The "right" vector also describes the direction to the right of the camera. It
tells POV-Ray where the right side of your screen is. The sign of the right
vector also determines the "handedness" of the coordinate system in use. The
default right statement is:
right <1.33, 0, 0>
This means that the +X direction is to the right. It is called a "left-
handed" system because you can use your left hand to keep track of the axes.
Hold out your left hand with your palm facing to your right. Stick your thumb
up. Point straight ahead with your index finger. Point your other fingers to
the right. Your bent fingers are pointing to the +X direction. Your thumb now
points +Y. Your index finger points +Z.
To use a right-handed coordinate system, as is popular in some CAD programs and
other ray tracers, make the same shape using your right hand. Your thumb still
points up in the +Y direction and your index finger still points forward in the
+Z direction but your other fingers now say the +X is to the left. That means
that the "right" side of your screen is now in the -X direction. To tell
POV-Ray to compensate for this you should use a negative X value in the "right"
vector like this:
right <-1.33, 0, 0>
Some CAD systems, like AutoCAD, also have the assumption that the Z axis is the
"elevation" and is the "up" direction instead of the Y axis. If this is the
case you will want to change your "up" and "direction" as well. Note that the
up, right, and direction vectors must always remain perpendicular to each other
or the image will be distorted.
ΓòÉΓòÉΓòÉ 6.5.5. 5.5.5 Transforming The Camera ΓòÉΓòÉΓòÉ
The "translate" and "rotate" commands can re-position the camera once you've
defined it.
For example:
camera {
location < 0, 0, 0>
direction < 0, 0, 1>
up < 0, 1, 0>
right < 1, 0, 0>
rotate <30, 60, 30>
translate < 5, 3, 4>
}
In this example, the camera is created, then rotated by 30 degrees about the X
axis, 60 degrees about the Y axis, and 30 degrees about the Z axis, then
translated to another point in space.
ΓòÉΓòÉΓòÉ 6.5.6. 5.5.6 Camera Identifiers ΓòÉΓòÉΓòÉ
You may declare several camera identifiers if you wish. This makes it easy to
quickly change cameras. For example:
#declare Long_Lens=
camera {
location -z*100
direction z*50
}
#declare Short_Lens=
camera {
location -z*50
direction z*10
}
camera {
Long_Lens //edit this line to change lenses
look_at Here
}
ΓòÉΓòÉΓòÉ 6.6. 5.6 Misc Features ΓòÉΓòÉΓòÉ
Here are a variety of other topics about POV-Ray features.
ΓòÉΓòÉΓòÉ 6.6.1. 5.6.1 Fog ΓòÉΓòÉΓòÉ
POV-Ray includes the ability to render fog. To add fog to a scene, place the
following declaration outside of any object definitions:
fog {
color Gray70 // the fog color
distance 200.0 // distance for 100% fog color
}
The fog color is then blended into the current pixel color at a rate calculated
as:
1-exp(-depth/distance) =
1-exp(-200/200) =
1-exp(-1) =
1-.37... =
0.63...
So at depth 0, the color is pure (1.0) with no fog (0.0). At the fog distance,
you'll get 63% of the color from the object's color and 37% from the fog color.
Subtle use of fog can add considerable realism and depth cuing to a scene
without adding appreciably to the overall rendering times. Using a black or
very dark gray fog can be used to simulate attenuated lighting by darkening
distant objects.
ΓòÉΓòÉΓòÉ 6.6.2. 5.6.2 Max_Trace_Level ΓòÉΓòÉΓòÉ
The "#max_trace_level" directive sets a variable that defines how many levels
that POV-Ray will trace a ray. This is used when a ray is reflected or is
passing through a transparent object. When a ray hits a reflective surface, it
spawns another ray to see what that point reflects, that's trace level 1. If it
hits another reflective surface, then another ray is spawned and it goes to
trace level 2. The maximum level by default is 5.
If max trace level is reached before a non-reflecting surface is found, then
the color is returned as black. Raise max_trace_level if you see black in a
reflective surface where there should be a color.
The other symptom you could see is with transparent objects. For instance, try
making a union of concentric spheres with the Cloud_Sky texture on them. Make
ten of them in the union with radius's from 1-10 then render the Scene. The
image will show the first few spheres correctly, then black. This is because a
new level is used every time you pass through a transparent surface. Raise
max_trace_level to fix this problem. For example:
#max_trace_level 20
Note: Raising max_trace_level will use more memory and time and it could cause
the program to crash with a stack overflow error. Values for max_trace_level
are not restricted, so it can be set to any number as long as you have the time
and memory.
ΓòÉΓòÉΓòÉ 6.6.3. 5.6.3 Max_Intersections ΓòÉΓòÉΓòÉ
POV-Ray uses a set of internal stacks to collect ray/object intersection
points. The usual maximum number of entries in these "I-Stacks" is 64. Complex
scenes may cause these stacks to overflow. POV-Ray doesn't stop but it may
incorrectly render your scene. When POV-Ray finishes rendering, a number of
statistics are displayed. If you see "I-Stack Overflows" reported in the
statistics, you should increase the stack size. Add a directive to your scene
as follows:
#max_intersections 200
If the "I-Stack Overflows" remain, increase this value until they stop.
ΓòÉΓòÉΓòÉ 6.6.4. 5.6.4 Background ΓòÉΓòÉΓòÉ
A background color can be specified if desired. Any ray that doesn't hit an
object will be colored with this color. The default background is black. The
syntax for background is:
background { color SkyBlue }
Using a colored background takes up no extra time for the ray tracer, making it
a very economical, although limited, feature. Only solid colors can be
specified for a background. Textures cannot be used. No shadows will be cast
on it, which makes it very useful, but at the same time, it has no "roundness",
or shading, and can sometimes cause a scene to look "flat". Use background
with restraint. It's often better, although a bit slower, to use a "sky
sphere", but there are times when a solid background is just what you need.
ΓòÉΓòÉΓòÉ 6.6.5. 5.6.5 The #Version Directive ΓòÉΓòÉΓòÉ
Although POV-Ray 2.0 has had significant changes to the language over POV- Ray
1.0, almost all 1.0 scenes will still work if the compatibility mode is set to
1.0. The +MV switch described earlier, sets the initial mode. The default is
+MV2.0.
Inside a scene file you may turn compatibility off or on using the "#version"
directive. For example:
#version 1.0
// Put some version 1.0 statements here
#version 2.0
// Put some version 2.0 statements here
Note you may not change versions inside an object or declaration.
The primary purpose of the switch is to turn off float and expression parsing
so that commas are not needed. It also turns off some warning messages.
Note some changes in tiles and material_maps cannot be fixed by turning the
version compatibility on. It may require hand editing of those statements. See
the special texture section for details.
Future versions of POV-Ray may not continue to maintain full backward
compatibility. We strongly encourage you to phase in 2.0 syntax as much as
possible.
ΓòÉΓòÉΓòÉ 7. APPENDIX A Common Questions And Answers ΓòÉΓòÉΓòÉ
Q: I get a floating point error on certain pictures. What's wrong?
A: The ray tracer performs many thousands of floating point operations when
tracing a scene. If checks were added to each one for overflow or underflow,
the program would be much slower. If you get this problem, first look through
your scene file to make sure you're not doing something like:
o Scaling something by 0 in any dimension.
Ex: scale <34, 2, 0> will generate a warning.
o Making the look_at point the same as the location in the camera
o Looking straight down at the look_at point
o Defining triangles with two points the same (or nearly the same)
o Using a roughness value of zero (0).
If it doesn't seem to be one of these problems, please let us know. If you do
have such troubles, you can try to isolate the problem in the input scene file
by commenting out objects or groups of objects until you narrow it down to a
particular section that fails. Then try commenting out the individual
characteristics of the offending object.
Q: Are planes 2D objects or are they 3D but infinitely thin?
A: Neither. Planes are 3D objects that divide the world into two half- spaces.
The space in the direction of the surface normal is considered outside and the
other space is inside. In other words, planes are 3D objects that are
infinitely thick. For the plane, plane { y, 0 }, every point with a positive Y
value is outside and every point with a negative Y value is inside.
^
|
|
| Outside
_______|_______
Inside
Q: I'd like to go through the program and hand-optimize the assembly code in
places to make it faster. What should I optimize?
A: Don't bother. With hand optimization, you'd spend a lot of time to get
perhaps a 5-10% speed improvement at the cost of total loss of portability. If
you use a better ray-surface intersection algorithm, you should be able to get
an order of magnitude or more improvement. Check out some books and papers on
ray tracing for useful techniques. Specifically, check out "Spatial
Subdivision" and "Ray Coherence" techniques.
Q: Objects on the edges of the screen seem to be distorted. Why?
A: If the direction vector of the camera is not very long, you may get
distortion at the edges of the screen. Try moving the location back and raising
the value of the direction vector.
Q: How do you position planar image maps without a lot of trial and error?
A: By default, images will be mapped onto the range 0,0 to 1,1 in the
appropriate plane. You should be able to translate, rotate, and scale the image
from there.
Q: How do you calculate the surface normals for smooth triangles?
A: There are two ways of getting another program to calculate them for you.
There are now several utilities to help with this.
1. Depending on the type of input to the program, you may be able to calculate
the surface normals directly. For example, if you have a program that
converts B-Spline or Bezier Spline surfaces into POV-Ray format files, you
can calculate the surface normals from the surface equations.
2. If your original data was a polygon or triangle mesh, then it's not quite
so simple. You have to first calculate the surface normals of all the
triangles. This is easy to do - you just use the vector cross-product of
two sides (make sure you get the vectors in the right order). Then, for
every vertex, you average the surface normals of the triangles that meet at
that vertex. These are the normals you use for smooth triangles. Look for
the utilities such as RAW2POV. RAW2POV has an excellent bounding scheme
and the ability to specify a smoothing threshold.
Q: When I render parts of a picture on different systems, the textures don't
match when I put them together. Why?
A: The appearance of a texture depends on the particular random number
generator used on your system. POV-Ray seeds the random number generator with a
fixed value when it starts, so the textures will be consistent from one run to
another or from one frame to another so long as you use the same executables.
Once you change executables, you will likely change the random number generator
and, hence, the appearance of the texture. There is an example of a standard
ANSI random number generator provided in IBM.C, include it in your
machine-specific code if you are having consistency problems.
Q: I created an object that passes through its bounding volume. At times, I can
see the parts of the object that are outside the bounding volume. Why does this
happen?
A: Bounding volumes are not designed to change the shape of the object. They
are strictly a realtime improvement feature. The ray tracer trusts you when you
say that the object is enclosed by a bounding volume. The way it uses bounding
volumes is very simple: If the ray hits the bounding volume (or the ray's
origin is inside the bounding volume),when the object is tested against that
ray. Otherwise, we ignore the object. If the object extends beyond the bounding
volume, anything goes. The results are undefined. It's quite possible that you
could see the object outside the bounding volume and it's also possible that it
could be invisible. It all depends on the geometry of the scene. If you want
this effect use a clipped_by volume instead of bounded_by or use clipped_by {
bounded_by } if you wish to clip and bound with the same object.
ΓòÉΓòÉΓòÉ 8. APPENDIX B Tips And Hints ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 8.1. B.1 Scene Design ΓòÉΓòÉΓòÉ
There are a number of excellent shareware CAD style modelers available on the
DOS platform now that will create POV-Ray scene files. The online systems
mentioned elsewhere in this document are the best places to find these.
Hundreds of special-purpose utilities have been written for POV-Ray; data
conversion programs, object generators, shell-style "launchers", and more. It
would not be possible to list them all here, but again, the online systems
listed will carry most of them. Most, following the POV-Ray spirit, are
freeware or inexpensive shareware.
Some extremely elaborate scenes have been designed by drafting on graph paper.
Raytracer Mike Miller recommends graph paper with a grid divided in tenths,
allowing natural decimal conversions.
Start out with a "boilerplate" scene file, such as a copy of BASICVUE.POV, and
edit that. In general, place your objects near and around the "origin" (0, 0,
0) with the camera in the negative z direction, looking at the origin.
Naturally, you will break from this rule many times, but when starting out,
keep things simple.
For basic, boring, but dependable lighting, place a light source at or near the
position of the camera. Objects will look flat, but at least you will see
them. From there, you can move it slowly into a better position.
ΓòÉΓòÉΓòÉ 8.2. B.2 Scene Debugging Tips ΓòÉΓòÉΓòÉ
To see a quick version of your picture, render it very small. With fewer pixels
to calculate the ray tracer can finish more quickly. -w160 -h100 is a good
size.
Use the +Q "quality" switch when appropriate.
If there is a particular area of your picture that you need to see in high
resolution, perhaps with anti-aliasing on (perhaps a fine-grained wood
texture), use the +SC, +EC. +SR, and +ER switches to isolate a "window".
If your image contains a lot of inter-reflections, set max_trace_level to a low
value such as 1 or 2. Don't forget to put it back up when you're finished!
"Turn off" any unnecessary lights. Comment out extended light and spotlight
keywords when not needed for debugging. Again, don't forget to put them back
in before you retire for the night with a final render running!
If you've run into an error that is eluding you by visual examination, it's
time to start bracketing your file. Use the block comment characters ( /* ...
*/ ) to disable most of your scene and try to render again. If you no longer
get an error, the problem naturally lies somewhere within the disabled area.
Slow and methodical testing like this will eventually get you to a point where
you will either be able to spot the bug, or go quietly insane. Maybe both.
If you seem to have "lost" yourself or an object (a common experience for
beginners) there are a few tricks that can sometimes help:
1. Move your camera way back to provide a long range view. This may not help
with very small objects which tend to be less visible at a distance, but
it's a nice trick to keep up your sleeve.
2. Try setting the ambient value to 1.0 if you suspect that the object may
simply be hidden from the lights. This will make it self-illuminated and
you'll be able to see it even with no lights in the scene.
3. Replace the object with a larger, more obvious "stand-in" object like a
large sphere or box. Be sure that all the same transformations are applied
to this new shape so that it ends up in the same spot.
ΓòÉΓòÉΓòÉ 8.3. B.3 Animation ΓòÉΓòÉΓòÉ
When animating objects with solid textures, the textures must move with the
object, i.e. apply the same rotate or translate functions to the texture as to
the object itself. This is now done automatically if the transformations are
placed _after_ the texture block.
Example:
shape { ...
pigment { ... }
scale < ... >
}
Will scale the shape and pigment texture by the same amount.
While:
shape { ...
scale < ... >
pigment { ... }
}
Will scale the shape, but not the pigment.
Constants can be declared for most of the data types in the program including
floats and vectors. By writing these to #include files, you can easily separate
the parameters for an animation into a separate file.
Some examples of declared constants would be:
#declare Y_Rotation = 5.0 * clock
#declare ObjectRotation = <0, Y_Rotation, 0>
#declare MySphere = sphere { <0, 0, 0>, 1.1234 }
Other examples can be found scattered throughout the sample scene files.
DOS users: Get ahold of DTA.EXE (Dave's Targa Animator) for creating .FLI/.FLC
animations. AAPLAY.EXE and PLAY.EXE are common viewers for this type of file.
When moving the camera in an animation (or placing one in a still image, for
that matter) avoid placing the camera directly over the origin. This will
cause very strange errors. Instead, move off center slightly and avoid
hovering directly over the scene.
ΓòÉΓòÉΓòÉ 8.4. B.4 Textures ΓòÉΓòÉΓòÉ
Wood is designed like a "log", with growth rings aligned along the z axis.
Generally these will look best when scaled down by about a tenth (to a
unit-sized object). Start out with rather small value for the turbulence, too
(around 0.05 is good for starters).
The marble texture is designed around a pigment primitive that is much like an
x-gradient. When turbulated, the effect is different when viewed from the
"side" or from the "end". Try rotating it by 90 degrees on the y axis to see
the difference.
You cannot get specular highlights on a totally black object. Try using a very
dark gray, say Gray10 or Gray15, instead.
ΓòÉΓòÉΓòÉ 8.5. B.5 Height Fields ΓòÉΓòÉΓòÉ
Try using POV-Ray itself to create images for height_fields:
camera { location <0, 0, -2> }
plane { z, 0
finish { ambient 1 } // needs no light sources
pigment { bozo } // or whatever. Experiment.
}
That's all you'll need to create a .tga file that can then be used as a height
field in another image!
ΓòÉΓòÉΓòÉ 8.6. B.6 Field-Of-View ΓòÉΓòÉΓòÉ
By making the direction vector in the camera longer, you can achieve the effect
of a tele-photo lens. Shorter direction vectors will give a kind of wide-angle
affect, but you may see distortion at the edges of the image. See the file
"fov.inc" in the \POVRAY\INCLUDE directory for some predefined field-of-view
values.
If your spheres and circles aren't round, try increasing the direction vector
slightly. Often a value of 1.5 works better than the 1.0 default when spheres
appear near the edge of the screen.
ΓòÉΓòÉΓòÉ 8.7. B.7 Converting "HANDEDNESS" ΓòÉΓòÉΓòÉ
If you are importing images from other systems, you may find that the shapes
are backwards (left-to-right inverted) and no rotation can make them correct.
Often, all you have to do is negate the terms in the right vector of the camera
to flip the camera left-to-right (use the "right-hand" coordinate system).
Some programs seem to interpret the coordinate systems differently, however, so
you may need to experiment with other camera transformations if you want the y
and z vectors to work as POV-Ray does.
ΓòÉΓòÉΓòÉ 9. APPENDIX C Suggested Reading ΓòÉΓòÉΓòÉ
First, a shameless plug for two books that are specifically about POV-Ray:
The Waite Group's Ray Tracing Creations
By Drew Wells & Chris Young
ISBN 1-878739-27-1
Waite Group Press
1993
and
The Waite Group's Image Lab
By Tim Wegner
ISBN 1-878739-11-5
Waite Group Press
1992
Image Lab by Tim Wegner contains a chapter about POV-Ray. Tim is the co- author
of the best selling book, Fractal Creations, also from the Waite Group.
Ray Tracing Creations by Drew Wells and Chris Young is an entire book about ray
tracing with POV-Ray.
This section lists several good books or periodicals that you should be able to
locate in your local computer book store or your local university library.
"An Introduction to Ray tracing"
Andrew S. Glassner (editor)
ISBN 0-12-286160-4
Academic Press
1989
"3D Artist" Newsletter
("The Only Newsletter about Affordable
PC 3D Tools and Techniques")
Publisher: Bill Allen
P.O. Box 4787
Santa Fe, NM 87502-4787
(505) 982-3532
"Image Synthesis: Theory and Practice"
Nadia Magnenat-Thalman and Daniel Thalmann
Springer-Verlag
1987
"The RenderMan Companion"
Steve Upstill
Addison Wesley
1989
"Graphics Gems"
Andrew S. Glassner (editor)
Academic Press
1990
"Fundamentals of Interactive Computer Graphics"
J. D. Foley and A. Van Dam
ISBN 0-201-14468-9
Addison-Wesley
1983
"Computer Graphics: Principles and Practice (2nd Ed.)"
J. D. Foley, A. van Dam, J. F. Hughes
ISBN 0-201-12110-7
Addison-Wesley,
1990
"Computers, Pattern, Chaos, and Beauty"
Clifford Pickover
St. Martin's Press
"SIGGRAPH Conference Proceedings"
Association for Computing Machinery
Special Interest Group on Computer Graphics
"IEEE Computer Graphics and Applications"
The Computer Society
10662, Los Vaqueros Circle
Los Alamitos, CA 90720
"The CRC Handbook of Mathematical Curves and Surfaces"
David von Seggern
CRC Press
1990
"The CRC Handbook of Standard Mathematical Tables"
CRC Press
The Beginning of Time
ΓòÉΓòÉΓòÉ 10. APPENDIX D Legal Information ΓòÉΓòÉΓòÉ
The following is legal information pertaining to the use of the Persistence of
Vision Ray Tracer a.k.a POV-Ray. It applies to all POV-Ray source files,
executable (binary) files, scene files, documentation files contained in the
official POV archives. (Certain portions refer to custom versions of the
software, there are specific rules listed below for these versions also.) All
of these are referred to here as "the software".
THIS NOTICE MUST ACCOMPANY ALL OFFICIAL OR CUSTOM PERSISTENCE OF VISION FILES.
IT MAY NOT BE REMOVED OR MODIFIED. THIS INFORMATION PERTAINS TO ALL USE OF THE
PACKAGE WORLDWIDE. THIS DOCUMENT SUPERSEDES ALL PREVIOUS LICENSES OR
DISTRIBUTION POLICIES.
IMPORTANT LEGAL INFORMATION
Permission is granted to the user to use the Persistence of Vision Raytracer
and all associated files in this package to create and render images. The use
of this software for the purpose of creating images is free. The creator of a
scene file and the image created from the scene file, retains all rights to the
image and scene file they created and may use them for any purpose commercial
or non-commercial.
The user is also granted the right to use the scenes files and include files
distributed in the INCLUDE and DEMO sub-directories of the POVDOC archive when
creating their own scenes. Such permission does not extend to files in the
POVSCN archive. POVSCN files are for your enjoyment and education but may not
be the basis of any derivative works.
This software package and all of the files in this archive are copyrighted and
may only be distributed and/or modified according to the guidelines listed
below. The spirit of the guidelines below is to promote POV-Ray as a standard
ray tracer, provide the full POV-Ray package freely to as many users as
possible, prevent POV-Ray users and developers from being taken advantage of,
enhance the life quality of those who come in contact with POV-Ray. This legal
document was created so these goals could be realized. You are legally bound to
follow these rules, but we hope you will follow them as a matter of ethics,
rather than fear of litigation.
No portion of this package may be separated from the package and distributed
separately other than under the conditions specified in the guidelines below.
This software may be bundled in other software packages according to the
conditions specified in the guidelines below.
This software may be included in software-only compilations using media such
as, but not limited to, floppy disk, CD-ROM, tape backup, optical disks, hard
disks, or memory cards. There are specific rules and guidelines listed below
for the provider to follow in order to legally offer POV-Ray with a software
compilation.
The user is granted the privilege to modify and compile the source for their
own personal use in any fashion they see fit. What you do with the software in
your own home is your business.
If the user wishes to distribute a modified version of the software (here after
referred to as a "custom version") they must follow the guidelines listed
below. These guidelines have been established to promote the growth of POV-Ray
and prevent difficulties for users and developers alike. Please follow them
carefully for the benefit of all concerned when creating a custom version.
You may not incorporate any portion of the POV-Ray source code in any software
other than a custom version of POV-Ray. However authors who contribute source
to POV-Ray may still retain all rights to use their contributed code for any
purpose as described below.
The user is encouraged to send enhancements and bug fixes to the POV-Team, but
the team is in no way required to utilize these enhancements or fixes. By
sending material to the POV-Team, the contributor asserts that he owns the
materials or has the right to distribute these materials. He authorizes the
POV-Team to use the materials any way they like. The contributor still retains
rights to the donated material, but by donating you grant equal rights to the
POV-Team. The POV-Team doesn't have to use the material, but if we do, you do
not acquire any rights related to POV- Ray. We will give you credit if
applicable.
GENERAL RULES FOR ALL DISTRIBUTION
The permission to distribute this package under certain very specific
conditions is granted in advance, provided that the above and following
conditions are met.
These archives must not be re-archived using a different method without the
explicit permission of the POV-Team. You may rename the archives only to meet
the file name conventions of your system or to avoid file name duplications but
we ask that you try to keep file names as similar to the originals as possible.
(For example: POVDOC.ZIP to POVDOC20.ZIP)
You must distribute a full package of archives as described in the next
section.
Non-commercial distribution (such as a user copying the software for a personal
friend or colleague and not charging money or services for that copy) has no
other restrictions. This does not include non-profit organizations or computer
clubs. These groups should use the Shareware/Freeware distribution company
rules below.
The POV-Team reserves the right to withdraw distribution privileges from any
group, individual, or organization for any reason.
DEFINITION OF "FULL PACKAGE"
POV-Ray is contained in 4 archives for each hardware platform.
1. An executable archive,
2. A documentation archive,
3. Sample scene archives,
4. Source code archive.
A "full package" is defined as one of the following bundle options:
1. All archives (executable, docs, scenes, source)
2. User archives (executable, docs, scenes but no source)
3. Programmer archives (source, docs, scenes but no executable)
POV-Ray is officially distributed for IBM-PC compatibles running MS-Dos; Apple
Macintosh; and Commodore Amiga. Other systems may be added in the future.
Distributors need not support all platforms but for each platform you support
you must distribute a full package. For example an IBM-only BBS need not
distribute the Mac versions.
CONDITIONS FOR DISTRIBUTION OF CUSTOM VERSIONS
You may distribute custom compiled versions only if you comply with the
following conditions.
o Mark your version clearly on all modified files stating this to be a modified
and unofficial version.
o Make all of your modifications to POV-Ray freely and publicly available.
o You must provide all POV-Ray support for all users who use your custom
version. The POV-Ray Team is not obligated to provide you or your users any
technical support.
o You must provide documentation for any and all modifications that you have
made to the program that you are distributing.
o Include clear and obvious information on how to obtain the official POV-Ray.
o Include contact and support information for your version. Include this
information in the DISTRIBUTION_MESSAGE macros in the source file FRAME.H and
insure that the program prominently displays this information. Include all
credits and credit screens for the official version.
o Include a copy of this document.
CONDITIONS FOR COMMERCIAL BUNDLING
Vendors wishing to bundle POV-Ray with commercial software or with publications
must first obtain explicit permission from the POV-Ray Team. This includes any
commercial software or publications, such as, but not limited to, magazines,
books, newspapers, or newsletters in print or machine readable form.
The POV-Ray Team will decide if such distribution will be allowed on a
case-by-case basis and may impose certain restrictions as it sees fit. The
minimum terms are given below. Other conditions may be imposed.
o Purchasers of your product must not be led to believe that they are paying
for POV-Ray. Any mention of the POV-Ray bundle on the box, in advertising or
in instruction manuals must be clearly marked with a disclaimer that POV-Ray
is free software and can be obtained for free or nominal cost from various
sources.
o Include clear and obvious information on how to obtain the official POV-Ray.
o Include a copy of this document.
o You must provide all POV-Ray support for all users who acquired POV- Ray
through your product. The POV-Ray Team is not obligated to provide you or
your customers any technical support.
o Include a credit page or pages in your documentation for POV-Ray.
o If you modify any portion POV-Ray for use with your hardware or software, you
must follow the custom version rules in addition to these rules.
o Include contact and support information for your product.
o Must include official documentation with product.
CONDITIONS FOR SHAREWARE/FREEWARE DISTRIBUTION COMPANIES
Shareware and freeware distribution companies may distribute the archives under
the conditions following this section.
You must notify us that you are distributing POV-Ray and must provide us with
information on how to contact you should any support issues arise.
No more than five dollars U.S. ($5) can be charged per disk for the copying of
this software and the media it is provided on. Space on each disk must used
completely. The company may not put each archive on a separate disk and charge
for three disks if all three archives will fit on one disk. If more than one
disk is needed to store the archives then more than one disk may be used and
charged for.
Distribution on high volume media such as backup tape or CD-ROM is permitted if
the total cost to the user is no more than $0.10 per megabyte of data. For
example a CD-ROM with 600 meg could cost no more than $60.00.
CONDITIONS FOR ON-LINE SERVICES AND BBS'S
On-line services and BBS's may distribute the POV-Ray archives under the
conditions following this section.
The archives must be all be easily available on the service and should be
grouped together in a similar on-line area.
It is strongly requested that BBS operators remove prior versions of POV- Ray
to avoid user confusion and simplify or minimize our support efforts.
The on-line service or BBS may only charge standard usage rates for the
downloading of this software. A premium may not be charged for this package.
I.E. CompuServe or America On-Line may make these archives available to their
users, but they may only charge regular usage rates for the time required to
download. They must also make the all of the archives available in the same
forum, so they can be easily located by a user.
DISCLAIMER
This software is provided as is without any guarantees or warranty. Although
the authors have attempted to find and correct any bugs in the package, they
are not responsible for any damage or losses of any kind caused by the use or
misuse of the package. The authors are under no obligation to provide service,
corrections, or upgrades to this package.
ΓòÉΓòÉΓòÉ 11. APPENDIX E Contacting The Authors ΓòÉΓòÉΓòÉ
We love to hear about how you're using and enjoying the program. We also will
do our best try to solve any problems you have with POV-Ray and incorporate
good suggestions into the program.
If you have a question regarding commercial use of, distribution of, or
anything particularly sticky, please contact Chris Young, the development team
coordinator. Otherwise, spread the mail around. We all love to hear from you!
The best method of contact is e-mail through CompuServe for most of us. America
On-Line and Internet can now send mail to CompuServe, also, just use the
Internet address and the mail will be sent through to CompuServe where we read
our mail daily.
Please do not send large files to us through the e-mail without asking first.
We pay for each minute on CompuServe and large files can get expensive. Send a
query before you send the file, thanks!
Chris Young
(Team Coordinator. Worked on everything.)
CIS: 76702,1655
Internet 76702.1655@compuserve.com
US Mail:
3119 Cossell Drive
Indianapolis, IN 46224 U.S.A.
Drew Wells
(Former team leader. Worked on everything.)
CIS: 73767,1244
Internet: 73767.1244@compuserve.com
AOL: Drew Wells
Prodigy: SXNX74A (Not used often)
Other authors and contributors in alphabetical order:
-----------------------------------------------------
David Buck
(Original author of DKBTrace)
(Primary developer, quadrics, docs)
INTERNET: (preferred) dbuck@ccs.carleton.ca
CIS: 70521,1371
Aaron Collins
(Co-author of DKBTrace 2.12)
(Primary developer, IBM-PC display code,phong)
CIS: 70324,3200
Alexander Enzmann
(Primary developer, Blobs, quartics, boxes, spotlights)
CIS: 70323,2461
INTERNET: xander@mitre.com
Dan Farmer
(Primary developer, docs, scene files)
CIS:70703,1632
Douglas Muir
(Bump maps and height fields)
CIS: 76207,662
Internet: dmuir@media-lab.media.mit.edu
Bill Pulver
(Time code and IBM-PC compile)
CIS: 70405,1152
AOL: BPulver
Charles Marslette
(IBM-PC display code)
CIS: 75300,1636
Mike Miller
(Artist, scene files, stones.inc)
CIS: 70353,100
Jim Nitchals
(Mac version, scene files)
CIS: 73117,3020
AppleLink: jimn8
Internet: 73117.3020@compuserve.com
Eduard Schwan
(Mac version, docs)
CIS: 71513,2161
AppleLink: JL.Tech
Internet: 71513.2161@compuserve.com
Randy Antler
(IBM-PC display code enhancements)
CIS: 71511,1015
David Harr
(Mac balloon help)
CIS: 72117,1704
Scott Taylor
(Leopard and Onion textures)
CIS: 72401,410
Chris Cason
(colour X-Windows display code)
CIS: 100032,1644
Dave Park
(Amiga support; added AGA video code)
CIS: 70004,1764