PS2 Linux Programming
Understanding The World Matrix
Introduction
Controlling the movement
of objects in 2 and 3 dimensions stems from an understanding of the world
transformation matrix. In this tutorial the component parts of the world
transformation matrix will be investigated and the world transformation matrix
will be used to move and manipulate a sprite in three dimensions.
The world transformation
matrix used for three dimensional graphics is a 4x4 matrix of the form shown
below.
This matrix is used to
position and orientate an object in world space. To put this another way, the
world transformation matrix transforms the coordinates of the model from local
(or model) space to world space.
As can be seen from the
matrix layout given above, the world matrix can be considered to be constructed
from three parts, a 3x3 matrix:
which is mainly associated
with the orientation or rotation of the object, a 3x1 matrix:
which is associated with
the position of the object in world space, and a bottom row which is always
(0001) under normal circumstances.
The translational part is
relatively straightforward, it represents the position of the model in the
world at the coordinates (Tx, Ty, Tz).
For the purposes of this
discussion, the 3x3 matrix part of the world matrix will be considered to be a
pure rotation matrix. A pure rotation matrix has some very special properties
and in mathematics it is called an orthogonal matrix. An orthogonal matrix (A)
has some very interesting properties which are very useful for use in computer graphics and games
programming. Some of the properties of an orthogonal matrix are:
1. Multiplying an
orthogonal matrix by it’s transpose gives the identity matrix.
2. The length of the
vector produced from each column of an orthogonal matrix is unity or 1.
3. The directions of the
vectors that represent the columns of an orthogonal matrix are all mutually
perpendicular.
4. The columns of an
orthogonal matrix represent the unit (or directional) vectors of the axes of
the object when placed in world space.
Properties 1, 2 and 3 are
useful for verifying that a matrix is a rotation matrix but it is property 4
that is of most use to games programmers. Property 4 is useful for forward
motion. If the object is moved in the direction of the vector defined by the
first column of the matrix then the object will move in the direction that it’s
local x axis is pointing. If the object is moved in the direction of the vector
defined by the second column of the matrix then the object will move in the
direction that it’s local y axis is pointing. If the object is moved in the
direction of the vector defined by the third column of the matrix then the
object will move in the direction that it’s local z axis is pointing.
Now, suppose that in the
writing of a game, an object is situated in a 3D world and is facing some
random direction, and the object must be moved straight ahead in the direction
it is pointing (such as controlling the movement of a car in a racing game, or
the motion of an aeroplane in a flight simulator), then how is this done? The
answer lies in the columns of the rotation matrix. To move the object in the
direction that it’s x axis is pointing, a factor (n) of the first column of the
rotation matrix is added to the translation part of the world matrix as
illustrated below.
That is all there is to
it! There is no need to calculate angles or even know what they are –
everything that needs to be known is contained in the world matrix. It is
possible to move forward/backwards by simply applying the above relationship.
Similarly, in order to move to the right or left (strafe or y-axis) the values
in the second column can be used and to move up or down (z axis) the values in
the third column can be used.
The code in the project
accompanying this tutorial illustrated the techniques introduced above. Even
although the sprite is a flat textured quad, all of the movement
characteristics found in 3D games can be demonstrated and observed. The
function to move the sprite in the direction of it’s local axis is:
void
MoveSprite(PS2Sprite_t * pSP, float Delta, int Axis)
{
//this moves the sprite along its local "Axis" axis
// by an amount Delta
pSP->Pos.v[0] += pSP->World.m[0][Axis]* Delta;
pSP->Pos.v[1] += pSP->World.m[1][Axis]* Delta;
pSP->Pos.v[2] += pSP->World.m[2][Axis]* Delta;
}
The axis of motion (Axis)
is passed into the function this being either 0, 1, or 2. A pointer to the
sprite to be manipulated is also passed along with the factor (Delta) by which
the sprite is to be advanced. It can be seen that the position vector of the
sprite is updated by the appropriately selected vector.
Within the sprite
structure there are variables RotX, RotY and RotZ to hold the rotation angle of
the sprite round all of the three axes. In the file packet.cpp, BuildSprite2D()
uses the function RotMatrix() to build a rotation matrix from the three
rotation angles. Once the translation components of the sprite are added, this
matrix is applied to the untransformed coordinates of the sprite to generate
the positions of all four vertices of the sprite in world space. The GS packet
is constructed from this vertex data as in previous tutorials.
On running the program the
sprite is drawn on screen as an animated character which walks around the
screen under control of the user. The rotation of the sprite is controlled with
the left hand side of the controller: left and right control rotation round the
local z axis, up and down control rotation round the local y axis and L1 and L2
control rotation round the local x axis. The translation of the sprite is
controlled with the right hand half of the controller: the circle and square
control movement in the local x axis, the triangle and cross control movement
in the local y axis and R1 and R2 control movement in the local z axis. Full
information on controlling the character is contained within the accompanying
readme file.
This tutorial has outlined
the significant properties of the world transformation matrix which are
important to the programming of computer games. It has been shown how the world
transformation matrix can be used to control object movement within both 2 and
3 dimensional computer games.
Dr Henry S Fortuna
University of Abertay
Dundee