3.6 Interior & Media & Photons |
POV-Ray 3.6 for UNIX documentation 3.6.1 Interior |
3.6.2 Media |
Introduced in POV-Ray 3.1 is an object modifier statement called interior
. The syntax is:
INTERIOR: interior { [INTERIOR_IDENTIFIER] [INTERIOR_ITEMS...] } INTERIOR_ITEM: ior Value | caustics Value | dispersion Value | dispersion_samples Samples | fade_distance Distance | fade_power Power | fade_color <Color> MEDIA...
ior : 1.0 caustics : 0.0 dispersion : 1.0 dispersion_samples : 7 fade_distance : 0.0 fade_power : 0.0 fade_color : <0,0,0>
The interior
contains items which describe the properties of the interior of the object. This is in
contrast to the texture
and interior_texture
which describe the surface properties only.
The interior of an object is only of interest if it has a transparent texture which allows you to see inside the
object. It also applies only to solid objects which have a well-defined inside/outside distinction.
Note: the open
keyword, or clipped_by
modifier also allows
you to see inside but interior features may not render properly. They should be avoided if accurate interiors are
required.
Interior identifiers may be declared to make scene files more readable and to parameterize scenes so that changing a single declaration changes many values. An identifier is declared as follows.
INTERIOR_DECLARATION: #declare IDENTIFIER = INTERIOR | #local IDENTIFIER = INTERIOR
Where IDENTIFIER is the name of the identifier up to 40 characters long and INTERIOR is any valid interior
statement. See "#declare vs. #local" for information on identifier
scope.
In previous versions of POV-Ray, most of the items in the interior
statement were previously part of
the finish
statement. Also the halo
statement which was once part of the texture
statement has been discontinued and has been replaced by the media
statement which is
part of interior
.
You are probably asking WHY? As explained earlier, the interior
contains items which
describe the properties of the interior of the object. This is in contrast to the texture
which describes
the surface properties only. However this is not just a philosophical change. There were serious inconsistencies in
the old model.
The main problem arises when a texture_map
or other patterned
texture is used. These features allow you to create textures that are a blend of two textures and which vary the
entire texture from one point to another. It does its blending by fully evaluating the apparent color as though only
one texture was applied and then fully reevaluating it with the other texture. The two final results are blended.
It is totally illogical to have a ray enter an object with one index or refraction and then recalculate with another index. The result is not an average of the two ior values. Similarly it makes no sense to have a ray enter at one ior and exit at a different ior without transitioning between them along the way. POV-Ray only calculates refraction as the ray enters or leaves. It cannot incrementally compute a changing ior through the interior of an object. Real world objects such as optical fibers or no-line bifocal eyeglasses can have variable iors but POV-Ray cannot simulate them.
Similarly the halo
calculations were not performed as the syntax implied. Using a halo
in
such multi-textured objects did not vary the halo
through the interior of the object. Rather, it computed
two separate halos through the whole object and averaged the results. The new design for media
which
replaces halo
makes it possible to have media that varies throughout the interior of the object
according to a pattern but it does so independently of the surface texture. Because there are other changes in the
design of this feature which make it significantly different, it was not only moved to the interior
but
the name was changed.
During our development, someone asked if we will create patterned interiors or a hypothetical interior_map
feature. We will not. That would defeat the whole purpose of moving these features in the first place. They cannot be
patterned and have logical or self-consistent results.
It is very important that you know the basic concept behind empty and solid objects in POV-Ray to fully understand how features like interior and translucency are used. Objects in POV-Ray can either be solid, empty or filled with (small) particles.
A solid object is made from the material specified by its pigment and finish statements (and to some degree its normal statement). By default all objects are assumed to be solid. If you assign a stone texture to a sphere you will get a ball made completely of stone. It is like you had cut this ball from a block of stone. A glass ball is a massive sphere made of glass. You should be aware that solid objects are conceptual things. If you clip away parts of the sphere you will clearly see that the interior is empty and it just has a very thin surface.
This is not contrary to the concept of a solid object used in POV-Ray. It is assumed that all space inside the
sphere is covered by the sphere's interior
. Light passing through the object is affected by attenuation
and refraction properties. However there is no room for any other particles like those used by fog or interior media.
Empty objects are created by adding the hollow
keyword (see "Hollow") to the object
statement. An empty (or hollow) object is assumed to be made of a very thin surface which is of the material specified
by the pigment, finish and normal statements. The object's interior is empty, it normally contains air molecules.
An empty object can be filled with particles by adding fog or atmospheric media to the scene or by adding an interior media to the object. It is very important to understand that in order to fill an object with any kind of particles it first has to be made hollow.
There is a pitfall in the empty/solid object implementation that you have to be aware of.
In order to be able to put solid objects inside a media or fog, a test has to be made for every ray that passes through the media. If this ray travels through a solid object the media will not be calculated. This is what anyone will expect. A solid glass sphere in a fog bank does not contain fog.
The problem arises when the camera ray is inside any non-hollow object. In this case the ray is already traveling through a solid object and even if the media's container object is hit and it is hollow, the media will not be calculated. There is no way of telling between these two cases.
POV-Ray has to determine whether the camera is inside any object prior to tracing a camera ray in order to be able to correctly render medias when the camera is inside the container object. There is no way around doing this.
The solution to this problem (that will often happen with infinite objects like planes) is to make those objects hollow too. Thus the ray will travel through a hollow object, will hit the container object and the media will be calculated.
All the statements that can be put in an interior represent aspects of the matter that an object is made of. Scaling an object, changing its size, does not change its matter. Two pieces of the same quality steel, one twice as big as the other, both have the same density. The bigger piece is quite a bit heavier though.
So, in POV-Ray, if you design a lens from a glass with an ior of 1.5 and you scale it bigger, the focal distance of
the lens will get longer as the ior stays the same. For light attenuation it means that an object will be
"darker" after being scaled up. The light intensity decreases a certain amount per pov-unit. The object has
become bigger, more pov-units, so more light is faded. The fade_distance, fade_power
themselves have not
been changed.
The same applies to media. Imagine media as a density of particles, you specify 100 particles per cubic pov-unit.
If we scale a 1 cubic pov-unit object to be twice as big in every direction, we will have a total of 800 particles in
the object. The object will look different, as we have more particles to look through. Yet the objects density is
still 100 particles per cubic pov-unit. In media this "particle density" is set by the color after emission
,
absorption
, or in the scattering
statement
#version 3.5; global_settings {assumed_gamma 1.0} camera {location <0, 0,-12.0> look_at 0 angle 30 } #declare Container_T= texture { pigment {rgbt <1,1,1,1>} finish {ambient 0 diffuse 0} } #declare Scale=2; box { //The reference <-1,-1,0>,<1,1,.3> hollow texture {Container_T} interior { media { intervals 1 samples 1,1 emission 1 } } translate <-2.1,0,0> } box { //Object scaled twice as big <-1,-1,0>,<1,1,.3> //looks different but same hollow //particle density texture {Container_T} interior { media { intervals 1 samples 1,1 emission 1 } } scale Scale translate<0,0,12> } box { //Object scaled twice as big <-1,-1,0>,<1,1,.3> //looks the same but particle hollow //density scaled down texture {Container_T} interior { media { intervals 1 samples 1,1 emission 1/Scale } } scale Scale translate<0,0,12> translate<4.2,0,0> }
The third object in the scene above, shows what to do, if you want to scale the object and want it to keep the same look as before. The interior feature has to be divided by the same amount, that the object was scaled by. This is only possible when the object is scaled uniform.
In general, the correct approach is to scale the media density proportionally to the change in container volume. For non-uniform scaling to get an unambiguous result, that can be explained in physical terms, we need to do:
Density*sqrt(3)/vlength(Scale)
where Density is your original media density and Scale is the scaling vector applied to the container.
Note: the density modifiers inside the density{}
statement are scaled
along with the object.
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. The amount of bending or refracting of light depends upon the density of the
material. Air, water, crystal and diamonds all have different densities 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 in the interior
to turn on refraction and to specify the ior value. For
example:
object { MyObject pigment {Clear } interior { 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.
Normally transparent or semi-transparent surfaces in POV-Ray do not refract light. Earlier versions of POV-Ray
required you to use the refraction
keyword in the finish
statement to turn on refraction.
This is no longer necessary. Any non-zero ior
value now turns refraction on.
In addition to turning refraction on or off, the old refraction
keyword was followed by a float value
from 0.0 to 1.0. Values in between 0.0 and 1.0 would 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
or transmit
value in the colors specified in the pigment statement or to use the fade_power
and fade_distance
keywords. See "Attenuation".
Note: neither the ior
nor refraction
keywords cause the
object to be transparent. Transparency only occurs if there is a non-zero filter
or transmit
value in the color.
The refraction
and ior
keywords were originally specified in finish
but are
now properly specified in interior
. They are accepted in finish
for
backward compatibility and generate a warning message.
For all materials with a ior different from 1.0 the refractive index is not constant throughout the spectrum. It changes as a function of wavelength. Generally the refractive index decreases as the wavelength increases. Therefore light passing through a material will be separated according to wavelength. This is known as chromatic dispersion.
By default POV-Ray does not calculate dispersion as light travels through a transparent object. In order to get a
more realistic effect the dispersion
and dispersion_samples
keywords can be added to the interior{}
block. They will simulate dispersion by creating a prismatic color effect in the object.
The dispersion
value is the ratio of refractive indices for violet to red. It controls the strength of
dispersion (how much the colors are spread out) used. A DISPERSION_VALUE of 1 will give no dispersion, good values are
1.01 to 1.1.
Note: there will be no dispersion, unless the ior
keyword has been
specified in interior{ }
. An ior of 1 is legal. The ior has no influence on the dispersion strength, only
on the angle of refraction.
As POV-Ray does not use wavelengths for raytracing, a spectrum is simulated. The dispersion_samples
value controls the amount of color-steps and smoothness in the spectrum. The default value is 7, the minimum is 2.
Values up to 100 or higher may be needed to get a very smooth result.
Dispersion only affects the interior of an object and has no effect on faked caustics (See "Faked
Caustics").
To see the effects of dispersion in caustics, photon mapping is needed (See the sections
"Photons" and "Dispersion & Photons").
Light attenuation is used to model the decrease in light intensity as the light travels through a transparent
object. The keywords fade_power
, fade_distance
and fade_color
are specified in
the interior
statement.
The fade_distance
value determines the distance the light has to travel to reach half intensity while
the fade_power
value determines how fast the light will fall off. fade_color
colorizes the
attenuation. For realistic effects a fade power of 1 to 2 should be used. Default values for fade_power
and fade_distance
is 0.0 which turns this feature off. Default for fade_color
is <0,0,0>
,
if fade_color
is <1,1,1>
there is no attenuation. The actual colors give colored
attenuation. <1,0,0>
looks red, not cyan as in media.
The attenuation is calculated by a formula similar to that used for light source attenuation.
If you set fade_power in the interior of an object at 1000 or above, a realistic exponential attenuation function will be used:
Attenuation = exp(-depth/fade_dist)
The fade_power
and fade_distance
keywords were originally specified in finish
but are now properly specified in interior
. They are accepted in finish
for backward
compatibility and generate a warning message.
Caustics are light effects that occur if light is reflected or refracted by specular reflective or refractive surfaces. Imagine a glass of water standing on a table. If sunlight falls onto the glass you will see spots of light on the table. Some of the spots are caused by light being reflected by the glass while some of them are caused by light being refracted by the water in the glass.
Since it is a very difficult and time-consuming process to actually calculate those effects (though it is not impossible, see the sections "Photons") POV-Ray uses a quite simple method to simulate caustics caused by refraction. The method calculates the angle between the incoming light ray and the surface normal. Where they are nearly parallel it makes the shadow brighter. Where the angle is greater, the effect is diminished. Unlike real-world caustics, the effect does not vary based on distance. This caustic effect is limited to areas that are shaded by the transparent object. You will get no caustic effects from reflective surfaces nor in parts that are not shaded by the object.
The caustics
Power
keyword controls the effect. Values typically range from 0.0
to 1.0 or higher. Zero is the default which is no caustics. Low, non-zero values give broad hot-spots while higher
values give tighter, smaller simulated focal points.
The caustics
keyword was originally specified in finish
but is now properly specified
in interior
. It is accepted in finish
for backward compatibility and generates a warning
message.
The interior
statement may contain one or more media
statements. Media is used to
simulate suspended particles such as smoke, haze, or dust. Or visible gasses such as steam or fire and explosions.
When used with an object interior, the effect is constrained by the object's shape. The calculations begin when the
ray enters an object and ends when it leaves the object. This section only discusses media when used with object
interior. The complete syntax and an explanation of all of the parameters and options for media
is given
in the section "Media".
Typically the object itself is given a fully transparent texture however media also works in partially transparent objects. The texture pattern itself does not effect the interior media except perhaps to create shadows on it. The texture pattern of an object applies only to the surface shell. Any interior media patterns are totally independent of the texture.
In previous versions of POV-Ray, this feature was called halo
and was part of the texture
specification along with pigment
, normal
, and finish
. See "Why
are Interior and Media Necessary?" for an explanation of the reasons for the change.
Media may also be specified outside an object to simulate atmospheric media. There is no constraining object in this case. If you only want media effects in a particular area, you should use object media rather than only relying upon the media pattern. In general it will be faster and more accurate because it only calculates inside the constraining object. See "Atmospheric Media" for details on unconstrained uses of media.
You may specify more than one media
statement per interior
statement. In that case, all
of the media participate and where they overlap, they add together.
Any object which is supposed to have media effects inside it, whether those effects are object media or atmospheric
media, must have the hollow on
keyword applied. Otherwise the media is blocked. See "Empty
and Solid Objects" for details.
3.6 Interior & Media & Photons | 3.6.1 Interior | 3.6.2 Media |