plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

matrix.3 (6089B)


      1 .TH MATRIX 3
      2 .SH NAME
      3 ident, matmul, matmulr, determinant, adjoint, invertmat, xformpoint, xformpointd, xformplane, pushmat, popmat, rot, qrot, scale, move, xform, ixform, persp, look, viewport \- Geometric transformations
      4 .SH SYNOPSIS
      5 .PP
      6 .B
      7 #include <draw.h>
      8 .PP
      9 .B
     10 #include <geometry.h>
     11 .PP
     12 .B
     13 void ident(Matrix m)
     14 .PP
     15 .B
     16 void matmul(Matrix a, Matrix b)
     17 .PP
     18 .B
     19 void matmulr(Matrix a, Matrix b)
     20 .PP
     21 .B
     22 double determinant(Matrix m)
     23 .PP
     24 .B
     25 void adjoint(Matrix m, Matrix madj)
     26 .PP
     27 .B
     28 double invertmat(Matrix m, Matrix inv)
     29 .PP
     30 .B
     31 Point3 xformpoint(Point3 p, Space *to, Space *from)
     32 .PP
     33 .B
     34 Point3 xformpointd(Point3 p, Space *to, Space *from)
     35 .PP
     36 .B
     37 Point3 xformplane(Point3 p, Space *to, Space *from)
     38 .PP
     39 .B
     40 Space *pushmat(Space *t)
     41 .PP
     42 .B
     43 Space *popmat(Space *t)
     44 .PP
     45 .B
     46 void rot(Space *t, double theta, int axis)
     47 .PP
     48 .B
     49 void qrot(Space *t, Quaternion q)
     50 .PP
     51 .B
     52 void scale(Space *t, double x, double y, double z)
     53 .PP
     54 .B
     55 void move(Space *t, double x, double y, double z)
     56 .PP
     57 .B
     58 void xform(Space *t, Matrix m)
     59 .PP
     60 .B
     61 void ixform(Space *t, Matrix m, Matrix inv)
     62 .PP
     63 .B
     64 int persp(Space *t, double fov, double n, double f)
     65 .PP
     66 .B
     67 void look(Space *t, Point3 eye, Point3 look, Point3 up)
     68 .PP
     69 .B
     70 void viewport(Space *t, Rectangle r, double aspect)
     71 .SH DESCRIPTION
     72 These routines manipulate 3-space affine and projective transformations,
     73 represented as 4\(mu4 matrices, thus:
     74 .IP
     75 .EX
     76 .ta 6n
     77 typedef double Matrix[4][4];
     78 .EE
     79 .PP
     80 .I Ident
     81 stores an identity matrix in its argument.
     82 .I Matmul
     83 stores
     84 .I a\(mub
     85 in
     86 .IR a .
     87 .I Matmulr
     88 stores
     89 .I b\(mua
     90 in
     91 .IR b .
     92 .I Determinant
     93 returns the determinant of matrix
     94 .IR m .
     95 .I Adjoint
     96 stores the adjoint (matrix of cofactors) of
     97 .I m
     98 in
     99 .IR madj .
    100 .I Invertmat
    101 stores the inverse of matrix
    102 .I m
    103 in
    104 .IR minv ,
    105 returning
    106 .IR m 's
    107 determinant.
    108 Should
    109 .I m
    110 be singular (determinant zero),
    111 .I invertmat
    112 stores its
    113 adjoint in
    114 .IR minv .
    115 .PP
    116 The rest of the routines described here
    117 manipulate
    118 .I Spaces
    119 and transform
    120 .IR Point3s .
    121 A
    122 .I Point3
    123 is a point in three-space, represented by its
    124 homogeneous coordinates:
    125 .IP
    126 .EX
    127 typedef struct Point3 Point3;
    128 struct Point3{
    129 	double x, y, z, w;
    130 };
    131 .EE
    132 .PP
    133 The homogeneous coordinates
    134 .RI ( x ,
    135 .IR y ,
    136 .IR z ,
    137 .IR w )
    138 represent the Euclidean point
    139 .RI ( x / w ,
    140 .IR y / w ,
    141 .IR z / w )
    142 if
    143 .IR w ≠0,
    144 and a ``point at infinity'' if
    145 .IR w =0.
    146 .PP
    147 A
    148 .I Space
    149 is just a data structure describing a coordinate system:
    150 .IP
    151 .EX
    152 typedef struct Space Space;
    153 struct Space{
    154 	Matrix t;
    155 	Matrix tinv;
    156 	Space *next;
    157 };
    158 .EE
    159 .PP
    160 It contains a pair of transformation matrices and a pointer
    161 to the
    162 .IR Space 's
    163 parent.  The matrices transform points to and from the ``root
    164 coordinate system,'' which is represented by a null
    165 .I Space
    166 pointer.
    167 .PP
    168 .I Pushmat
    169 creates a new
    170 .IR Space .
    171 Its argument is a pointer to the parent space.  Its result
    172 is a newly allocated copy of the parent, but with its
    173 .B next
    174 pointer pointing at the parent.
    175 .I Popmat
    176 discards the
    177 .B Space
    178 that is its argument, returning a pointer to the stack.
    179 Nominally, these two functions define a stack of transformations,
    180 but
    181 .B pushmat
    182 can be called multiple times
    183 on the same
    184 .B Space
    185 multiple times, creating a transformation tree.
    186 .PP
    187 .I Xformpoint
    188 and
    189 .I Xformpointd
    190 both transform points from the
    191 .B Space
    192 pointed to by
    193 .I from
    194 to the space pointed to by
    195 .IR to .
    196 Either pointer may be null, indicating the root coordinate system.
    197 The difference between the two functions is that
    198 .B xformpointd
    199 divides
    200 .IR x ,
    201 .IR y ,
    202 .IR z ,
    203 and
    204 .I w
    205 by
    206 .IR w ,
    207 if
    208 .IR w ≠0,
    209 making
    210 .RI ( x ,
    211 .IR y ,
    212 .IR z )
    213 the Euclidean coordinates of the point.
    214 .PP
    215 .I Xformplane
    216 transforms planes or normal vectors.  A plane is specified by the
    217 coefficients
    218 .RI ( a ,
    219 .IR b ,
    220 .IR c ,
    221 .IR d )
    222 of its implicit equation
    223 .IR ax+by+cz+d =0.
    224 Since this representation is dual to the homogeneous representation of points,
    225 .B libgeometry
    226 represents planes by
    227 .B Point3
    228 structures, with
    229 .RI ( a ,
    230 .IR b ,
    231 .IR c ,
    232 .IR d )
    233 stored in
    234 .RI ( x ,
    235 .IR y ,
    236 .IR z ,
    237 .IR w ).
    238 .PP
    239 The remaining functions transform the coordinate system represented
    240 by a
    241 .BR Space .
    242 Their
    243 .B Space *
    244 argument must be non-null \(em you can't modify the root
    245 .BR Space .
    246 .I Rot
    247 rotates by angle
    248 .I theta
    249 (in radians) about the given
    250 .IR axis ,
    251 which must be one of
    252 .BR XAXIS ,
    253 .B YAXIS
    254 or
    255 .BR ZAXIS .
    256 .I Qrot
    257 transforms by a rotation about an arbitrary axis, specified by
    258 .B Quaternion
    259 .IR q .
    260 .PP
    261 .I Scale
    262 scales the coordinate system by the given scale factors in the directions of the three axes.
    263 .IB Move
    264 translates by the given displacement in the three axial directions.
    265 .PP
    266 .I Xform
    267 transforms the coordinate system by the given
    268 .BR Matrix .
    269 If the matrix's inverse is known
    270 .I a
    271 .IR priori ,
    272 calling
    273 .I ixform
    274 will save the work of recomputing it.
    275 .PP
    276 .I Persp
    277 does a perspective transformation.
    278 The transformation maps the frustum with apex at the origin,
    279 central axis down the positive
    280 .I y
    281 axis, and apex angle
    282 .I fov
    283 and clipping planes
    284 .IR y = n
    285 and
    286 .IR y = f
    287 into the double-unit cube.
    288 The plane
    289 .IR y = n
    290 maps to
    291 .IR y '=-1,
    292 .IR y = f
    293 maps to
    294 .IR y '=1.
    295 .PP
    296 .I Look
    297 does a view-pointing transformation.  The
    298 .B eye
    299 point is moved to the origin.
    300 The line through the
    301 .I eye
    302 and
    303 .I look
    304 points is aligned with the y axis,
    305 and the plane containing the
    306 .BR eye ,
    307 .B look
    308 and
    309 .B up
    310 points is rotated into the
    311 .IR x - y
    312 plane.
    313 .PP
    314 .I Viewport
    315 maps the unit-cube window into the given screen viewport.
    316 The viewport rectangle
    317 .I r
    318 has
    319 .IB r .min
    320 at the top left-hand corner, and
    321 .IB r .max
    322 just outside the lower right-hand corner.
    323 Argument
    324 .I aspect
    325 is the aspect ratio
    326 .RI ( dx / dy )
    327 of the viewport's pixels (not of the whole viewport).
    328 The whole window is transformed to fit centered inside the viewport with equal
    329 slop on either top and bottom or left and right, depending on the viewport's
    330 aspect ratio.
    331 The window is viewed down the
    332 .I y
    333 axis, with
    334 .I x
    335 to the left and
    336 .I z
    337 up.  The viewport
    338 has
    339 .I x
    340 increasing to the right and
    341 .I y
    342 increasing down.  The window's
    343 .I y
    344 coordinates are mapped, unchanged, into the viewport's
    345 .I z
    346 coordinates.
    347 .SH SOURCE
    348 .B \*9/src/libgeometry/matrix.c
    349 .SH "SEE ALSO
    350 .MR arith3 (3)