Go to the first, previous, next, last section, table of contents.

### Transform Objects

Where a single 4x4 matrix is expected -- as in the `INST` `transform` field, the camera's `camtoworld` transform and the Geomview `xform*` commands -- use a transform object.

Note that a transform is distinct from a `TLIST`, which is a type of geometry. `TLIST`s can contain one or more 4x4 transformations; "transform" objects must have exactly one.

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 }
    }

Go to the first, previous, next, last section, table of contents.