Next: camera, Previous: transform, Up: Non-geometric objects

Where – in the context of ND-viewing – a single (N+1)x(N+1) matrix is
expected – as in the `INST`

`ntransform`

field, or the
`ND-xform*`

(see GCL) commands – use an `ntransform`

object.

`ntransform`

are `NRows` x `NCols` transformation matrix
where usually `NRows` = `N+1` in the context of
`N`-dimensional objects and viewing. The homogeneous component of an
`ntransform`

sits at column zero (in contrast to ordinary
`transform`

objects where it is located at column
three). `ntransform`

objects operate on points of any dimension: if
a point is to be transformed by an `ntransform`

object and the
dimension of the point does not match the number of rows of the
`ntransform`

object, then either the point is implicitly padded
with zeros to match `NRows` or the matrix is implicitly padded with
ones down its diagonal (and zeros everywhere else) such that it will
operate as identity on the excess dimensions of the input point.

Syntax for an `ntransform`

object is

<ntransform> ::= [ "{" ] (curly brace, generally needed to make the end of the object unambiguous.) [ "ntransform" ] (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)NRowsNCols(number of rows and columns of the matrix, typicallyN+1N+1, but any dimensions are possible) <NRowsxNColsfloating-point numbers> (interpreted as aNRowsxNColshomogeneous transform given row by row, intended to apply to a row vector multiplied on its LEFT, so that e.g. Euclidean translations appear in thetoprow -- in contrast to the ordinary transform objects where the 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
necessarily essential, so e.g. two integers – `NRows` `NCols`
– followed by a `NRows` x `NCols` 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`6x6`

transform called # "fred", a mere translation by the vector`-3 0 1 1 0`

. This # transform is meant for a five dimensional space, with an homogeneous # component a index zero. (read ntransform { ntransform define fred 6 6 1 -3 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 } )

# Example 2: Set the ND-xform of an object -- a geometry or a camera # cluster. Given the definition above, this puts the object at (-3 0 1 1 # 0) in the five dimensional space. (ND-xform-set focus : fred) # or (ND-xform-set g1 : fred)