Game Development Reference

In-Depth Information

When implemented, the 3

3 version, including rotation, looks like this:

Excerpt from include/cyclone/core.h

×

/**

* Holds an inertia tensor, consisting of a 3x3 row-major matrix.

* This matrix is not padding to produce an aligned structure, since

* it is most commonly used with a mass (single real) and two

* damping coefficients to make the 12-element characteristics array

* of a rigid body.

*/

class Matrix3

// ... Other Matrix3 code as before ...

/**

* Sets this matrix to be the rotation matrix corresponding to

* the given quaternion.

*/

void setOrientation(const Quaternion &q)

{

data[0] = 1 - (2*q.j*q.j + 2*q.k*q.k);

data[1] = 2*q.i*q.j + 2*q.k*q.r;

data[2] = 2*q.i*q.k - 2*q.j*q.r;

data[3] = 2*q.i*q.j - 2*q.k*q.r;

data[4] = 1 - (2*q.i*q.i + 2*q.k*q.k);

data[5] = 2*q.j*q.k + 2*q.i*q.r;

data[6] = 2*q.i*q.k + 2*q.j*q.r;

data[7] = 2*q.j*q.k - 2*q.i*q.r;

data[8] = 1 - (2*q.i*q.i + 2*q.j*q.j);

}

};

The 3

×

4 version, adding position to the rotation, looks like this:

Excerpt from include/cyclone/core.h

/**

* Holds a transform matrix, consisting of a rotation matrix and

* a position. The matrix has 12 elements; it is assumed that the

* remaining four are (0,0,0,1), producing a homogenous matrix.

*/

class Matrix4

{

// ... Other Matrix4 code as before ...

/**

* Sets this matrix to be the rotation matrix corresponding to