OOGL formatFrom the GeomView manual.Edited by Paul Bourke October 1996 The objects that you can load into Geomview are called OOGL objects. OOGL stands for "Object Oriented Graphics Library"; it is the library upon which Geomview is built. There are many different kinds of OOGL objects. This chapter gives syntactic descriptions of file formats for OOGL objects.
Conventions
Syntax Common to All OOGL File FormatsMost OOGL object file formats are free-format ASCII -- any amount of white space (blanks, tabs, newlines) may appear between tokens (numbers, key words, etc.). Line breaks are almost always insignificant, with a couple of exceptions as noted. Comments begin with # and continue to the end of the line; they're allowed anywhere a newline is. Binary formats are also defined for several objects; See section on binary format, and the individual object descriptions. Typical OOGL objects begin with a key word designating object type, possibly with modifiers indicating presence of color information etc. In some formats the key word is optional, for compatibility with file formats defined elsewhere. Object type is then determined by guessing from the file suffix (if any) or from the data itself.
Key words are case sensitive. Some have optional prefix letters
indicating presence of color or other data; in this case the order of
prefixes is significant, e.g.
File NamesWhen OOGL objects are read from disk files, the OOGL library uses the file suffix to guess at the file type. If the suffix is unrecognized, or if no suffix is available (e.g. for an object being read from a pipe, or embedded in another OOGL object), all known types of objects are tried in turn until one accepts the data as valid.
VerticesSeveral objects share a common style of representing vertices with optional per-vertex surface-normal and color. All vertices within an object have the same format, specified by the header key word. All data for a vertex is grouped together (as opposed to e.g. giving coordinates for all vertices, then colors for all vertices, and so on). The syntax is
optionally followed by
optionally followed by
(two or three texture-coordinate values). Values are separated by white space, and line breaks are immaterial. Letters in the object's header key word must appear in a specific order; that's the reverse of the order in which the data is given for each vertex. So a `CN4OFF' object's vertices contain first the 4-component space position, then the 3-component normal, finally the 4-component color. You can't change the data order by changing the header key word; an `NCOFF' is just not recognized.
Surface normal directionsGeomview uses normal vectors to determine how an object is shaded. The direction of the normal is significant in this calculation. When normals are supplied with an object, the direction of the normal is determined by the data given. When normals are not supplied with the object, Geomview computes normal vectors automatically; in this case normals point toward the side from which the vertices appear in counterclockwise order. On parametric surfaces (Bezier patches), the normal at point P(u,v) is in the direction dP/du cross dP/dv.
Transformation matricesSome objects incorporate 4x4 real matrices for homogeneous object transformations. These matrices act by multiplication on the right of vectors. Thus, if p is a 4-element row vector representing homogeneous coordinates of a point in the OOGL object, and A is the 4x4 matrix, then the transformed point is p' = p A. This matrix convention is common in computer graphics; it's the transpose of that often used in mathematics, where points are column vectors multiplied on the right of matrices. Thus for Euclidean transformations, the translation components appear in the fourth row (last four elements) of A. A's last column (4th, 8th, 12th and 16th elements) are typically 0, 0, 0, and 1 respectively.
Binary format
Many OOGL objects accept binary as well as ASCII file formats.
These files begin with the usual ASCII token (e.g.
OFF BINARY # binary-format "OFF" data follows Binary data comprise 32-bit integers and 32-bit IEEE-format floats, both in big-endian format (i.e., with most significant byte first). This is the native format for 'int's and 'float's on Sun-3's, Sun-4's, and Irises, among others.
Binary data formats resemble the corresponding ASCII formats, with ints
and floats in just the places you'd expect. There are some exceptions
though, specifically in the Binary OOGL objects may be freely mixed in ASCII object streams:
LIST { = MESH BINARY ... binary data for mesh here ... } { = QUAD 1 0 0 0 0 1 0 1 0 0 1 0 } Note that ASCII data resumes immediately following the last byte of binary data. Naturally, it's impossible to embed comments inside a binary-format OOGL object, though comments may appear in the header before the beginning of binary data.
Embedded objects and external-object references
Some object types ( The general syntax is
<oogl-object> ::= [ "{" ] [ "define" where "quoted" items are literal strings (which appear without the quotes), [bracketed] items are optional, and | denotes alternatives. Curly braces, when present, must match; the outermost set of curly braces is generally required when the object is in a larger context, e.g. when it is part of a larger object or embedded in a Geomview command stream. For example, each of the following three lines: { define fred QUAD 1 0 0 0 0 1 0 1 0 1 0 0 } { appearance { +edge } LIST { < "file1" } { : fred } } VECT 1 2 0 2 0 0 0 0 1 1 2is a valid OOGL object. The last example is only valid when it is delimited unambiguously by residing in its own disk file. The "<" construct causes a disk file to be read. Note that this isn't a general textual "include" mechanism; a complete OOGL object must appear in the referenced file.
Files read using "<" are sought first in the directory of the file which
referred to them, if any; failing that, the normal search path (set by
Geomview's
The ":" construct allows references to symbols, created with
Again, white space and line breaks are insignificant, and "#" comments may appear anywhere.
Appearances
Geometric objects can have associated "appearance" information,
specifying shading, lighting, color, wireframe vs. shaded-surface
display, and so on. Appearances are inherited through object
hierarchies, e.g. attaching an appearance to a Some appearance-related properties are relegated to "material" and "lighting" substructures. Take care to note which properties belong to which structure. Here's an example appearance structure including values for all attributes. Order of attributes is unimportant. As usual, white space is irrelevant. Boolean attributes may be preceded by "+" or "-" to turn them on or off; "+" is assumed if only the attribute name appears. Other attributes expect values. A "*" prefix on any attribute, e.g. "*+edge" or "*linewidth 2" or "material { *diffuse 1 1 .25 }", selects "override" status for that attribute.
appearance { +face # (Do) draw faces of polygons. On by default. -edge # (Don't) draw edges of polygons +vect # (Do) draw VECTs. On by default. -transparent # (Disable) transparency. enabling transparency # does NOT result in a correct Geomview picture, # but alpha values are used in RenderMan snapshots. -normal # (Do) draw surface-normal vectors normscale 1 # ... with length 1.0 in object coordinates +evert # do evert polygon normals where needed so as # to always face the camera -texturing # (Disable) texture mapping -backcull # (Don't) discard clockwise-oriented faces -concave # (Don't) expect and handle concave polygons -shadelines # (Don't) shade lines as if they were lighted cylinders # These four are only effective where the graphics system # supports them, namely on GL and Open GL. -keepcolor # Normally, when N-D positional coloring is enabled as # with geomview's (ND-color ...) command, all # objects' colors are affected. But, objects with the # "+keepcolor" attribute are immune to N-D coloring. shading smooth # or "shading constant" or "shading flat" or # or "shading csmooth". # smooth = Gouraud shading, flat = faceted, # csmooth = smoothly interpolated but unlighted. linewidth 1 # lines, points, and edges are 1 pixel wide. patchdice 10 10 # subdivide Bezier patches this finely in u and v material { # Here's a material definition; # it could also be read from a file as in # "material < file.mat" ka 1.0 # ambient reflection coefficient. ambient .3 .5 .3 # ambient color (red, green, blue components) # The ambient contribution to the shading is # the product of ka, the ambient color, # and the color of the ambient light. kd 0.8 # diffuse-reflection coefficient. diffuse .9 1 .4 # diffuse color. # (In "shading constant" mode, the surface # is colored with the diffuse color.) ks 1.0 # specular reflection coefficient. specular 1 1 1 # specular (highlight) color. shininess 25 # specular exponent; larger values give # sharper highlights. backdiffuse .7 .5 0 # back-face color for two-sided surfaces # If defined, this field determines the diffuse # color for the back side of a surface. # It's implemented by the software shader, and # by hardware shading on GL systems which support # two-sided lighting, and under Open GL. alpha 1.0 # opacity; 0 = transparent (invisible), 1 = opaque. # Ignored when transparency is disabled. edgecolor 1 1 0 # line & edge color normalcolor 0 0 0 # color for surface-normal vectors } lighting { # Lighting model ambient .3 .3 .3 # ambient light replacelights # "Use only the following lights to # illuminate the objects under this # appearance." # Without "replacelights", any lights listed # are added to those already in the scene. # Now a collection of sample lights: light { color 1 .7 .6 # light color position 1 0 .5 0 # light position [distant light] # given in homogeneous coordinates. # With fourth component = 0, # this means a light coming from # direction (1,0,.5). } light { # Another light. color 1 1 1 position 0 0 .5 1 # light at finite position ... location camera # specified in camera coordinates. # (Since the camera looks toward -Z, # this example places the light # .5 unit behind the eye.) # Possible "location" keywords: # global light position is in world coordinates # This is the default if no location specified. # camera position is in the camera's coordinate system # local position is in the coordinate system where # the appearance was defined } } # end lighting model texture { clamp st # or "s" or "t" or "none" file lump.tiff # file supplying texture-map image alphafile mask.pgm.Z # file supplying transparency-mask image apply blend # or "modulate" or "decal" transform 1 0 0 0 # surface (s,t,0,1) * tfm -> texture coords 0 1 0 0 0 0 1 0 .5 0 0 1 background 1 0 0 1 # relevant for "apply blend" } } # end appearance There are rules for inheritance of appearance attributes when several are imposed at different levels in the hierarchy. For example, Geomview installs a backstop appearance which provides default values for most parameters; its control panels install other appearances which supply new values for a few attributes; user-supplied geometry may also contain appearances. The general rule is that the child's appearance (the one closest to the geometric primitives) wins. Further, appearance controls with "override" status (e.g. *+face or material { *diffuse 1 1 0 }) win over those without it. Geomview's appearance controls use the "override" feature so as to be effective even if user-supplied objects contain their own appearance settings. However, if a user-supplied object contains an appearance field with override status set, that property will be immune to Geomview's controls.
Texture Mapping
Some platforms support texture-mapped objects.
(On those which don't, attempts to use texture mapping are silently
ignored.) A texture is specified as part of an appearance structure,
as in See section on appearances. Briefly, one provides a texture image,
which is considered to lie in a square in
There is (currently) no provision for inheritance of part of a texture
structure; if the
The appearance attribute The available fields are:
clamp none -or- s -or- t -or- st Determines the meaning of texture coordinates outside the range 0..1. With
Object File Formats
QUAD: collection of quadrilaterals
The conventional suffix for a The file syntax is
[C][N][4]QUAD -or- [C][N][4]POLY # Key word vertex vertex vertex vertex # 4*N vertices for some N vertex vertex vertex vertex ...
The leading key word is
(but not Following the key word is an arbitrary number of groups of four vertices, each group describing a quadrilateral. See the Vertex syntax above. The object ends at end-of-file, or with a closebrace if incorporated into an object reference (see above).
A
MESH: rectangularly-connected mesh
The conventional suffix for a The file syntax is
[U][C][N][Z][4][u][v][n]MESH # Key word [Ndim] # Space dimension, present only if nMESH Nu Nv # Mesh grid dimensions # Nu*Nv vertices, in format specified # by initial key word vertex(u=0,v=0) vertex(1,0) ... vertex(Nu-1,0) vertex(0,1) ... vertex(Nu-1,1) ... vertex(0,Nv-1) ... vertex(Nu-1,Nv-1)
The key word is
Note that the order of prefix characters is significant; a coloured,
u-wrapped mesh is a Following the mesh header are integers Nu and Nv, the dimensions of the mesh. Then follow Nu*Nv vertices, each in the form given by the header. They appear in v-major order, i.e. if we name each vertex by (u,v) then the vertices appear in the order
(0,0) (1,0) (2,0) (3,0) ... (Nu-1,0) (0,1) (1,1) (2,1) (3,1) ... (Nu-1,1) ... (0,Nv-1) ... (Nu-1,Nv-1)
A
Bezier SurfacesThe conventional file suffixes for Bezier surface files are `.bbp' or `.bez'. A file with either suffix may contain either type of patch. Syntax:
[ST]BBP -or- [C]BEZ<Nu><Nv><Nd>[_ST] # Nu, Nv are u- and v-direction # polynomial degrees in range 1..6 # Nd = dimension: 3->3-D, 4->4-D (rational) # (The '<' and '>' do not appear in the input.) # Nu,Nv,Nd are each a single decimal digit. # BBP form implies Nu=Nv=Nd=3 so BBP = BEZ333. # Any number of patches follow the header # (Nu+1)*(Nv+1) patch control points # each 3 or 4 floats according to header vertex(u=0,v=0) vertex(1,0) ... vertex(Nu,0) vertex(0,1) ... vertex(Nu,1) ... vertex(0,Nv) ... vertex(Nu,Nv) # ST texture coordinates if mentioned in header These formats represent collections of Bezier surface patches, of degrees up to 6, and with 3-D or 4-D (rational) vertices.
The header keyword has the forms
The
The Nu and Nv, each a single digit in the range 1..6, are the patch's polynomial degree in the u and v direction respectively.
Nd is the number of components in each patch vertex, and must be
either
Any number of patches follow the header. Each patch comprises a series of patch vertices, followed by optional (s,t) texture coordinates, followed by optional (r,g,b,a) colors. Each patch has (Nu+1)*(Nv+1) vertices in v-major order, so that if we designate a vertex by its control point indices (u,v) the order is (0,0) (1,0) (2,0) ... (Nu,0) (0,1) (1,1) (2,1) ... (Nu,1) ... (0,Nv) ... (Nu,Nv)with each vertex containing either 3 or 4 floating-point numbers as specified by the header. If the header calls for ST coordinates, four pairs of floating-point numbers follow: the texture-space coordinates for the (0,0), (Nu,0), (0,Nv), and (Nu,Nv) corners of the patch, respectively. If the header calls for colors, four four-component (red, green, blue, alpha) floating-point colors follow, one for each patch corner. The series of patches ends at end-of-file, or with a closebrace if incorporated in an object reference.
The conventional suffix for Syntax:
[ST][C][N][4][n]OFF # Header keyword [Ndim] # Space dimension of vertices, present only if nOFF NVertices NFaces NEdges # NEdges not used or checked x[0] y[0] z[0] # Vertices, possibly with normals, # colors, and/or texture coordinates, in that order, # if the prefixes
An Three ASCII integers follow: NVertices, NFaces, and NEdges. These are the number of vertices, faces, and edges, respectively. Current software does not use nor check NEdges; it needn't be correct but must be present.
The vertex coordinates follow: dimension * Nvertices
floating-point values. They're implicitly numbered 0 through
NVertices-1. dimension is either 3 (default) or 4 (specified by
the key character Following these are the face descriptions, typically written with one line per face. Each has the form N Vert1 Vert2 ... VertN [color]Here N is the number of vertices on this face, and Vert1 through VertN are indices into the list of vertices (in the range 0..NVertices-1). The optional color may take several forms. Line breaks are significant here: the color description begins after VertN and ends with the end of the line (or the next # comment). A color may be:
For the one-integer case, the colormap is currently read from the file `cmap.fmap' in Geomview's `data' directory. Some better mechanism for supplying a colormap is likely someday. The meaning of "default color" varies. If no face of the object has a color, all inherit the environment's default material color. If some but not all faces have colors, the default is gray (R,G,B,A=.666).
A Exception: each face's vertex indices are followed by an integer indicating how many color components accompany it. Face color components must be floats, not integer values. Thus a colourless triangular face might be represented as
int int int int int 3 17 5 9 0 while the same face coloured red might be
int int int int int float float float float 3 17 5 9 4 1.0 0.0 0.0 1.0
VECT Files
The conventional suffix for Syntax:
[4]VECT NPolylines NVertices NColors Nv[0] ... Nv[NPolylines-1] # number of vertices # in each polyline Nc[0] ... Nc[NPolylines-1] # number of colors supplied # in each polyline Vert[0] ... Vert[NVertices-1] # All the vertices # (3*NVertices floats) Color[0] ... Color[NColors-1] # All the colors # (4*NColors floats, RGBA)
A Next come NLines integers Nv[0] Nv[1] Nv[2] ... Nv[NLines-1] giving the number of vertices in each polyline. A negative number indicates a closed polyline; 1 denotes a single-pixel point. The sum (of absolute values) of the Nv[i] must equal NVertices. Next come NLines more integers Nc[i]: the number of colors in each polyline. Normally one of three values:
The sum of the Nc[i] must equal NColors. Next come NVertices groups of 3 or 4 floating-point numbers: the coordinates of all the vertices. If the keyword is 4VECT then there are 4 values per vertex. The first abs(Nv[0]) of them form the first polyline, the next abs(Nv[1]) form the second and so on. Finally NColors groups of 4 floating-point numbers give red, green, blue and alpha (opacity) values. The first Nc[0] of them apply to the first polyline, and so on. A VECT BINARY format is accepted; See section on the binary format. The binary format exactly follows the ASCII format, with 32-bit ints where integers appear, and 32-bit floats where real values appear.
SKEL Files
Syntax:
[4][n]SKEL [NDim] # Vertex dimension, present only if nSKEL NVertices NPolylines x[0] y[0] z[0] # Vertices # (if nSKEL, each vertex has NDim components) ... x[NVertices-1] y[NVertices-1] z[NVertices-1] # Polylines # Nv = # vertices on this polyline (1 = point) # v[0] ... v[Nv-1]: vertex indices # in range 0..NVertices-1 Nv v[0] v[1] ... v[Nv-1] [colorspec] ... # colorspec continues past v[Nv-1] # to end-of-line; may be nothing, or 3 or 4 numbers. # nothing: default color # 3 or 4 floats: RGB[A] values 0..1
The syntax resembles that of
For
No
SPHERE Files
The conventional suffix for
SPHERE Radius Xcenter Ycenter Zcenter
Sphere objects are drawn using rational Bezier patches, which are diced into
meshes; their smoothness, and the time taken to draw them, depends on the
setting of the dicing level, 10x10 by default.
From Geomview, the
INST Files
The conventional suffix for a There is no INST BINARY format.
An geom oogl-objectspecifies the OOGL object to be instantiated. See section on embedded objects and external-object references, for the syntax of an oogl-object. The keyword unit is a
synonym for geom .
transform ["{"]
specifies a single transformation matrix. Either the
matrix may appear literally as 16 numbers, or there may be
a reference to a "transform" object, i.e.
"<" file-containing-4x4-matrixor ":" symbol-representing-"transform"-object> Another way to specify the transformation is
transforms oogl-object
The oogl-object must be a
If no See section on transformation matrices, for the matrix format.
Two more INST fields are accepted:
location [global or camera or ndc or screen or local]Normally an INST specifies a position relative to its parent object; the location field allows putting an object elsewhere.
origin [global or camera or ndc or screen or local] x y zThe origin field translates the contents of the INST to
place the origin at the specified point of the given coordinate system.
Unlike location , it doesn't change the orientation, only the choice
of origin. Both location and origin can be used together.
So for example { INST location screen origin ndc 0 0 -.99 geom { < xyz.vect } transform { 100 0 0 0 0 100 0 0 0 0 -.009 0 0 0 0 1 } } places xyz.vect's origin in the center of the window, just beyond the near clipping plane. The unit-length X and Y edges are scaled to be just 100 screen units -- pixels -- long, regardless of the size of the window.
INST Examples
Here are some examples of
INST unit < xyz.vect transform { 1 0 0 0 0 1 0 0 0 0 1 0 1 3 0 1 }
{ appearance { +edge material { edgecolor 1 1 0 } } INST geom < mysurface.quad }
{INST transform {: T} geom {<dodec.off}}
{ INST transforms { LIST { < some-matrices.prj } { < others.prj } { TLIST <still more of them> } } geom { # stuff replicated by all the above matrices ... } }
This one resembles the { INST location ndc geom { < xyz.vect } transform { .5 0 0 0 0 .5 0 0 0 0 -.009 0 0 0 -.99 1 } } LIST Files
The conventional suffix for a A list of OOGL objects Syntax:
LIST oogl-object oogl-object ... Note that there's no explicit separation between the oogl-objects, so they should be enclosed in curly braces ({ }) for sanity. Likewise there's no explicit marker for the end of the list; unless appearing alone in a disk file, the whole construct should also be wrapped in braces, as in:
{ LIST { QUAD ... } { < xyz.quad } }
A
{ define somesymbol { LIST } }
TLIST Files
The conventional suffix for a
Collection of 4x4 matrices, used in the Syntax:
TLIST # key word <4x4 matrix (16 floats)> ... # Any number of 4x4 matrices
Be aware that a INST transform { : myT } geom { ... }myT must be a transform object, which might have been created with the gcl (read transform { define myT 1 0 0 1 ... })while in INST transforms { : myTs } geom { ... } or INST transforms { LIST {: myTs} {< more.prj} } geom { ... }myTs must be a geometry object, defined e.g. with (read geometry { define myTs { TLIST 1 0 0 1 ... } })
A
GROUP Files
This format is obsolete, but is still accepted. It combined the
functions of
GROUP ... < matrices > ... unit { oogl-object } is still accepted and effectively translated into
INST transforms { TLIST ... <matrices> ... } unit { oogl-object }
DISCGRP FilesThis format is for discrete groups, such as appear in the theory of manifolds or in symmetry patterns. This format has its own man page. See discgrp(5).
COMMENT ObjectsThe COMMENT object is a mechanism for encoding arbitrary data within an OOGL object. It can be used to keep track of data or pass data back and forth between external modules. Syntax:
COMMENT # key word name type # individual name and type specifier { ... } # arbitrary data The data, which must be enclosed by curly braces, can include anything except unbalanced curly braces. The type field can be used to identify data of interest to a particular program through naming conventions.
Here is an example associating a WorldWide Web URL with a piece of geometry:
{ LIST { < Tetrahedron} {COMMENT GCHomepage HREF { http://www.geom.umn.edu/ }} }
A binary
N Byte1 Byte2 ... ByteNinstead of data enclosed in curly braces.
Non-geometric objectsThe syntax of these objects is given in the form used in See section on Embedded objects and external-object references, where "quoted" items should appear literally but without quotes, square bracketed ([ ]) items are optional, and | separates alternative choices.
Transform Objects
Where a single 4x4 matrix is expected -- as in the
Note that a transform is distinct from a Why have both? In many places -- e.g. camera positioning -- it's only meaningful to have a single transform. Using a separate object type enforces this. Syntax for a transform object is
<transform> ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "transform" ] (optional keyword; unnecessary if the type is determined by the context, which it usually is.) [ "define" <name> ] (defines a transform named <name>, setting its value from the stuff which follows) <sixteen floating-point numbers> (interpreted as a 4x4 homogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in the bottom row) | "<" <filename> (meaning: read transform from that file) | ":" <name> (meaning: use variable <name>, defined elsewhere; if undefined the initial value is the identity transform) [ "}" ] (matching curly brace) The whole should be enclosed in { braces }. Braces are not essential if exactly one of the above items is present, so e.g. a 4x4 array of floats standing alone may but needn't have braces. Some examples, in contexts where they might be used:
# Example 1: A gcl command to define a transform # called "fred" (read transform { transform define fred 1 0 0 0 0 1 0 0 0 0 1 0 -3 0 1 1 } )
# Example 2: A camera object using transform # "fred" for camera positioning # Given the definition above, this puts the camera at # (-3, 0, 1), looking toward -Z. { camera halfyfield 1 aspect 1.33 camtoworld { : fred } }
CamerasA camera object specifies the following properties of a camera:
The syntax for a camera is:
<camera> ::= [ "camera" ] (optional keyword) [ "{" ] (opening brace, generally required) [ "define" <name> ] "<" <filename> | ":" <name> | (or any number of the following, in any order...) "perspective" {"0" | "1"} (default 1) (otherwise orthographic) "stereo" {"0" | "1"} (default 0) (otherwise mono) "worldtocam" <transform> (see transform syntax above) "camtoworld" <transform> (no point in specifying both camtoworld and worldtocam; one is constrained to be the inverse of the other) "halfyfield" <half-linear-Y-field-at-unit-distance> (default tan 40/2 degrees) "fov" (angular field-of-view if perspective, linear field-of-view otherwise. Measured in whichever direction is smaller, given the aspect ratio. When aspect ratio changes -- e.g. when a window is reshaped -- "fov" is preserved.) "frameaspect" <aspect-ratio> (X/Y) (default 1.333) "near" <near-clipping-distance> (default 0.1) "far" <far-clipping-distance> (default 10.0) "focus" <focus-distance> (default 3.0) [ "}" ] (matching closebrace)
WindowA window object specifies size, position, and other window-system related information about a window in a device-independent way. The syntax for a window object is:
window ::= [ "window" ] (optional keyword) [ "{" ] (curly brace, often required) (any of the following, in any order) "size" <xsize> <ysize> (size of the window) "position" <xmin> <xmax> <ymin> <ymax> (position & size) "noborder" (specifies the window should have no window border) "pixelaspect" <aspect> (specifies the true visual aspect ratio of a pixel in this window in the sense xsize/ysize, normally 1.0. For stereo hardware which stretches the display vertically by a factor of 2, "pixelaspect 0.5" might do. The value is used when computing the projection of a camera associated with this window.) [ "}" ] (matching closebrace)
Window objects are used in the Geomview
|