| The Light leaf node is an abstract class that defines a set of
parameters common to all
types of light. These parameters include the light color, an enable
flag, and a region of influence in which this Light node is active.
A Light node also contains a list of Group nodes that specifies the
hierarchical scope of this Light. If the scope list is empty,
the Light node has universe scope: all nodes within the region of
influence are affected by this Light node. If the scope list is
non-empty, only those Leaf nodes under the Group nodes in the
scope list are affected by this Light node (subject to the
influencing bounds).
The light in a scene may come from several light sources that can
be individually defined. Some of the light in a scene may
come from a specific direction, known as a directional light,
from a specific position, known as a point light, or
from no particular direction or source as with ambient light.
Java 3D supports an arbitrary number of lights. However, the number
of lights that can be active within the region of influence is
implementation-dependent and cannot be defined here.
Light Color
The Java 3D lighting model approximates the way light works in
the real world. Light is defined in terms of the red, green, and
blue components that combine to create the light color. The
three color components represent the amount of light emitted
by the source.
Each of the three colors is represented by a
floating point value that ranges from 0.0 to 1.0. A combination
of the three colors such as (1.0, 1.0, 1.0), representing
the red, green, and blue color values respectively, creates a white
light with maximum brightness. A combination such as (0.0, 0.0,
0.0) creates no light (black). Values between the minimum and
maximum values of the range produce corresponding brightness
and colors. For example, a combination of (0.5, 0.5, 0.5)
produces a 50% grey light. A combination of (1.0, 1.0, 0.0),
red and green but no blue, produces a yellow light.
If a scene has multiple lights and all lights illuminate an object,
the effect of the light on the object is the sum of the
lights. For example, in a scene with two lights, if the first
light emits (R1, G1, B1) and
the second light emits (R2, G2,
B2), the components are added together giving
(R1+R2, G1+G2,
B1+B2).
If the sums of any of the color values is greater than 1.0,
brighter than the maximum brightness permitted, the color value is
clamped to 1.0.
Material Colors
In the Java 3D lighting model, the light sources have an effect
on the scene only when there are object surfaces to absorb or
reflect the light. Java 3D approximates an object's color
by calculating the percentage of red, green, and blue light
the object reflects. An object with a surface color of pure green
absorbs all of the red and blue light that strikes it and
reflects all of the green light. Viewing the object in a
white light, the green color is reflected and you see a green
object. However, if the green object is viewed in a red light,
all of the red light is absorbed and the object appears black.
The surface of each object in the scene has
certain material properties that define how light affects its
appearance. The object might reflect light in various ways,
depending on the object's surface type. The object
might even emit its own light. The Java 3D lighting model specifies
these material properties as five independent components: emitted
color, ambient color, diffuse color, specular color, and shininess.
All of these properties are computed independently, then added
together to define how the surface of the object appears under
light (an exception is Ambient light, which does not contribute
to specular reflection). The material properties are defined
in the Material class.
Influencing Bounds
Since a scene may be quite large, as large as the universe for
example, it is often reasonable to limit the influence of lighting
to a region that is within viewing range. There is no reason
to waste all that computing power on illuminating objects that
are too far away to be viewed. In Java 3D, the influencing bounds
is defined by a Bounds object or a BoundingLeaf object. It should
be noted that a BoundingLeaf object overrides a Bounds object,
should both objects be set.
A Bounds object represents a convex, closed volume. Bounds
defines three different types of containing
volumes: an axis-aligned-box volume, a spherical volume, and a
bounding polytope. A BoundingLeaf object also specifies a region
of influence, but allows an application to specify a bounding
region in one coordinate system (the local coordinate system of
the BoundingLeaf node) other than the local coordinate
system of the node that references the bounds (the Light).
Limiting the Scope
In addition to limiting the lighting calculations to a given
region of a scene, lighting can also be limited to groups of
nodes, defined by a Group object. This is known as "scoping."
All nodes attached to a Group node define a list of scopes.
Methods in the Light class permit the setting, addition, insertion,
removal, and enumeration of nodes in the list of scopes.
Two-sided Lighting of Polygons
Java 3D performs lighting calculations for all polygons, whether
they are front-facing or back-facing. Since most polygon objects
are constructed with the front face in mind, the back-facing
portion may not be correctly illuminated. For example, a sphere
with part of the face cut away so you can see its inside.
You might want to have the inside surface lit as well as the
outside surface and you mught also want to define a different
Material description to reduce shininess, specular color, etc.
For more information, see the "Face culling" and "Back-facing
normal flip" descriptions in the PolygonAttributes class
description.
Turning on the Lights
Lighting needs to be explicitly enabled with the setEnable method
or with the lightOn parameter in the constructor
before any of the child light sources have any effect on illuminating
the scene. The child lights may also be enabled or disabled individually.
If lighting is not enabled, the current color of an
object in the scene is simply mapped onto the object, and none of
the lighting equations regarding Material properties, such as ambient
color, diffuse color, specular color, and shininess, are performed.
However, an object's emitted color, if specified and enabled, will
still affect that object's appearance.
To disable lighting, call setEnable with false as
the argument.
See Also: Material See Also: Bounds See Also: BoundingLeaf See Also: Group See Also: PolygonAttributes |