| |
The Virtual Reality Modeling Language
6 Node reference

6.1 Introduction
This clause provides a detailed definition of the syntax and semantics
of each node in this part of ISO/IEC 14772. Table 6.1
lists the topics in this clause.
Table 6.1 -- Table of contents
In this clause, the first item in each subclause presents the public
declaration for the node. This syntax is not the actual UTF-8 encoding
syntax. The parts of the interface that are identical to the UTF-8 encoding
syntax are in bold. The node declaration defines the names and types
of the fields and events for the node, as well as the default values for
the fields.
The node declarations also include value ranges for the node's fields
and exposedFields (where appropriate). Parentheses imply that the range
bound is exclusive, while brackets imply that the range value is inclusive.
For example, a range of (- ,1]
defines the lower bound as -
exclusively and the upper bound as 1 inclusively.
For example, the following defines the Collision node declaration:
Collision {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children []
exposedField SFBool collide TRUE
field SFVec3f bboxCenter 0 0 0 # (- , )
field SFVec3f bboxSize -1 -1 -1 # (0, ) or -1,-1,-1
field SFNode proxy NULL
eventOut SFTime collideTime
}
The fields and events contained within the node declarations are ordered
as follows:
-
eventIns, in alphabetical order;
-
exposedFields, in alphabetical order;
-
fields, in alphabetical order;
-
eventOuts, in alphabetical order.
6.2
Anchor
Anchor {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children []
exposedField SFString description ""
exposedField MFString parameter []
exposedField MFString url []
field SFVec3f bboxCenter 0 0 0 # (- , )
field SFVec3f bboxSize -1 -1 -1 # (0, ) or -1,-1,-1
}
The Anchor grouping node retrieves the content of a URL when the user activates
(e.g., clicks) some geometry contained within the Anchor node's children.
If the URL points to a valid VRML file, that world replaces the world of
which the Anchor node is a part (except when the parameter field,
described below, alters this behaviour). If non-VRML data is retrieved,
the browser shall determine how to handle that data; typically, it will
be passed to an appropriate non-VRML browser.
Exactly how a user activates geometry contained by the Anchor node depends
on the pointing device and is determined by the VRML browser. Typically,
clicking with the pointing device will result in the new scene replacing
the current scene. An Anchor node with an empty url does nothing
when its children are chosen. A description of how multiple Anchors and
pointing-device sensors are resolved on activation is contained in 4.6.7,
Sensor nodes.
More details on the children, addChildren, and removeChildren
fields and eventIns can be found in 4.6.5,
Grouping and children nodes.
The description field in the Anchor node specifies a textual
description of the Anchor node. This may be used by browser-specific user
interfaces that wish to present users with more detailed information about
the Anchor.
The parameter exposed field may be used to supply any additional
information to be interpreted by the browser. Each string shall consist
of "keyword=value" pairs. For example, some browsers allow the specification
of a 'target' for a link to display a link in another part of an HTML document.
The parameter field is then:
Anchor {
parameter [ "target=name_of_frame" ]
...
}
An Anchor node may be used to bind the initial Viewpoint
node in a world by specifying a URL ending with "#ViewpointName" where
"ViewpointName" is the name of a viewpoint defined in the VRML file. For
example:
Anchor {
url "http://www.school.edu/vrml/someScene.wrl#OverView"
children Shape { geometry Box {} }
}
specifies an anchor that loads the VRML file "someScene.wrl" and binds
the initial user view to the Viewpoint node named "OverView" when the Anchor
node's geometry (Box) is activated. If the named Viewpoint node is not
found in the VRML file, the VRML file is loaded using the default Viewpoint
node binding stack rules (see 6.53, Viewpoint).
If the url field is specified in the form "#ViewpointName" (i.e.
no file name), the Viewpoint node with the given name ("ViewpointName")
in the Anchor's run-time name scope(s) shall be bound (set_bind TRUE).
The results are undefined if there are multiple Viewpoints with the same
name in the Anchor's run-time name scope(s). The results are undefined
if the Anchor node is not part of any run-time name scope or is part of
more than one run-time name scope. See 4.4.6,
Run-time name scope, for a description of run-time name scopes. See
6.53, Viewpoint, for the Viewpoint transition
rules that specify how browsers shall interpret the transition from the
old Viewpoint node to the new one. For example:
Anchor {
url "#Doorway"
children Shape { geometry Sphere {} }
}
binds the viewer to the viewpoint defined by the "Doorway" viewpoint in
the current world when the sphere is activated. In this case, if the Viewpoint
is not found, no action occurs on activation.
More details on the url field are contained in 4.5,
VRML and the World Wide Web.
The bboxCenter and bboxSize fields specify a bounding
box that encloses the Anchor's children. This is a hint that may be used
for optimization purposes. The results are undefined if the specified bounding
box is smaller than the actual bounding box of the children at any time.
The default bboxSize value, (-1, -1, -1), implies that the bounding
box is not specified and if needed shall be calculated by the browser.
More details on the bboxCenter and bboxSize fields can be
found in 4.6.4,
Bounding boxes.
6.3
Appearance
Appearance {
exposedField SFNode material NULL
exposedField SFNode texture NULL
exposedField SFNode textureTransform NULL
}
The Appearance node specifies the visual properties of geometry. The value
for each of the fields in this node may be NULL. However, if the field
is non-NULL, it shall contain one node of the appropriate type.
The material field, if specified, shall contain a Material
node. If the material field is NULL or unspecified, lighting is
off (all lights are ignored during rendering of the object that references
this Appearance) and the unlit object colour is (1, 1, 1). Details of the
VRML lighting model are in 4.14,
Lighting model.
The texture field, if specified, shall contain one of the various
types of texture nodes (ImageTexture, MovieTexture,
or PixelTexture). If the texture node is NULL
or the texture field is unspecified, the object that references
this Appearance is not textured.
The textureTransform field, if specified, shall contain a TextureTransform
node. If the textureTransform is NULL or unspecified, the textureTransform
field has no effect.
6.4
AudioClip
AudioClip {
exposedField SFString description ""
exposedField SFBool loop FALSE
exposedField SFFloat pitch 1.0 # (0, )
exposedField SFTime startTime 0 # (- , )
exposedField SFTime stopTime 0 # (- , )
exposedField MFString url []
eventOut SFTime duration_changed
eventOut SFBool isActive
}
An AudioClip node specifies audio data that can be referenced by Sound
nodes.
The description field specifies a textual description of the
audio source. A browser is not required to display the description
field but may choose to do so in addition to playing the sound.
The url field specifies the URL from which the sound is loaded.
Browsers shall support at least the wavefile format in uncompressed
PCM format (see E.[WAV]).
It is recommended that browsers also support the MIDI file type 1 sound
format (see 2.[MIDI]);
MIDI files are presumed to use the General MIDI patch set. Subclause 4.5,
VRML and the World Wide Web, contains details on the url field.
The results are undefined when no URLs refer to supported data types
The loop, startTime, and stopTime exposedFields and the
isActive
eventOut, and their effects on the AudioClip node, are discussed in detail
in 4.6.9,
Time-dependent nodes. The "cycle" of an AudioClip is the length
of time in seconds for one playing of the audio at the specified pitch.
The pitch field specifies a multiplier for the rate at which
sampled sound is played. Values for the pitch field shall be greater
than zero. Changing the pitch field affects both the pitch
and playback speed of a sound. A set_pitch event to an active AudioClip
is ignored and no pitch_changed eventOut is generated. If pitch
is set to 2.0, the sound shall be played one octave higher than normal
and played twice as fast. For a sampled sound, the pitch field alters
the sampling rate at which the sound is played. The proper implementation
of pitch control for MIDI (or other note sequence sound clips) is to multiply
the tempo of the playback by the pitch value and adjust the MIDI
Coarse Tune and Fine Tune controls to achieve the proper pitch change.
A duration_changed event is sent whenever there is a new value
for the "normal" duration of the clip. Typically, this will only occur
when the current url in use changes and the sound data has been
loaded, indicating that the clip is playing a different sound source. The
duration is the length of time in seconds for one cycle of the audio for
a pitch set to 1.0. Changing the pitch field will not trigger
a duration_changed event. A duration value of "-1" implies that
the sound data has not yet loaded or the value is unavailable for some
reason. A duration_changed event shall be generated if the AudioClip
node is loaded when the VRML file is read or the AudioClip node is added
to the scene graph.
The isActive eventOut may be used by other nodes to determine
if the clip is currently active. If an AudioClip is active, it shall be
playing the sound corresponding to the sound time (i.e., in the sound's
local time system with sample 0 at time 0):
t = (now - startTime) modulo (duration / pitch)
6.5
Background
Background {
eventIn SFBool set_bind
exposedField MFFloat groundAngle [] # [0, /2]
exposedField MFColor groundColor [] # [0,1]
exposedField MFString backUrl []
exposedField MFString bottomUrl []
exposedField MFString frontUrl []
exposedField MFString leftUrl []
exposedField MFString rightUrl []
exposedField MFString topUrl []
exposedField MFFloat skyAngle [] # [0, ]
exposedField MFColor skyColor 0 0 0 # [0,1]
eventOut SFBool isBound
}
The Background node is used to specify a colour backdrop that simulates
ground and sky, as well as a background texture, or panorama, that
is placed behind all geometry in the scene and in front of the ground and
sky. Background nodes are specified in the local coordinate system and
are affected by the accumulated rotation of their ancestors as described
below.
Background nodes are bindable nodes as described in 4.6.10,
Bindable children nodes. There exists a Background stack, in which
the top-most Background on the stack is the currently active Background.
To move a Background to the top of the stack, a TRUE value is sent to the
set_bind eventIn. Once active, the Background is then bound to the
browsers view. A FALSE value sent to set_bind removes the Background
from the stack and unbinds it from the browser's view. More detail on the
bind stack is described in 4.6.10,
Bindable children nodes.
The backdrop is conceptually a partial sphere (the ground) enclosed
inside of a full sphere (the sky) in the local coordinate system with the
viewer placed at the centre of the spheres. Both spheres have infinite
radius and each is painted with concentric circles of interpolated colour
perpendicular to the local Y-axis of the sphere. The Background node is
subject to the accumulated rotations of its ancestors' transformations.
Scaling and translation transformations are ignored. The sky sphere is
always slightly farther away from the viewer than the ground partial sphere
causing the ground to appear in front of the sky where they overlap.
The skyColor field specifies the colour of the sky at various
angles on the sky sphere. The first value of the skyColor field
specifies the colour of the sky at 0.0 radians representing the zenith
(i.e., straight up from the viewer). The skyAngle field specifies
the angles from the zenith in which concentric circles of colour appear.
The zenith of the sphere is implicitly defined to be 0.0 radians, the natural
horizon is at /2
radians, and the nadir (i.e., straight down from the viewer) is at
radians. skyAngle is restricted to non-decreasing values in the
range [0.0, ].
There shall be one more skyColor value than there are skyAngle
values. The first colour value is the colour at the zenith, which is not
specified in the skyAngle field. If the last skyAngle is
less than pi, then the colour band between the last skyAngle
and the nadir is clamped to the last skyColor. The sky colour is
linearly interpolated between the specified skyColor
values.
The groundColor field specifies the colour of the ground at the
various angles on the ground partial sphere. The first value of the groundColor
field specifies the colour of the ground at 0.0 radians representing the
nadir (i.e., straight down from the user). The groundAngle field
specifies the angles from the nadir that the concentric circles of colour
appear. The nadir of the sphere is implicitly defined at 0.0 radians. groundAngle
is restricted to non-decreasing values in the range [0.0, /2].
There shall be one more groundColor value than there are groundAngle
values. The first colour value is for the nadir which is not specified
in the groundAngle field. If the last groundAngle is less
than /2,
the region between the last groundAngle and the equator is non-existant.
The ground colour is linearly interpolated between the specified groundColor
values.
The backUrl, bottomUrl, frontUrl, leftUrl,
rightUrl,
and topUrl fields specify a set of images that define a background
panorama between the ground/sky backdrop and the scene's geometry. The
panorama consists of six images, each of which is mapped onto a face of
an infinitely large cube contained within the backdrop spheres and centred
in the local coordinate system. The images are applied individually to
each
face of the cube. On the front, back, right, and left faces of the
cube, when viewed from the origin looking down the negative Z-axis with
the Y-axis as the view up direction, each image is mapped onto the corresponding
face with the same orientation as if the image were displayed normally
in 2D (backUrl to back face, frontUrl to front face, leftUrl
to left face, and rightUrl to right face). On the top face
of the cube, when viewed from the origin looking along the +Y-axis with
the +Z-axis as the view up direction, the topUrl image is mapped
onto the face with the same orientation as if the image were displayed
normally in 2D. On the bottom face of the box, when viewed from the origin
along the negative Y-axis with the negative Z-axis as the view up direction,
the
bottomUrl image is mapped onto the face with the same orientation
as if the image were displayed normally in 2D.
Figure 6.1 illustrates the Background node
backdrop and background textures.
Alpha values in the panorama images (i.e., two or four component images)
specify that the panorama is semi-transparent or transparent in regions,
allowing the groundColor and skyColor to be visible.
See 4.6.11,
Texture maps, for a general description of texture maps.
Often, the bottomUrl and topUrl images will not be specified,
to allow sky and ground to show. The other four images may depict surrounding
mountains or other distant scenery. Browsers shall support the JPEG (see
2.[JPEG])
and PNG (see 2.[PNG])
image file formats, and in addition, may support any other image format
(e.g., CGM) that can be rendered into a 2D image. Support for the GIF (see
E.[GIF])
format is recommended (including transparency) . More detail on the url
fields can be found in 4.5,
VRML and the World Wide Web.
Figure 6.1 -- Background node
Panorama images may be one component (greyscale), two component (greyscale
plus alpha), three component (full RGB colour), or four-component (full
RGB colour plus alpha).
Ground colours, sky colours, and panoramic images do not translate with
respect to the viewer, though they do rotate with respect to the viewer.
That is, the viewer can never get any closer to the background, but can
turn to examine all sides of the panorama cube, and can look up and down
to see the concentric rings of ground and sky (if visible).
Background nodes are not affected by Fog nodes. Therefore,
if a Background node is active (i.e., bound) while a Fog node is active,
then the Background node will be displayed with no fogging effects. It
is the author's responsibility to set the Background values to match the
Fog values (e.g., ground colours fade to fog colour with distance and panorama
images tinted with fog colour). Background nodes are not affected by light
sources.
6.6
Billboard
Billboard {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField SFVec3f axisOfRotation 0 1 0 # (- , )
exposedField MFNode children []
field SFVec3f bboxCenter 0 0 0 # (- , )
field SFVec3f bboxSize -1 -1 -1 # (0, ) or -1,-1,-1
}
The Billboard node is a grouping node which modifies its coordinate system
so that the Billboard node's local Z-axis turns to point at the viewer.
The Billboard node has children which may be other children nodes.
The axisOfRotation field specifies which axis to use to perform
the rotation. This axis is defined in the local coordinate system.
When the axisOfRotation field is not (0, 0, 0), the following
steps describe how to rotate the billboard to face the viewer:
-
Compute the vector from the Billboard node's origin to the viewer's position.
This vector is called the billboard-to-viewer vector.
-
Compute the plane defined by the axisOfRotation and the billboard-to-viewer
vector.
-
Rotate the local Z-axis of the billboard into the plane from b., pivoting
around the axisOfRotation.
When the axisOfRotation field is set to (0, 0, 0), the special case
of viewer-alignment is indicated. In this case, the object rotates
to keep the billboard's local Y-axis parallel with the Y-axis of the viewer.
This special case is distinguished by setting the axisOfRotation
to (0, 0, 0). The following steps describe how to align the billboard's
Y-axis to the Y-axis of the viewer:
-
Compute the billboard-to-viewer vector.
-
Rotate the Z-axis of the billboard to be collinear with the billboard-to-viewer
vector and pointing towards the viewer's position.
-
Rotate the Y-axis of the billboard to be parallel and oriented in the same
direction as the Y-axis of the viewer.
If the axisOfRotation and the billboard-to-viewer line are coincident,
the plane cannot be established and the resulting rotation of the billboard
is undefined. For example, if the axisOfRotation is set to (0,1,0)
(Y-axis) and the viewer flies over the billboard and peers directly down
the Y-axis, the results are undefined.
Multiple instances of Billboard nodes (DEF/USE) operate as expected:
each instance rotates in its unique coordinate system to face the viewer.
Subclause 4.6.5,
Grouping and children nodes, provides a description of the children,
addChildren, and removeChildren fields and eventIns.
The bboxCenter and bboxSize fields specify a bounding
box that encloses the Billboard node's children. This is a hint that may
be used for optimization purposes. The results are undefined if the specified
bounding box is smaller than the actual bounding box of the children at
any time. A default bboxSize value, (-1, -1, -1), implies that the
bounding box is not specified and if needed shall be calculated by the
browser. A description of the bboxCenter and bboxSize fields
is contained in 4.6.4,
Bounding boxes.
6.7
Box
Box {
field SFVec3f size 2 2 2 # (0, )
}
The Box node specifies a rectangular parallelepiped box centred at (0,
0, 0) in the local coordinate system and aligned with the local coordinate
axes. By default, the box measures 2 units in each dimension, from -1 to
+1. The
size field specifies the extents of the box along the X-,
Y-, and Z-axes respectively and each component value shall be greater than
zero.
Figure 6.2 illustrates the Box node.

