Note

Currently this feature applies only to particle effects, using the transform var.

Normally icons in BYOND can only be transformed in 2D, using a simple 3x3 matrix. This is represented by the /matrix object, which cuts off the last column because it isn’t used. However particles can have coordinates in x, y, and z, and the whole particle set can be given a transformation matrix that handles all three dimensions.

Simple 2D transforms

The easiest transformation for particles is a simple 2D one, which you can do by setting the particle datum’s transform var to a /matrix object.

a d 0
x y 1  *  b e 0  =  x' y' 1
          c f 1

When an x,y point is multiplied by the matrix, it becomes the new point x’,y’. This is equivalent to:

x' = a*x + b*y + c
y' = d*x + e*y + f

This is called an affine transform because all the operations are “linear” in math terms. (That is, every term in the formula above has a single variable, not raised to a higher power than 1.)

3x4 matrix (x,y,z with translation)

3D affine transforms of this type are also affine transformations. There is no special object for this so a list is used (see below).

xx xy xz 0
x y z 1  *  yx yy yz 0  =  x' y' z' 1
            zx zy zz 0
            cx cy cz 1

The way to read the vars above is that the first letter says what input component is being transformed (x,y,z, or c for “constant”), and the second letter is the output component.

x' = xx*x + yx*y + zx*z + cx
y' = xy*x + yy*y + zy*z + cy
z' = xz*x + yz*y + zz*z + cz

To use this kind of matrix, you can cut off the 4th column and provide the values in a list form, in row-major order:

list(xx,xy,xz, yx,yy,yz, zx,zy,zz, cx,cy,cz)

Note the 4th row is also optional.

4x4 matrix (x,y,z,w with projection)

This is the most interesting matrix, since if you use all 4 columns you’re actually altering an “axis” called w. This isn’t a real axis, but is just a number that the resulting vector will be divided by.

xx xy xz xw
x y z 1  *  yx yy yz yw  =  x'w' y'w' z'w' w'
            zx zy zz zw
            wx wy wz ww

w' = xw*x + yw*y + zw*z + ww
x' = (xx*x + yx*y + zx*z + wx) / w'
y' = (xy*x + yy*y + zy*z + wy) / w'
z' = (xz*x + yz*y + zz*z + wz) / w'

In a regular affine transform, w always stays at 1. In projection you can think of w as a distance from the “camera”. 1 is where objects are their “normal” size. If you make the z value affect w’ by setting zw, you basically make an object look smaller at higher z values.

This is a simple projection matrix where x,y,z are left untouched, but there’s a projection effect. The “D” value is how far away the “camera” is from z=0, so a point at z=D looks like it’s twice as far away.

1  0  0  0
0  1  0  0
0  0  1  1/D
0  0  0  1

This 4x4 matrix is handled as a list just like the 3x4 affine matrix:

list(xx,xy,xz,xw, yx,yy,yz,yw, zx,zy,zz,zw, wx,wy,wz,ww)

See also