WinFrame 3D Viewer Format - WFL
WinFrame Language (WFL)
WinFrame Language is a simple XML application interface that can be used to drive a
variety of viewers to perform interactive object animations. (Commas and quotes are optional.)
WinFrame operates within a Cartesian coordinate system,
with coordinates X, Y, and Z. The units are arbitrary, but often are assumed to be meters, by convention.
When modeling small spaces, units of millimeters, inches, or feet have been used. While for large spaces, Km or miles may be convenient.
By common computer graphics convention in 2D displays, the X-axis is normally the horizontal (left-right) axis, and the Y-axis is the
vertical (up-down) axis. 3D graphics extends this by adding the Z-axis, or depth-axis, which is commonly viewed as coming out of,
or receding into, the screen. Note that in WinFrame, the observation point, or camera view-position, can be changed.
Figure 1 below, illustrates the relationship of the axes, as viewed when the camera position is placed in the positive X-Y-Z quadrant.
Figure 1 - WinFrame Coordinate Aves.
Winframe automatically keeps the camera up-right, so positive Y is always toward the top of the screen.
However, if you move the camera, for example to be on the negative Z-axis and still pointing at the origin, so as to be
looking at the above diagram from behind, then the positive X-axis will naturally appear to extend to the left, instead of the
right as shown in the diagram.
When used to view terrain-maps or outdoor landscapes, the X-axis typically represents the East-West coordinate,
the Z-axis represents the North-South coordinate, and the Y-value represents (up-down) altitude.
The camera setup must be done first, before anything else.
<set_camera>
<frustum fov="" near_field="" far_field="" />
<position x="" y="" z="" />
<pointat x="" y="" z="" />
</set_camera>
Example:
<set_camera>
<frustum fov="45.0" min="2.5" max="12000.0"/>
<position x="0.0" y="1200.0" z="-4900.0"/>
<pointat x="0.0" y="0.0" z="-2350.0"/>
</set_camera>
Where: View_angle (fov=field-of-view) is in degrees. (Frustum is the viewable volume
in front of the virtual camera, or viewing location.)
Near-field is the closest range from the camera that objects will be visible.
Far-field is the farthest range.
Convention is to assume coordinates are in meters.
X-axis is initially left-right (for camera position x=0 with z=negative).
Y-axis is up-down (positive y is up).
Z-axis is into screen.
The pointat operator specifies where the camera is pointing at.
Camera settings can be changed throughout simulation.
If unsure about these settings, experiment. Frustum can be varied
interactively under the Meta-menu.
<def_obj> type_name
...
</def_obj>
Where "..." is the list of components out of which the new object-type
is composed. Objects may be constructed from any combination of
triangles, quadrilaterals (quads), images, image-slices, simple objects
(lines, text, spheres, boxes, cylinders, disks), and other sub-objects.
Triangles, quads, and images are described in this section. The other
component types are described in subsequent sections.
Triangles & Quads:
Colored surfaces of arbitrary shape can be constructed out of the basic
building blocks: triangles and quads. The color of subsequent
triangles and/or quads is set by the <col r="" g="" b="" t=""/>
tag. In def_obj, color can be set anywhere, and remains until changed.
It should be set once before drawing triangles or quads. Color is
specified by r,g,b and t, where t is transparency (1=solid, 0=clear,
0.5=translucent, etc.), by:
<col r="" g="" b="" t=""/>
Triangles are specified by:
<tri> <vrt x="" y="" z="" /> <vrt x="" y="" z="" />
<vrt x="" y="" z="" /> </tri>
Example: - Define an object out of triangular polygons.
<def_obj> BuildingT36
<col r="0.19" g="0.27" b="0.28" t="1"/>
<tri>
<vrt x="118.03" y="0" z="-259.674"/>
<vrt x="157.36" y="0" z="-259.674"/>
<vrt x="157.36" y="206.467" z="-259.674"/>
</tri>
<tri> <vrt x="118.03" y="206.467" z="-259.674"/>
<vrt x="118.03" y="0" z="-259.674"/>
<vrt x="157.36" y="206.467 -259.674"/>
</tri>
<tri> <vrt x="118.03" y="206.467" z="-312.025"/>
<vrt x="118.03" y="206.467" z="-259.674"/>
<vrt x="157.36" y="206.467"" z="-259.674"/>
</tri>
</def_obj>
Quadrilateral polygons (Quads) are specified by the <quad> construct:
<quad> <vrt x="" y="" z="" /> <vrt x="" y="" z="" />
<vrt x="" y="" z="" />
<vrt x="" y="" z="" /> </quad>
Note there are four vertices per a quad. Special care must be taken,
when using quads, to not cross the vertices, like an hour-class
shape. Open GL does not support that.
A key point to note is that, by default, triangles and quadrilaterals are visible only from their
front side. (This is advantageous for rendering efficiency, since many objects are viewed from only
one side. For example the walls of any solid object, such as a boat or a building, as viewed from outside.)
The front side is determined
by the pointing direction of the vector norm of the vertices, - also called the winding.
If you get the winding (order of the vertices)
wrong, you may notice your triangle is viewable from the wrong side. Simply reverse the
winding by flipping a pair of vertices in the case of a triangle, or by re-ordering three vertices
of a quad.
A simple way to avoid the wrong-side problem is to use two-sided polygons. These are also
useful when you are describing a thin surface which actually can be viewed from both sides.
Use the variants <tri2> and <quad2> accordingly.
Lines:
Two points make a line.
<line> <vrt x="" y="" z="" /> <vrt x="" y="" z="" /> </line/>
Optional additional tags can occur with the <line> and </line/> pair, include:
<col r="" g="" b="" t="" />
<thick thickness= "" />
Thickness defaults to 1.
Images/Textures:
Instead of just colored surfaces, you can define objects by mapping arbitrary images to the quadrilaterals.
This produces rich textures and realistic views, while often reducing the total polygons for drawing scenes with
better qualities.
Instead of <tri>, <col>,and <quad>; use:
<image> image_filename <vrt x="" y="" z="" />
<vrt x="" y="" z="" /> <vrt x="" y="" z="" />
<vrt x="" y="" z="" /> </image>
For examples and further information, see also More info about defining images.
Mixing Object Types:
Mixtures of <tri>, & <quad>,and <image>, as well as any of the
simple shapes (disk, box, cylinder, sphere) described below, can be all used in any combination.
Also, other object types can be instantiated within new definitions to create compound objects through hierarchical
construction.
Scaling and Offsets:
Scale:
<scale> SC </scale>
Offset:
<offset x="XX" y="YY" z="ZZ"/>
Where SC is the scale amount, and XX, YY, ZZ are the offset amounts for x
y, and z axes, respectively. These commands scale or offset all subsequent
objects by the designated amounts. This can be used to fit objects
which were defined with greatly differing sizes into common scenes.
Also allows changing the centers for better rotations.
Examples:
<scale> 2.0 </scale>
<offset x="10.0"/>
<offset x="10.0" y="-30.0"/>
<inst_obj name="" kind="" x="" y="" z="" xang="" yang="" zang="" />
...
Where name sets the instance-name of the object. All object instances must have a unique
instance-name. This becomes the handle to the object for future commands, such as moves,
rotations, etc.. And where kind specifies the type of object to instantiate. (This
must be a previously defined type-name.) And where x,y,z set the initial position, and the
remaining xang, yang, and zang set the initial xAxisAngle, yAxisAngle, and zAxisAngle angles
in degrees.
The above is useful for instantiating the initial objects immediately. To schedule new
objects to be added at later times, use inst_obj_at.
<inst_obj_at name="" kind="" T="" x="" y="" z="" xang="" yang="" zang="" />
Where T is instantiation time. The rotation angles are applied in the order of zang first,
yagn second, and xang last.
Example
<inst_obj name="Building_37" kind="BuildingT36" x="0" y="0" z="0"
xang="0" yang="0" zang="0" />
Instance Scaling - <scale> SC </scale>
- Affects the instantiation positions.
- Is obeyed when encountered anywhere between objects.
(Except within an object's definition where it is local.)
- Remains set to whatever, until re-set back to 1.0.
- Does not affect an instance of an object's defined size,
but does scale the position values of the instantiated object.
Options
face="camera" - Causes object to always face camera. Good for text attached to
objects. Keeps it readable from any angle. Also good for 2D
animatrons, keeps 2D image or object always facing camera for
simulated 3D look.
moveobject
<mo obj="" T1="" T2="" x="" y="" z="" />
<mo_rel obj="" duration="" x="" y="" z="" />
rotateobject
<ro obj="" T1="" T2="" xang="" yang="" zang="" />
<ro_rel obj="" duration="" xang="" yang="" zang="" />
orbitobject
<orbity obj="" T1="" T2="" xcntr="" ycntr="" zcntr="" ang="" />
<orbity_rel obj="" duration="" xcntr="" ycntr="" zcntr="" ang="" />
<orbitx obj="" T1="" T2="" xcntr="" ycntr="" zcntr="" ang="" />
<orbitx_rel obj="" duration="" xcntr="" ycntr="" zcntr="" ang="" />
<orbitz obj="" T1="" T2="" xcntr="" ycntr="" zcntr="" ang="" />
<orbitz_rel obj="" duration="" xcntr="" ycntr="" zcntr="" ang="" />
The _rel, or relative versions of the movement commands instruct the
viewer to move the object for the duration specified, beginning whenever the command
is received by the viewer. These permit non-synchronized/real-time simulations to
drive the viewer. They are time-relative, or relative to the current time.
The moveobject command (mo) causes the named object-instance to move to the
specified (x,y,z) location during the specified time duration from where-ever it
was at the start of the duration. It will move at whatever velocity is required
to reach the (x,y,z) point at the end of the duration.
The rotateobject command (ro) causes the named object-instance to rotate
about its own x, y, or z axis to the specified angle during the specified time
duration. All angles are specified in degrees. It will rotate at whatever rate is
needed to rotate to specified angle in that time-duration.
The orbitobject command (orbitx, orbity, oribtz) causes the named object-instance
to orbit the center-point specified by (xcntr,ycntr,zcntr), from it's initial location.
The distance between the center-point and the initial location defines the radius of
the orbit. It will orbit by the specified angular amount during the specified time
duration. This command can be used to produce curvilinear trajectories by using
angles less than 180-degrees, or can be used to produce multiple orbital passes by using
angles that are many multiples of 360 (IE. much greater than 360). All angles are
specified in degrees. Orbital motion can be specified relative to each axis independently.
For example, orbity causes an orbit around the y-axis in which the object will move
in the x-z plane. A simultaneous orbitx at the same rate will cause a y-displacement -
in combination creating a slanted orbit.
Lines between Points in Space -
DrawLine
<drawline x1="" y1="" z1="" x2="" y2="" z2=""
t1="" t2="" r="" g="" b="" thickness=""/>
<drawline_rel x1="" y1="" z1="" x2="" y2="" z2=""
duration="" r="" g="" b="" thickness=""/>
Beams between Points in Space -
BeamXYZ - (Same as DrawLine but with thickness = 3.0)
<beamxyz x1="" y1="" z1="" x2="" y2="" z2="" t1="" t2=""
r="" g="" b="" />
Beams between objects -
Beam
<beam obj1="" obj2="" t1="" t2="" r="" g="" b="" />
Beam offsets -
BeamOffset
<beamoffset y="" />
Raises or lowers the point that beams are drawn to/from objects (as
drawn via the <beam obj1 obj2 ... command). The value offsets
the attachment point in the Y-dimension (usually up/down). The beam
command normally draws to an object's defined origin point. However,
many vehicle object definitions start at y=0.0 (where the tires meet
the road), and work upward from there. If left alone, beams will be
drawn to the bottom of the object, and will often be obscured by
terrain. Instead, you may wish the beam to be drawn toward the top of
the vehicle, where the antenna is. Accomplish this by providing a
positive Y offset. This is a global offset.
Conical Beams between objects -
ConeBeam
<conebeam obj1="" obj2="" t1="" t2="" r="" g="" b="" bw=""/>
Where bw is the beam-width. The default value of 1.0 corresponds
to a 30-degree cone-beam. Smaller values make narrower cones, and vice-versa.
6. Comments:
You may place comments within geometry files, or use the comments to comment-out
sections of a geometry file. The standard XML comment construct is:
<!-- whatever -->
An alternate, perhaps more intuitive syntax is:
<comment> whatever
...
</comment>
7. Including Files:
You may reference other files from within a geometry file.
The include construct is:
<include> filename </include>
8. Requesting Time:
This command is intended for use from live programs connected by sockets to WinFrame3D.
Often it is useful to synchronize, or have some notion as to the progress of the
viewer from a simulation which may not run in real-time. For example, the simulation
may either not want to get too far ahead, or fall behind the real-time clock which
governs the viewer. In such cases, the interactive program can ask the WinFrame3D
viewer for the time by sending the following command on the socket.
<time/>
WinFrame3D will respond with the current time in seconds since the start of the viewer
as a floating-point number character string. This is the same time reference which
governs the display (ex. T1 and T2). The string is sent back over the same socket
on which the command was received.
Example:
{
char tmpst[100];
send_soc( soc, "<time />\n"); /* Ask what time it is. */
send_soc( soc, "<nop />\n"); /* Send nop to flush socket. */
if (recv_soc( soc, tmpstr, 100 ) < 0) printf("socket error\n");
if (sscanf( &(tmpstr[3]), "%f", &Tnow )!=1)
printf("error reading time (%s)\n", tmpstr);;
}
By default, fog is normally "on", it's density is set to 0.0002, and it's color is
r=0.3 g=0.3 b=0.5.
- Fog can controlled by the following command-line options.
- Disable fog by: -fogoff or: -nofog
- Increase or decrease fog-density by: -fogdensity 0.0002
- Change fog color by: -fogcolor r g b
For example: -fogcolor 0.3 0.3 0.5
- Fog can be controlled within files by the following tags:
- Disable fog by: <fog density="0.0" />
- Enable fog and set density to xx by: <fog density="xx" />
- Change fog color by: <fog color="r g b" />
- Fog can also be controlled interactively on the Meta-menu.
See Other WF3d Command Line Options.
10. Background Color - <bgcolor r=0.3 g=0.3 b=0.6/>
- Normally background color is r=0.3 g=0.3 b=0.6.
- This command changes the background color to whatever you want.
- Example: <bgcolor r=0 g=0 b=0/>
(Makes black background.)
11. Adding Text -
<text name="" x="" y="" z="" xang="" yang="" zang="" r="" g="" b="" scale=""
thickness=""> YOUR TEXT HERE </text>
Defines and instantiates a named text object. It can be moved, rotated, shifted, etc..
Example:
<text name=textitem1 x=120 y=200 z=45 scale=10 thickness=2 r=1 g=0 b=0>
This is the text. </text>
The name is required, but the other parameters are optional. Scale
controls the size of the text, and defaults to 1.0. Thickness
controls the thickness or boldness, and defaults to 1.0. The x,y,z
values set the location of the text, relative to the lower left corner
of the text string. The r,g,b values control the text color, range
between 0.0 and 1.0, and default to a lime color. The xang, yang, and
zang cause the text orientation to be rotated around the x, y, or z
axis, respectively, by the specified angle in degrees. If the angles
are set to zero or left-out, by default the string advances from
left-to-right along the x-axis, and up-down along the y-axis. The
rotation angles can be used to change from the default orientation,
Other Options
face="camera" - Causes text to always face camera. Good for text attached to
objects. Keeps it readable from any viewing angle.
You can move and point the camera via the following file or socket commands.
These can be used to pan the camera at predetermined rates and times.
<camera_move t1="" t2="" x="" y="" z="" />
<camera_move_rel duration="" x="" y="" z="" />
and
<camera_point t1="" t2="" x="" y="" z="" />
<camera_point_rel duration="" x="" y="" z="" />
When modeling land areas, the camera can be restricted from going below ground level by the
following tag:
<camera_min_alt min_alt="yy" />
Where yy is the minimum height above the terrain.
This option is primarily useful when used with a terrain-elevation surface.
The camera view-point can also be restricted with the -camera_min_alt yy
command-line option.
13. Removing Objects -
Removing Object Instances:
<rmobj name="" T="" />
Name is the instance-name of the object to be removed.
T designates the time the object will be removed.
Relative times may be specified with rmobj_rel.
(The time will then be interpreted relative to when the command arrived
to the viewer).
Example:
<rmobj name="tank1" T="10.5" />
<rmobj_rel name="tank1 T="3.5" />
Removing Object Definitions: (This also removes all instances
automatically.)
<rmdef kind="" T="" />
Kind is the type-name of the object-definition to be removed.
T designates the time the object will be removed.
Relative times may be specified with rmdef_rel.
(The time will then be interpreted relative to when the command
arrived to the viewer).
Example:
<rmdef kind="Tank_T72" T="10.5" />
<rmdef_rel kind="Tank_T72" T="3.5" />
Several basic geometric shapes can be quickly defined through the following
convenience functions.
- Spheres can be automatically defined with the following command:
<def_sphere kind="" nhemi="" radius="" nslices="" nlayers=""
r="" g="" b="" transp="" />
Where: kind will be the type-name of the newly defined object type.
nhemi is the number of hemispheres, and must be either 1 or 2.
2 draws a complete sphere, while 1 draws a half-sphere.
radius controls the size of the sphere.
nslices and nlayers control the quality and
complexity of the sphere in terms of the number of
polygons used to render it. These default to 10 and 8
respectively, unless specified. Generally, the smaller
the sphere, the less detail is needed. Values of 8 and 6
deliver the lowest quality sphere, while values of 22 and
20 deliver ultra high quality spheres.
r, g, b specify the color in values between 0.0 and 1.0.
transp controls the level of transparency. A value of
1.0 is solid or non-transparent. A value of 0.0 it totally
transparent or invisible.
A semi-transparent sphere can be useful for illustrating the range of radio
transmissions or other forms of influence. On the ground, usually only a half
sphere is needed. (It's orientation may need to be rotated.)
Like all object definitions, the sphere needs to be instantiated. Any number of
a given type can be instantiated and moved.
Example:
<def_sphere kind="sph1" nhemi="2" radius="600" nslices="10" nlayers="8"
r="0.2" g="0.5" b="0.1" transp="0.5" />
<inst_obj name="sp1" kind="sph1" x="300" y="400" z="0"
xang="-90" yang="0" zang="0" />
- Cylinders can be automatically defined with the following command:
<def_cylinder kind="" radius="" nslices="" height=""
r="" g="" b="" transp="" />
Where: kind will be the type-name of the newly defined object type.
radius controls the diameter of the cylinder.
nslices controls the quality of the cylinder in terms of the number
of polygons used to render it. It defaults to 20 unless specified.
Generally, the smaller the cylinder, the less detail is needed.
Values of 10-15 deliver the lowest quality cylinder, while values of
40-80 deliver high quality cylinders.
Values above 100 are usually overkill.
height controls the length of the cylinder.
r, g, b specify the color in values between 0.0 and 1.0.
transp controls the level of transparency. A value of 1.0 is
solid or non-transparent. A value of 0.0 it totally transparent or
invisible. 1.0 is default.
All but the name are optional, and will be set to the default values
unless specified.
Example:
<def_cylinder kind="cyltype" radius="1.0" nslices="20"
height="50" r="0.2" g="0.3" b="0.1" />
<inst_obj name="cyl1" kind="cyltype" x="300" y="400" z="0"
xang="-90" yang="0" zang="0" />
- Disks, Arcs, Wedges can be automatically defined with the following command:
<def_disk kind="" radius="" nsegs="" fill="" thickness="" ang=""
dir="" r="" g="" b="" transp="" />
Where: kind will be the type-name of the newly defined object type.
nsegs controls the quality of the disk in terms of the number of
polygons used to render it.
fill controls the outline and interior of the disk.
fill = 0 produces just the outline of the disk, or an arc.
fill = 1 produces just the filled surface of the disk or wedge,
with no outline.
fill = 2 produces a filled and outlined disk or wedge.
The default fill value is 1.
thickness applies only to the optional outline, and defaults to 1.0.
ang and dir apply to partial disks, which are wedges or arcs.
The ang value specifies the angle subtended by the wedge or arc.
dir controls which direction the wedge points, or is oriented.
Both angles are specified in degrees, and default to 360
(full disk), and 0, respectively. The 0-degree direction points
toward the positive x-axis. 90-degrees points toward the
positive y-axis.
r, g, b, transp - specify the color and transparency.
Each range 0.0-1.0. Transparency of 1.0 is solid, 0.0 is invisible.
All but the name are optional, and will be set to the default values
unless specified.
Example:
<def_disk kind="disktypeA" radius="10" fill="1" r="0.3" g="0.2" b="0.1" />
<inst_obj name="disk1" kind="disktypeA" x="300" y="400" z="0"
xang="-90" yang="0" zang="0" />
- Boxes can be automatically defined with the following command:
<def_box kind="" length="" width="" height="" r="" g="" b="" transp="" />
All but the name are optional, and will be set to the default values
unless specified.
Example:
<def_box kind="boxtypeA" length="10" width="20.3" height="40.1"
r="0.3" g="0.2" b="0.1" />
<inst_obj name="box1" kind="boxtypeA" x="300" y="400" z="0"
xang="-90" yang="0" zang="0" />
15. Scaling Instantiated Objects -
You change the scale of any instantiated object at any time by:
<scaleobj name="" T="" scale="" />
Where: name is the instance-name of the object to be scaled.
T is the time the scaling takes effect.
and scale is the scale factor.
(Greater than one make larger, less than one reduces size.)
Relative times may be specified with scaleobj_rel.
(The time will then be interpreted relative to when the command arrived to the viewer).
You may stretch or shrink an object in one dimension using the scaleobj_x,
scaleobj_y, or scaleobj_z tags as follows:
<scaleobj_x name="" T="" scale="" />
<scaleobj_y name="" T="" scale="" />
<scaleobj_z name="" T="" scale="" />
These commands scale the object in the respective dimension independently.
16. Attaching Objects to Other Objects -
You can attach an object to another object so that the objects move together by
using the attach_obj command.
<attach_obj obj="" to_obj="" t1="" t2="" xoffset="" yoffset="" zoffset="" />
This causes the first object's position to be locked to the second
object's position. At time t1, the first object will snap to second
object's position, if not already there, and it will move with the
second object as it moves. The x,y,z offsets are optional.
You can display objects in the foreground of the screen that stay in
the same place on the screen regardless of where the camera is pointed.
The objects in foreground mode are displayed in orthonormal projection
within a 100x100x500 cube. The X-values span from 0 to 100, with 0
being on the left and 100 on the right. The Y-values span from -100 up
to 0, with -100 being at the bottom and 0 at the top of the screen.
((x,y)=(0,0) is the upper left corner of the display.) The Z-values
span from -100 to 400, with -100 being farthest from the camera, and
400 being closest to the camera view-point.
Under the normal default mode, objects are displayed in perspective
projection within a user-specified frustum. Perspective viewing
renders distant objects smaller than closer objects, while orthonormal
projection renders objects the same size, regardless of distance from
the camera. For this reason, the foreground mode is useful for
displaying text, and perhaps console (own-vehicle) displays, gauges,
etc., which are to remain stationary on the screen. The foreground
mode is also known as screen-relative while the normal
perspective or background mode is known as scene-relative. The
orthonormal foreground mode is also useful for any kind of 2D displays
in general, such as 2D maps, or even 2D map overlays on a split 3D
screen.
To specify objects in the orthonormal foreground mode, toggle into the
foreground state with:
<bgfgstate state = "F"/>
Then instantiate the objects, text, etc..
You can switch back to the default background state by:
<bgfgstate state = "B"/>
You can switch back and forth between the two states whenever needed.
The bgfgstate affects only the instantiation process. Once
instantiated, an object remains in the respective display state.
Therefore, once an object is instantiated, it can be manipulated from
either state. All of the object constructs are available likewise from
both states.
In old versions of WinFrame (prior to version 3.0), quotes around
attribute values and attribute name identifiers were optional, and
commas between attributes were allowed. However, since version 3.0,
strict XML syntax is now required.
See Also:
- Command-Line Options-
Several useful command-line options are available, but the commands are not part of
the WinFrame Language (WFL) proper. For a summary of the available options, see:
WF3d Command Line Options.
- WF-3D Operating Instructions -
How to operate the WF-3D viewer. Instructions for operating WF-3D during viewing, are not
part of the WinFrame Language (WFL) proper, but are contained at:
WF-3D Operation.
- WF-3D Object Interface -
You can link WF-3D to your own programs so that you can call WF-3D commands/operations
directly, without using a socket or file interface. See WF-3D
Object Interface.
- Other Advanced Functions - Additional functions.
See also: WF3d
|