Figure 6.2 -- Box node
Textures are applied individually to each face of the box. On the front
(+Z), back (-Z), right (+X), and left (-X) faces of the box, when viewed
from the outside with the +Y-axis up, the texture is mapped onto each face
with the same orientation as if the image were displayed normally in 2D.
On the top face of the box (+Y), when viewed from above and looking down
the Y-axis toward the origin with the -Z-axis as the view up direction,
the texture is mapped onto the face with the same orientation as if the
image were displayed normally in 2D. On the bottom face of the box (-Y),
when viewed from below looking up the Y-axis toward the origin with the
+Z-axis as the view up direction, the texture is mapped onto the face with
the same orientation as if the image were displayed normally in 2D. TextureTransform
affects the texture coordinates of the Box.
The Box node's geometry requires outside faces only. When viewed from
the inside the results are undefined.
6.8
Collision
Collision {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children []
exposedField SFBool collide TRUE
field SFVec3f bboxCenter 0 0 0 # (- , )
field SFVec3f bboxSize -1 -1 -1 # (0, ) or -1,-1,-1
field SFNode proxy NULL
eventOut SFTime collideTime
}
The Collision node is a grouping node that specifies the collision detection
properties for its children (and their descendants), specifies surrogate
objects that replace its children during collision detection, and sends
events signalling that a collision has occurred between the avatar and
the Collision node's geometry or surrogate. By default, all geometric nodes
in the scene are collidable with the viewer except IndexedLineSet, PointSet,
and Text. Browsers shall detect geometric collisions between the avatar
(see 6.29, NavigationInfo) and the scene's
geometry and prevent the avatar from 'entering' the geometry. See 4.13.4,
Collision detection and terrain following, for general information
on collision detection.
If there are no Collision nodes specified in a VRML file, browsers shall
detect collisions between the avatar and all objects during navigation.
Subclause 4.6.5,
Grouping and children nodes, contains a description of the children,
addChildren, and removeChildren fields and eventIns.
The Collision node's collide field enables and disables collision
detection. If collide is set to FALSE, the children and all descendants
of the Collision node shall not be checked for collision, even though they
are drawn. This includes any descendent Collision nodes that have collide
set to TRUE (i.e., setting collide to FALSE turns collision off
for every node below it).
Collision nodes with the collide field set to TRUE detect the
nearest collision with their descendent geometry (or proxies). When the
nearest collision is detected, the collided Collision node sends the time
of the collision through its collideTime eventOut. If a Collision
node contains a child, descendant, or proxy (see below) that is a Collision
node, and both Collision nodes detect that a collision has occurred, both
send a collideTime event at the same time. A collideTime
event shall be generated if the avatar is colliding with collidable geometry
when the Collision node is read from a VRML file or inserted into the transformation
hierarchy.
The bboxCenter and bboxSize fields specify a bounding
box that encloses the Collision node's children. This is a hint that may
be used for optimization purposes. The results are undefined if the specified
bounding box is smaller than the actual bounding box of the children at
any time. A default bboxSize value, (-1, -1, -1), implies that the
bounding box is not specified and if needed shall be calculated by the
browser. More details on the bboxCenter and bboxSize fields
can be found in 4.6.4,
Bounding boxes.
The collision proxy, defined in the proxy field, is any legal
children node as described in 4.6.5,
Grouping and children nodes, that is used as a substitute for the Collision
node's children during collision detection. The proxy is used strictly
for collision detection; it is not drawn.
If the value of the collide field is TRUE and the proxy
field is non-NULL, the proxy field defines the scene on which collision
detection is performed. If the proxy value is NULL, collision detection
is performed against the children of the Collision node.
If proxy is specified, any descendent children of the Collision
node are ignored during collision detection. If children is empty,
collide
is TRUE, and proxy is specified, collision detection is performed
against the proxy but nothing is displayed. In this manner, invisible collision
objects may be supported.
The collideTime eventOut generates an event specifying the time
when the avatar (see 6.29, NavigationInfo)
makes contact with the collidable children or proxy of the Collision node.
An ideal implementation computes the exact time of collision. Implementations
may approximate the ideal by sampling the positions of collidable objects
and the user. The NavigationInfo node contains
additional information for parameters that control the avatar size.
6.9
Color
Color {
exposedField MFColor color [] # [0,1]
}
This node defines a set of RGB colours to be used in the fields of another
node.
Color nodes are only used to specify multiple colours for a single geometric
shape, such as colours for the faces or vertices of an IndexedFaceSet.
A Material node is used to specify the overall material parameters of lit
geometry. If both a Material node and a Color node are specified for a
geometric shape, the colours shall replace the diffuse component of the
material.
RGB or RGBA textures take precedence over colours; specifying both an
RGB or RGBA texture and a Color node for geometric shape will result in
the Color node being ignored. Details on lighting equations can be found
in 4.14,
Lighting model.
6.10 ColorInterpolator
ColorInterpolator {
eventIn SFFloat set_fraction # (- , )
exposedField MFFloat key [] # (- , )
exposedField MFColor keyValue [] # [0,1]
eventOut SFColor value_changed
}
This node interpolates among a list of MFColor key values to produce an
SFColor (RGB) value_changed event. The number of colours in the
keyValue
field shall be equal to the number of keyframes in the key field.
The keyValue field and value_changed events are defined in
RGB colour space. A linear interpolation using the value of set_fraction
as input is performed in HSV space (see E.[FOLE]
for description of RGB and HSV colour spaces). The results are undefined
when interpolating between two consecutive keys with complementary hues.
4.6.8,
Interpolator nodes, contains a detailed discussion of interpolators.
6.11
Cone
Cone {
field SFFloat bottomRadius 1 # (0, )
field SFFloat height 2 # (0, )
field SFBool side TRUE
field SFBool bottom TRUE
}
The Cone node specifies a cone which is centred in the local coordinate
system and whose central axis is aligned with the local Y-axis. The bottomRadius
field specifies the radius of the cone's base, and the height field
specifies the height of the cone from the centre of the base to the apex.
By default, the cone has a radius of 1.0 at the bottom and a height of
2.0, with its apex at y = height/2 and its bottom at y = -height/2.
Both bottomRadius and height shall be greater than zero.
Figure 6.3 illustrates the Cone node.

