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

 

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.

 

 

Putting Theory into Practice

 

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.

 

 

Controlling The Sprite

 

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.

 

 

Conclusion

 

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

h.s.fortuna@abertay.ac.uk