Reference:Interior
Introduced in POV-Ray v3.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...
Interior default values:
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 a valid identifier name and INTERIOR is any valid interior
statement.
See also: Identifiers and #declare vs. #local for additional information on identifier naming and scope.
Why are Interior and Media Necessary?
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.
Empty and Solid Objects
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.
Scaling objects with an interior
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.
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. 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.
Dispersion
For all materials with an 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, with most realistic values usually restraining in the 1.01 to
1.08 range. Values less than 1 result in inverted dispersion.
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 & Caustics
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 Photons and Dispersion.
Attenuation
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.
Simulated Caustics
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.
Object-Media
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 the section: 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 the section: Empty and Solid Objects
for details.