Figure 6.3 -- Cone node
The side field specifies whether sides of the cone are created and
the bottom field specifies whether the bottom cap of the cone is
created. A value of TRUE specifies that this part of the cone exists, while
a value of FALSE specifies that this part does not exist (not rendered
or eligible for collision or sensor intersection tests).
When a texture is applied to the sides of the cone, the texture wraps
counterclockwise (from above) starting at the back of the cone. The texture
has a vertical seam at the back in the X=0 plane, from the apex (0, height/2,
0) to the point (0, -height/2, -bottomRadius). For the bottom
cap, a circle is cut out of the texture square centred at (0, -height/2,
0) with dimensions (2 × bottomRadius) by (2 × bottomRadius).
The bottom cap texture appears right side up when the top of the cone is
rotated towards the -Z-axis. TextureTransform
affects the texture coordinates of the Cone.
The Cone geometry requires outside faces only. When viewed from the
inside the results are undefined.
6.12
Coordinate
Coordinate {
exposedField MFVec3f point [] # (- , )
}
This node defines a set of 3D coordinates to be used in the coord
field of vertex-based geometry nodes including IndexedFaceSet, IndexedLineSet,
and PointSet.
6.13
CoordinateInterpolator
CoordinateInterpolator {
eventIn SFFloat set_fraction # (- , )
exposedField MFFloat key [] # (- , )
exposedField MFVec3f keyValue [] # (- , )
eventOut MFVec3f value_changed
}
This node linearly interpolates among a list of MFVec3f values. The number
of coordinates in the keyValue field shall be an integer multiple
of the number of keyframes in the key field. That integer multiple
defines how many coordinates will be contained in the value_changed
events.
4.6.8,
Interpolator nodes, contains a more detailed discussion of interpolators.
6.14
Cylinder
Cylinder {
field SFBool bottom TRUE
field SFFloat height 2 # (0, )
field SFFloat radius 1 # (0, )
field SFBool side TRUE
field SFBool top TRUE
}
The Cylinder node specifies a capped cylinder centred at (0,0,0) in the
local coordinate system and with a central axis oriented along the local
Y-axis. By default, the cylinder is sized at "-1" to "+1" in all three
dimensions. The radius field specifies the radius of the cylinder
and the height field specifies the height of the cylinder along
the central axis. Both radius and height shall be greater
than zero. Figure 6.4 illustrates the Cylinder
node.
The cylinder has three parts: the side, the top
(Y = +height/2) and the bottom (Y = -height/2). Each part has an
associated SFBool field that indicates whether the part exists (TRUE) or
does not exist (FALSE). Parts which do not exist are not rendered and not
eligible for intersection tests (e.g., collision detection or sensor activation).

Figure 6.4 -- Cylinder node
When a texture is applied to a cylinder, it is applied differently to the
sides, top, and bottom. On the sides, the texture wraps counterclockwise
(from above) starting at the back of the cylinder. The texture has a vertical
seam at the back, intersecting the X=0 plane. For the top and bottom caps,
a circle is cut out of the unit texture squares centred at (0, +/- height/2,
0) with dimensions 2 × radius by 2 × radius.
The top texture appears right side up when the top of the cylinder is tilted
toward the +Z-axis, and the bottom texture appears right side up when the
top of the cylinder is tilted toward the -Z-axis. TextureTransform
affects the texture coordinates of the Cylinder node.
The Cylinder node's geometry requires outside faces only. When viewed
from the inside the results are undefined.
6.15
CylinderSensor
CylinderSensor {
exposedField SFBool autoOffset TRUE
exposedField SFFloat diskAngle 0.262 # (0, /2)
exposedField SFBool enabled TRUE
exposedField SFFloat maxAngle -1 # [-2 ,2 ]
exposedField SFFloat minAngle 0 # [-2 ,2 ]
exposedField SFFloat offset 0 # (- , )
eventOut SFBool isActive
eventOut SFRotation rotation_changed
eventOut SFVec3f trackPoint_changed
}
The CylinderSensor node maps pointer motion (e.g., a mouse or wand) into
a rotation on an invisible cylinder that is aligned with the Y-axis of
the local coordinate system. The CylinderSensor uses the descendent geometry
of its parent node to determine whether it is liable to generate events.
The enabled exposed field enables and disables the CylinderSensor
node. If TRUE, the sensor reacts appropriately to user events. If FALSE,
the sensor does not track user input or send events. If enabled
receives a FALSE event and isActive is TRUE, the sensor becomes
disabled and deactivated, and outputs an isActive FALSE event. If
enabled receives a TRUE event the sensor is enabled and ready for
user activation.
A CylinderSensor node generates events when the pointing device is activated
while the pointer is indicating any descendent geometry nodes of the sensor's
parent group. See 4.6.7.5,
Activating and manipulating sensors, for more details on using the
pointing device to activate the CylinderSensor.
Upon activation of the pointing device while indicating the sensor's
geometry, an isActive TRUE event is sent. The initial acute angle
between the bearing vector and the local Y-axis of the CylinderSensor node
determines whether the sides of the invisible cylinder or the caps (disks)
are used for manipulation. If the initial angle is less than the diskAngle,
the geometry is treated as an infinitely large disk lying in the local
Y=0 plane and coincident with the initial intersection point. Dragging
motion is mapped into a rotation around the local +Y-axis vector of the
sensor's coordinate system. The perpendicular vector from the initial intersection
point to the Y-axis defines zero rotation about the Y-axis. For each subsequent
position of the bearing, a rotation_changed event is sent that equals
the sum of the rotation about the +Y-axis vector (from the initial intersection
to the new intersection) plus the offset value. trackPoint_changed
events reflect the unclamped drag position on the surface of this disk.
When the pointing device is deactivated and autoOffset is TRUE,
offset is set to the last value of rotation_changed and an
offset_changed event is generated. See 4.6.7.4,
Drag sensors, for a more general description of autoOffset and
offset fields.
If the initial acute angle between the bearing vector and the local
Y-axis of the CylinderSensor node is greater than or equal to diskAngle,
then the sensor behaves like a cylinder. The shortest distance between
the point of intersection (between the bearing and the sensor's geometry)
and the Y-axis of the parent group's local coordinate system determines
the radius of an invisible cylinder used to map pointing device motion
and marks the zero rotation value. For each subsequent position of the
bearing, a
rotation_changed event is sent that equals the sum of
the right-handed rotation from the original intersection about the +Y-axis
vector plus the
offset value. trackPoint_changed events reflect
the unclamped drag position on the surface of the invisible cylinder. When
the pointing device is deactivated and autoOffset is TRUE, offset
is set to the last rotation angle and an offset_changed event is
generated. More details are available in 4.6.7.4,
Drag sensors.
When the sensor generates an isActive TRUE event, it grabs all
further motion events from the pointing device until it is released and
generates an isActive FALSE event (other pointing-device sensors
shall not generate events during this time). Motion of the pointing device
while isActive is TRUE is referred to as a "drag." If a 2D pointing
device is in use, isActive events will typically reflect the state
of the primary button associated with the device (i.e., isActive
is TRUE when the primary button is pressed and FALSE when it is released).
If a 3D pointing device (e.g., a wand) is in use, isActive events
will typically reflect whether the pointer is within or in contact with
the sensor's geometry.
While the pointing device is activated, trackPoint_changed and
rotation_changed
events are output and are interpreted from pointing device motion based
on the sensor's local coordinate system at the time of activation. trackPoint_changed
events represent the unclamped intersection points on the surface of the
invisible cylinder or disk. If the initial angle results in cylinder rotation
(as opposed to disk behaviour) and if the pointing device is dragged off
the cylinder while activated, browsers may interpret this in a variety
of ways (e.g., clamp all values to the cylinder and continuing to rotate
as the point is dragged away from the cylinder). Each movement of the pointing
device while isActive is TRUE generates trackPoint_changed
and rotation_changed events.
The minAngle and maxAngle fields clamp rotation_changed
events to a range of values. If minAngle is greater than maxAngle,
rotation_changed
events are not clamped. The minAngle and
maxAngle fields
are restricted to the range [-2 ,
2 ].
More information about this behaviour is described in 4.6.7.3,
Pointing-device sensors, 4.6.7.4,
Drag sensors, and 4.6.7.5,
Activating and manipulating sensors.
6.16
DirectionalLight
DirectionalLight {
exposedField SFFloat ambientIntensity 0 # [0,1]
exposedField SFColor color 1 1 1 # [0,1]
exposedField SFVec3f direction 0 0 -1 # (- , )
exposedField SFFloat intensity 1 # [0,1]
exposedField SFBool on TRUE
}
The DirectionalLight node defines a directional light source that illuminates
along rays parallel to a given 3-dimensional vector. A description of the
ambientIntensity,
color, intensity, and on fields is in 4.6.6,
Light sources.
The direction field specifies the direction vector of the illumination
emanating from the light source in the local coordinate system. Light is
emitted along parallel rays from an infinite distance away. A directional
light source illuminates only the objects in its enclosing parent group.
The light may illuminate everything within this coordinate system, including
all children and descendants of its parent group. The accumulated transformations
of the parent nodes affect the light.
DirectionalLight nodes do not attenuate with distance. A precise description
of VRML's lighting equations is contained in 4.14,
Lighting model.
6.17
ElevationGrid
ElevationGrid {
eventIn MFFloat set_height
exposedField SFNode color NULL
exposedField SFNode normal NULL
exposedField SFNode texCoord NULL
field MFFloat height [] # (- , )
field SFBool ccw TRUE
field SFBool colorPerVertex TRUE
field SFFloat creaseAngle 0 # [0, ]
field SFBool normalPerVertex TRUE
field SFBool solid TRUE
field SFInt32 xDimension 0 # [0, )
field SFFloat xSpacing 1.0 # (0, )
field SFInt32 zDimension 0 # [0, )
field SFFloat zSpacing 1.0 # (0, )
}
The ElevationGrid node specifies a uniform rectangular grid of varying
height in the Y=0 plane of the local coordinate system. The geometry is
described by a scalar array of height values that specify the height of
a surface above each point of the grid.
The xDimension and zDimension fields indicate the number
of elements of the grid height array in the X and Z directions.
Both
xDimension and zDimension shall be greater than or equal
to zero. If either the xDimension or the zDimension is less
than two, the ElevationGrid contains no quadrilaterals. The vertex locations
for the rectangles are defined by the height field and the xSpacing
and zSpacing fields:
-
The height field is an xDimension by zDimension array
of scalar values representing the height above the grid for each vertex.
-
The xSpacing and zSpacing fields indicate the distance between
vertices in the X and Z directions respectively, and shall be greater than
zero.
Thus, the vertex corresponding to the point P[i, j] on the grid is placed
at:
P[i,j].x = xSpacing × i
P[i,j].y = height[ i + j × xDimension]
P[i,j].z = zSpacing × j
where 0 <= i < xDimension and 0 <= j < zDimension,
and P[0,0] is height[0] units above/below the origin of the local
coordinate system
The set_height eventIn allows the height MFFloat field to be changed
to support animated ElevationGrid nodes.
The color field specifies per-vertex or per-quadrilateral colours
for the ElevationGrid node depending on the value of colorPerVertex.
If the color field is NULL, the ElevationGrid node is rendered with
the overall attributes of the Shape node enclosing the ElevationGrid node
(see 4.14,
Lighting model).
The colorPerVertex field determines whether colours specified
in the color field are applied to each vertex or each quadrilateral
of the ElevationGrid node. If colorPerVertex is FALSE and the color
field is not NULL, the color field shall specify a Color node containing
at least (xDimension-1)×(zDimension-1) colours; one
for each quadrilateral, ordered as follows:
QuadColor[i,j] = Color[ i + j × (xDimension-1)]
where 0 <= i < xDimension-1 and 0 <= j < zDimension-1,
and QuadColor[i,j] is the colour for the quadrilateral defined
by height[i+j×xDimension], height[(i+1)+j×xDimension],
height[(i+1)+(j+1)×xDimension] and height[i+(j+1)×xDimension]
If colorPerVertex is TRUE and the color field is not NULL,
the color field shall specify a Color node containing at least xDimension
× zDimension colours, one for each vertex, ordered as
follows:
VertexColor[i,j] = Color[ i + j × xDimension]
where 0 <= i < xDimension and 0 <= j < zDimension,
and VertexColor[i,j] is the colour for the vertex defined by
height[i+j×xDimension]
The normal field specifies per-vertex or per-quadrilateral normals
for the ElevationGrid node. If the normal field is NULL, the browser
shall automatically generate normals, using the creaseAngle field
to determine if and how normals are smoothed across the surface (see 4.6.3.5,
Crease angle field).
The normalPerVertex field determines whether normals are applied
to each vertex or each quadrilateral of the ElevationGrid node depending
on the value of normalPerVertex. If normalPerVertex is FALSE
and the normal node is not NULL, the normal field shall specify
a Normal node containing at least (xDimension-1)×(zDimension-1)
normals;
one for each quadrilateral, ordered as follows:
QuadNormal[i,j] = Normal[ i + j × (xDimension-1)]
where 0 <= i < xDimension-1 and 0 <= j < zDimension-1,
and QuadNormal[i,j] is the normal for the quadrilateral defined
by height[i+j×xDimension], height[(i+1)+j×xDimension],
height[(i+1)+(j+1)×xDimension] and height[i+(j+1)×xDimension]
If normalPerVertex is TRUE and the normal field is not NULL,
the normal field shall specify a Normal node containing at least
xDimension × zDimension normals; one for each vertex,
ordered as follows:
VertexNormal[i,j] = Normal[ i + j × xDimension]
where 0 <= i < xDimension and 0 <= j < zDimension,
and VertexNormal[i,j] is the normal for the vertex defined
by height[i+j×xDimension]
The texCoord field specifies per-vertex texture coordinates for
the ElevationGrid node. If texCoord is NULL, default texture coordinates
are applied to the geometry. The default texture coordinates range from
(0,0) at the first vertex to (1,1) at the last vertex. The S texture coordinate
is aligned with the positive X-axis, and the T texture coordinate with
positive Z-axis. If texCoord is not NULL, it shall specify a TextureCoordinate
node containing at least (xDimension)×(zDimension)
texture coordinates; one for each vertex, ordered as follows:
VertexTexCoord[i,j] = TextureCoordinate[ i + j × xDimension]
where 0 <= i < xDimension and 0 <= j < zDimension,
and VertexTexCoord[i,j] is the texture coordinate for the vertex
defined by height[i+j×xDimension]
The ccw, solid, and creaseAngle fields are described
in 4.6.3,
Shapes and geometry.
By default, the quadrilaterals are defined with a counterclockwise ordering.
Hence, the Y-component of the normal is positive. Setting the ccw
field to FALSE reverses the normal direction. Backface culling is enabled
when the solid field is TRUE.
See Figure 6.5 for a depiction of the ElevationGrid
node.

Figure 6.5 -- ElevationGrid node
6.18
Extrusion
Extrusion {
eventIn MFVec2f set_crossSection
eventIn MFRotation set_orientation
eventIn MFVec2f set_scale
eventIn MFVec3f set_spine
field SFBool beginCap TRUE
field SFBool ccw TRUE
field SFBool convex TRUE
field SFFloat creaseAngle 0 # [0, )
field MFVec2f crossSection [ 1 1, 1 -1, -1 -1,
-1 1, 1 1 ] # (- , )
field SFBool endCap TRUE
field MFRotation orientation 0 0 1 0 # [-1,1],(- , )
field MFVec2f scale 1 1 # (0, )
field SFBool solid TRUE
field MFVec3f spine [ 0 0 0, 0 1 0 ] # (- , )
}
6.18.1 Introduction
The Extrusion node specifies geometric shapes based on a two dimensional
cross-section extruded along a three dimensional spine in the local coordinate
system. The cross-section can be scaled and rotated at each spine point
to produce a wide variety of shapes.
An Extrusion node is defined by:
-
a 2D crossSection piecewise linear curve (described as a series
of connected vertices);
-
a 3D spine piecewise linear curve (also described as a series of
connected vertices);
-
a list of 2D scale parameters;
-
a list of 3D orientation parameters.
6.18.2 Algorithmic description
Shapes are constructed as follows. The cross-section curve, which starts
as a curve in the Y=0 plane, is first scaled about the origin by the first
scale
parameter (first value scales in X, second value scales in Z). It is then
translated by the first spine point and oriented using the first orientation
parameter (as explained later). The same procedure is followed to place
a cross-section at the second spine point, using the second scale and orientation
values. Corresponding vertices of the first and second cross-sections are
then connected, forming a quadrilateral polygon between each pair of vertices.
This same procedure is then repeated for the rest of the spine points,
resulting in a surface extrusion along the spine.
The final orientation of each cross-section is computed by first orienting
it relative to the spine segments on either side of point at which the
cross-section is placed. This is known as the spine-aligned cross-section
plane (SCP), and is designed to provide a smooth transition from one
spine segment to the next (see Figure 6.6). The
SCP is then rotated by the corresponding orientation value. This
rotation is performed relative to the SCP. For example, to impart twist
in the cross-section, a rotation about the Y-axis (0 1 0) would be used.
Other orientations are valid and rotate the cross-section out of the SCP.

Figure 6.6 -- Spine-aligned cross-section plane at a spine point.
The SCP is computed by first computing its Y-axis and Z-axis, then taking
the cross product of these to determine the X-axis. These three axes are
then used to determine the rotation value needed to rotate the Y=0 plane
to the SCP. This results in a plane that is the approximate tangent of
the spine at each point, as shown in Figure 6.6.
First the Y-axis is determined, as follows:
Let n be the number of spines and let i be the index variable
satisfying 0 <= i < n:
-
For all points other than the first or last: The Y-axis for spine[i]
is found by normalizing the vector defined by (spine[i+1] - spine[i-1]).
-
If the spine curve is closed: The SCP for the first and last points
is the same and is found using (spine[1] - spine[n-2]) to
compute the Y-axis.
-
If the spine curve is not closed: The Y-axis used for the first
point is the vector from spine[0] to spine[1], and for the
last it is the vector from spine[n-2] to spine[n-1].
The Z-axis is determined as follows:
-
For all points other than the first or last: Take the following
cross-product:
Z = (spine[i+1] - spine[i]) × (spine[i-1] - spine[i])
-
If the spine curve is closed: The SCP for the first and last points
is the same and is found by taking the following cross-product:
Z = (spine[1] - spine[0]) × (spine[n-2] - spine[0])
-
If the spine curve is not closed: The Z-axis used for the first
spine point is the same as the Z-axis for spine[1]. The Z-axis used for
the last spine point is the same as the Z-axis for spine[n-2].
-
After determining the Z-axis, its dot product with the Z-axis of the previous
spine point is computed. If this value is negative, the Z-axis is flipped
(multiplied by -1). In most cases, this prevents small changes in the spine
segment angles from flipping the cross-section 180 degrees.
Once the Y- and Z-axes have been computed, the X-axis can be calculated
as their cross-product.
6.18.3 Special cases
If the number of scale or orientation values is greater than
the number of spine points, the excess values are ignored. If they contain
one value, it is applied at all spine points. The results are undefined
if the number of scale or orientation values is greater than one but less
than the number of spine points. The scale values shall be positive.
If the three points used in computing the Z-axis are collinear, the
cross-product is zero so the value from the previous point is used instead.
If the Z-axis of the first point is undefined (because the spine is
not closed and the first two spine segments are collinear) then the Z-axis
for the first spine point with a defined Z-axis is used.
If the entire spine is collinear, the SCP is computed by finding the
rotation of a vector along the positive Y-axis (v1) to the vector
formed by the spine points (v2). The Y=0 plane is then rotated
by this value.
If two points are coincident, they both have the same SCP. If each point
has a different orientation value, then the surface is constructed by connecting
edges of the cross-sections as normal. This is useful in creating revolved
surfaces.
Note: combining coincident and non-coincident spine segments, as
well as other combinations, can lead to interpenetrating surfaces which
the extrusion algorithm makes no attempt to avoid.
6.18.4 Common cases
The following common cases are among the effects which are supported by
the Extrusion node:
-
Surfaces of revolution:
-
If the cross-section is an approximation of a circle and the spine is straight,
the Extrusion is equivalent to a surface of revolution, where the scale
parameters define the size of the cross-section along the spine.
-
Uniform extrusions:
-
If the scale is (1, 1) and the spine is straight, the cross-section
is extruded uniformly without twisting or scaling along the spine. The
result is a cylindrical shape with a uniform cross section.
-
Bend/twist/taper objects:
-
These shapes are the result of using all fields. The spine curve bends
the extruded shape defined by the cross-section, the orientation parameters
(given as rotations about the Y-axis) twist it around the spine, and the
scale parameters taper it (by scaling about the spine).
6.18.5 Other fields
Extrusion has three parts: the sides, the beginCap (the surface
at the initial end of the spine) and the endCap (the surface at
the final end of the spine). The caps have an associated SFBool field that
indicates whether each exists (TRUE) or doesn't exist (FALSE).
When the beginCap or endCap fields are specified as TRUE,
planar cap surfaces will be generated regardless of whether the crossSection
is a closed curve. If crossSection is not a closed curve, the caps
are generated by adding a final point to crossSection that is equal
to the initial point. An open surface can still have a cap, resulting (for
a simple case) in a shape analogous to a soda can sliced in half vertically.
These surfaces are generated even if spine is also a closed curve.
If a field value is FALSE, the corresponding cap is not generated.
Texture coordinates are automatically generated by Extrusion nodes.
Textures are mapped so that the coordinates range in the U direction from
0 to 1 along the crossSection curve (with 0 corresponding to the
first point in crossSection and 1 to the last) and in the V direction
from 0 to 1 along the spine curve (with 0 corresponding to the first
listed
spine point and 1 to the last). If either the endCap
or beginCap exists, the crossSection curve is uniformly scaled
and translated so that the larger dimension of the cross-section (X or
Z) produces texture coordinates that range from 0.0 to 1.0. The beginCap
and endCap textures' S and T directions correspond to the X and
Z directions in which the crossSection coordinates are defined.
The browser shall automatically generate normals for the Extrusion node,using
the creaseAngle field to determine if and how normals are smoothed
across the surface. Normals for the caps are generated along the Y-axis
of the SCP, with the ordering determined by viewing the cross-section from
above (looking along the negative Y-axis of the SCP). By default, a beginCap
with a counterclockwise ordering shall have a normal along the negative
Y-axis. An endCap with a counterclockwise ordering shall have a
normal along the positive Y-axis.
Each quadrilateral making up the sides of the extrusion are ordered
from the bottom cross-section (the one at the earlier spine point) to the
top. So, one quadrilateral has the points:
spine[0](crossSection[0], crossSection[1])
spine[1](crossSection[1], crossSection[0])
in that order. By default, normals for the sides are generated as described
in 4.6.3,
Shapes and geometry.
For instance, a circular crossSection with counter-clockwise ordering
and the default spine form a cylinder. With solid TRUE and ccw
TRUE, the cylinder is visible from the outside. Changing ccw to
FALSE makes it visible from the inside.
The ccw, solid, convex, and creaseAngle
fields are described in 4.6.3,
Shapes and geometry.
6.19
Fog
Fog {
exposedField SFColor color 1 1 1 # [0,1]
exposedField SFString fogType "LINEAR"
exposedField SFFloat visibilityRange 0 # [0, )
eventIn SFBool set_bind
eventOut SFBool isBound
}
The Fog node provides a way to simulate atmospheric effects by blending
objects with the colour specified by the color field based on the
distances of the various objects from the viewer. The distances are calculated
in the coordinate space of the Fog node. The visibilityRange specifies
the distance in metres (in the local coordinate system) at which objects
are totally obscured by the fog. Objects located outside the visibilityRange
from the viewer are drawn with a constant colour of color. Objects
very close to the viewer are blended very little with the fog color.
A visibilityRange of 0.0 disables the Fog node. The visibilityRange
is affected by the scaling transformations of the Fog node's parents; translations
and rotations have no affect on visibilityRange. Values of the visibilityRange
field shall be in the range [0, ).
Since Fog nodes are bindable children nodes (see 4.6.10,
Bindable children nodes), a Fog node stack exists, in which the top-most
Fog node on the stack is currently active. To push a Fog node onto the
top of the stack, a TRUE value is sent to the set_bind eventIn.
Once active, the Fog node is bound to the browser view. A FALSE value sent
to set_bind, pops the Fog node from the stack and unbinds it from
the browser viewer. More details on the Fog node stack can be found in
4.6.10,
Bindable children nodes.
The fogType field controls how much of the fog colour is blended
with the object as a function of distance. If fogType is "LINEAR",
the amount of blending is a linear function of the distance, resulting
in a depth cueing effect. If fogType is "EXPONENTIAL," an exponential
increase in blending is used, resulting in a more natural fog appearance.
The effect of fog on lighting calculations is described in 4.14,
Lighting model.
6.20
FontStyle
FontStyle {
field MFString family "SERIF"
field SFBool horizontal TRUE
field MFString justify "BEGIN"
field SFString language ""
field SFBool leftToRight TRUE
field SFFloat size 1.0 # (0, )
field SFFloat spacing 1.0 # [0, )
field SFString style "PLAIN"
field SFBool topToBottom TRUE
}
6.20.1 Introduction
The FontStyle node defines the size, family, and style used for Text nodes,
as well as the direction of the text strings and any language-specific
rendering techniques used for non-English text. See 6.47,
Text, for a description of the Text node.
The size field specifies the nominal height, in the local coordinate
system of the Text node, of glyphs rendered and determines the spacing
of adjacent lines of text. Values of the size field shall be greater
than zero.
The spacing field determines the line spacing between adjacent
lines of text. The distance between the baseline of each line of text is
(spacing × size) in the appropriate direction (depending
on other fields described below). The effects of the size and spacing
field are depicted in Figure 6.7 (spacing greater
than 1.0). Values of the spacing field shall be non-negative.

Figure 6.7 -- Text size and spacing fields
6.20.2 Font family and style
Font attributes are defined with the family and style fields.
The browser shall map the specified font attributes to an appropriate available
font as described below.
The family field contains a case-sensitive MFString value that
specifies a sequence of font family names in preference order. The browser
shall search the MFString value for the first font family name matching
a supported font family. If none of the string values matches a supported
font family, the default font family "SERIF" shall be used. All
browsers shall support at least "SERIF" (the default) for a serif
font such as Times Roman; "SANS" for a sans-serif font such as Helvetica;
and "TYPEWRITER" for a fixed-pitch font such as Courier. An empty
family value is identical to ["SERIF"].
The style field specifies a case-sensitive SFString value that
may be "PLAIN" (the default) for default plain type; "BOLD"
for boldface type; "ITALIC" for italic type; or "BOLDITALIC"
for bold and italic type. An empty style value ("") is identical
to "PLAIN".
6.20.3 Direction and justification
The horizontal, leftToRight, and topToBottom fields
indicate the direction of the text. The horizontal field indicates
whether the text advances horizontally in its major direction (horizontal
= TRUE, the default) or vertically in its major direction (horizontal
= FALSE). The leftToRight and topToBottom fields indicate
direction of text advance in the major (characters within a single string)
and minor (successive strings) axes of layout. Which field is used for
the major direction and which is used for the minor direction is determined
by the horizontal field.
For horizontal text (horizontal = TRUE), characters on each line
of text advance in the positive X direction if leftToRight is TRUE
or in the negative X direction if leftToRight is FALSE. Characters
are advanced according to their natural advance width. Each line of characters
is advanced in the negative Y direction if topToBottom is TRUE or
in the positive Y direction if topToBottom is FALSE. Lines are advanced
by the amount of size × spacing.
For vertical text (horizontal = FALSE), characters on each line
of text advance in the negative Y direction if topToBottom is TRUE
or in the positive Y direction if topToBottom is FALSE. Characters
are advanced according to their natural advance height. Each line of characters
is advanced in the positive X direction if leftToRight is TRUE or
in the negative X direction if leftToRight is FALSE. Lines are advanced
by the amount of size × spacing.
The justify field determines alignment of the above text layout
relative to the origin of the object coordinate system. The justify
field is an MFString which can contain 2 values. The first value specifies
alignment along the major axis and the second value specifies alignment
along the minor axis, as determined by the horizontal field. An
empty
justify value ("") is equivalent to the default value.
If the second string, minor alignment, is not specified, minor alignment
defaults to the value "FIRST". Thus, justify values of "",
"BEGIN", and ["BEGIN" "FIRST"] are equivalent.
The major alignment is along the X-axis when horizontal is TRUE
and along the Y-axis when horizontal is FALSE. The minor alignment
is along the Y-axis when horizontal is TRUE and along the X-axis
when horizontal is FALSE. The possible values for each enumerant
of the justify field are "FIRST", "BEGIN",
"MIDDLE",
and "END". For major alignment, each line of text is positioned
individually according to the major alignment enumerant. For minor alignment,
the block of text representing all lines together is positioned according
to the minor alignment enumerant. Tables 6.2-6.5
describe the behaviour in terms of which portion of the text is at the
origin
Table 6.2 -- Major Alignment, horizontal
= TRUE
| justify Enumerant |
leftToRight = TRUE |
leftToRight = FALSE |
| FIRST |
Left edge of each line |
Right edge of each line |
| BEGIN |
Left edge of each line |
Right edge of each line |
| MIDDLE |
Centred about X-axis |
Centred about X-axis |
| END |
Right edge of each line |
Left edge of each line |
Table 6.3 -- Major Alignment, horizontal = FALSE
| justify Enumerant |
topToBottom = TRUE |
topToBottom = FALSE |
| FIRST |
Top edge of each line |
Bottom edge of each line |
| BEGIN |
Top edge of each line |
Bottom edge of each line |
| MIDDLE |
Centred about Y-axis |
Centre about Y-axis |
| END |
Bottom edge of each line |
Top edge of each line |
Table 6.4 -- Minor Alignment, horizontal = TRUE
| justify Enumerant |
topToBottom = TRUE |
topToBottom = FALSE |
| FIRST |
Baseline of first line |
Baseline of first line |
| BEGIN |
Top edge of first line |
Bottom edge of first line |
| MIDDLE |
Centred about Y-axis |
Centred about Y-axis |
| END |
Bottom edge of last line |
Top edge of last line |
Table 6.5 -- Minor Alignment, horizontal = FALSE
| justify Enumerant |
leftToRight = TRUE |
leftToRight = FALSE |
| FIRST |
Left edge of first line |
Right edge of first line |
| BEGIN |
Left edge of first line |
Right edge of first line |
| MIDDLE |
Centred about X-axis |
Centred about X-axis |
| END |
Right edge of last line |
Left edge of last line |
The default minor alignment is "FIRST". This is a special case
of minor alignment when horizontal is TRUE. Text starts at the baseline
at the Y-axis. In all other cases, "FIRST" is identical to "BEGIN".
In Tables 6.6 and 6.7, each colour-coded cross-hair
indicates where the X-axis and Y-axis shall be in relation to the text.
Figure 6.8 describes the symbols used in Tables
6.6 and 6.7.

Figure 6.8 -- Key for Tables 6.6 and 6.7
Table 6.6 -- horizontal = TRUE

Table 6.7 -- horizontal = FALSE

6.20.4 Language
The language field specifies the context of the language for the
text string. Due to the multilingual nature of the ISO/IEC 10646-1:1993,
the language field is needed to provide a proper language attribute
of the text string. The format is based on RFC 1766: language[_territory]
2.[1766].
The value for the language tag is based on ISO 639:1988 (e.g., 'zh' for
Chinese, 'jp' for Japanese, and 'sc' for Swedish.) The territory tag is
based on ISO 3166:1993 country codes (e.g., 'TW' for Taiwan and 'CN' for
China for the 'zh' Chinese language tag). If the language field
is empty (""), local language bindings are used.
See 2,
Normative references, for more information on RFC 1766 (2.[1766]),
ISO/IEC 10646:1993 (2.[UTF8]),
ISO/IEC 639:1998 (2.[I639]),
and ISO 3166:1993 (2.[I3166]).
6.21
Group
Group {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children []
field SFVec3f bboxCenter 0 0 0 # (- , )
field SFVec3f bboxSize -1 -1 -1 # (0, ) or -1,-1,-1
}
A Group node contains children nodes without introducing a new transformation.
It is equivalent to a Transform node containing an identity transform.
More details on the children, addChildren, and removeChildren
fields and eventIns can be found in 4.6.5,
Grouping and children nodes.
The bboxCenter and bboxSize fields specify a bounding
box that encloses the Group node's children. This is a hint that may be
used for optimization purposes. The results are undefined if the specified
bounding box is smaller than the actual bounding box of the children at
any time. A default bboxSize value, (-1, -1, -1), implies that the
bounding box is not specified and, if needed, is calculated by the browser.
A description of the bboxCenter and bboxSize fields is contained
in 4.6.4,
Bounding boxes.
6.22
ImageTexture
ImageTexture {
exposedField MFString url []
field SFBool repeatS TRUE
field SFBool repeatT TRUE
}
The ImageTexture node defines a texture map by specifying an image file
and general parameters for mapping to geometry. Texture maps are defined
in a 2D coordinate system (s, t) that ranges from [0.0, 1.0] in both directions.
The bottom edge of the image corresponds to the S-axis of the texture map,
and left edge of the image corresponds to the T-axis of the texture map.
The lower-left pixel of the image corresponds to s=0, t=0, and the top-right
pixel of the image corresponds to s=1, t=1. These relationships are depicted
in Figure 6.9.

Figure 6.9 -- Texture map coordinate system
The texture is read from the URL specified by the url field. When
the url field contains no values ([]), texturing is disabled. Browsers
shall support the JPEG (see 2.
[JPEG]) and PNG (see 2.
[PNG]) image file formats. In addition, browsers may support other
image formats (e.g. CGM,
2.
[CGM]) which can be rendered into a 2D image. Support for the GIF format
(see E.
[GIF]) is also recommended (including transparency). Details on the
url field can be found in 4.5,
VRML and the World Wide Web.
See 4.6.11,
Texture maps, for a general description of texture maps.
See 4.14,
Lighting model, for a description of lighting equations and the interaction
between textures, materials, and geometry appearance.
The repeatS and repeatT fields specify how the texture
wraps in the S and T directions. If repeatS is TRUE (the default),
the texture map is repeated outside the [0.0, 1.0] texture coordinate range
in the S direction so that it fills the shape. If repeatS is FALSE,
the texture coordinates are clamped in the S direction to lie within the
[0.0, 1.0] range. The repeatT field is analogous to the
repeatS
field.
6.23
IndexedFaceSet
IndexedFaceSet {
eventIn MFInt32 set_colorIndex
eventIn MFInt32 set_coordIndex
eventIn MFInt32 set_normalIndex
eventIn MFInt32 set_texCoordIndex
exposedField SFNode color NULL
exposedField SFNode coord NULL
exposedField SFNode normal NULL
exposedField SFNode texCoord NULL
field SFBool ccw TRUE
field MFInt32 colorIndex [] # [-1, )
field SFBool colorPerVertex TRUE
field SFBool convex TRUE
field MFInt32 coordIndex [] # [-1, )
field SFFloat creaseAngle 0 # [0, )
field MFInt32 normalIndex [] # [-1, )
field SFBool normalPerVertex TRUE
field SFBool solid TRUE
field MFInt32 texCoordIndex [] # [-1, )
}
The IndexedFaceSet node represents a 3D shape formed by constructing faces
(polygons) from vertices listed in the coord field. The coord
field contains a Coordinate node that defines the 3D vertices referenced
by the coordIndex field. IndexedFaceSet uses the indices in its
coordIndex field to specify the polygonal faces by indexing into
the coordinates in the Coordinate node. An index of "-1" indicates that
the current face has ended and the next one begins. The last face may be
(but does not have to be) followed by a "-1" index. If the greatest index
in the coordIndex field is N, the Coordinate node shall contain
N+1 coordinates (indexed as 0 to N). Each face of the IndexedFaceSet shall
have:
-
at least three non-coincident vertices;
-
vertices that define a planar polygon;
-
vertices that define a non-self-intersecting polygon.
Otherwise, The results are undefined.
The IndexedFaceSet node is specified in the local coordinate system
and is affected by the transformations of its ancestors.
Descriptions of the coord, normal, and texCoord
fields are provided in the Coordinate, Normal,
and TextureCoordinate nodes, respectively.
Details on lighting equations and the interaction between color
field, normal field, textures, materials, and geometries are provided
in 4.14,
Lighting model.
If the color field is not NULL, it shall contain a Color node
whose colours are applied to the vertices or faces of the IndexedFaceSet
as follows:
-
If colorPerVertex is FALSE, colours are applied to each face, as
follows:
-
If the colorIndex field is not empty, then one colour is used for
each face of the IndexedFaceSet. There shall be at least as many indices
in the colorIndex field as there are faces in the IndexedFaceSet.
If the greatest index in the colorIndex field is N, then there shall
be N+1 colours in the Color node. The colorIndex field shall not
contain any negative entries.
-
If the colorIndex field is empty, then the colours in the Color
node are applied to each face of the IndexedFaceSet in order. There shall
be at least as many colours in the Color node as there are faces.
-
If colorPerVertex is TRUE, colours are applied to each vertex, as
follows:
-
If the colorIndex field is not empty, then colours are applied to
each vertex of the IndexedFaceSet in exactly the same manner that the coordIndex
field is used to choose coordinates for each vertex from the Coordinate
node. The colorIndex field shall contain at least as many indices
as the coordIndex field, and shall contain end-of-face markers (-1)
in exactly the same places as the coordIndex field. If the greatest
index in the colorIndex field is N, then there shall be N+1 colours
in the Color node.
-
If the colorIndex field is empty, then the coordIndex field
is used to choose colours from the Color node. If the greatest index in
the coordIndex field is N, then there shall be N+1 colours in the
Color node.
If the color field is NULL, the geometry shall be rendered normally
using the Material and texture defined in the Appearance node (see 4.14,
Lighting model, for details).
If the normal field is not NULL, it shall contain a Normal node
whose normals are applied to the vertices or faces of the IndexedFaceSet
in a manner exactly equivalent to that described above for applying colours
to vertices/faces (where normalPerVertex corresponds to colorPerVertex
and normalIndex corresponds to colorIndex). If the normal
field is NULL, the browser shall automatically generate normals, using
creaseAngle to determine if and how normals are smoothed across
shared vertices (see
4.6.3.5,
Crease angle field).
If the texCoord field is not NULL, it shall contain a TextureCoordinate
node. The texture coordinates in that node are applied to the vertices
of the IndexedFaceSet as follows:
-
If the texCoordIndex field is not empty, then it is used to choose
texture coordinates for each vertex of the IndexedFaceSet in exactly the
same manner that the coordIndex field is used to choose coordinates
for each vertex from the Coordinate node. The texCoordIndex field
shall contain at least as many indices as the coordIndex field,
and shall contain end-of-face markers (-1) in exactly the same places as
the coordIndex field. If the greatest index in the texCoordIndex
field is N, then there shall be N+1 texture coordinates in the TextureCoordinate
node.
-
If the texCoordIndex field is empty, then the coordIndex
array is used to choose texture coordinates from the TextureCoordinate
node. If the greatest index in the coordIndex field is N, then there
shall be N+1 texture coordinates in the TextureCoordinate node.
If the texCoord field is NULL, a default texture coordinate mapping
is calculated using the local coordinate system bounding box of the shape.
The longest dimension of the bounding box defines the S coordinates, and
the next longest defines the T coordinates. If two or all three dimensions
of the bounding box are equal, ties shall be broken by choosing the X,
Y, or Z dimension in that order of preference. The value of the S coordinate
ranges from 0 to 1, from one end of the bounding box to the other. The
T coordinate ranges between 0 and the ratio of the second greatest dimension
of the bounding box to the greatest dimension. Figure
6.10 illustrates the default texture coordinates for a simple box shaped
IndexedFaceSet with an X dimension twice as large as the Z dimension and
four times as large as the Y dimension. Figure 6.11
illustrates the original texture image used on the IndexedFaceSet used
in
Figure 6.10.
 |