PDA

View Full Version : Matrix Math



BwB
08-12-2000, 12:16 AM
Since I was able to get excellent help ealier in less that a half an hour I figure I'll post another question http://www.opengl.org/discussion_boards/ubb/smile.gif This ones a bit longer, I've tried to provided only the code that is required:

Can somebody please explain to me whats wrong here?
And I know its not the DEG_TO_RAD stuff, the equation is right, and I tried it without it too.


/////////////////////////////////////////////////////////////////////
#include <math.h>

#define _Z_DEG_TO_RAD ( 0.017453292519943295474371680597869271878)
#define Z_DEG_TO_RAD(d) ((d) * _Z_DEG_TO_RAD)

typedef GLfloat zfloat;
typedef GLint zint;
/////////////////////////////////////////////////////////////////////
// Matrix structure
//
class ZMatrix
{
public:
zfloat m[16];

// Constructor
ZMatrix()
{ LoadIdentity(); }

// Allow array-like interface to OpenGL's backwards matrices
inline zfloat&At(zint row, zint col)
{ return (m[col * 4 + row ]); }

// Load the Identity matrix
inline LoadIdentity()
{ m[0] = m[5] = m[10] = m[15] = 1.0;
m[1] = m[2] = m[3] =
m[4] = m[6] = m[7] =
m[8] = m[9] = m[11] =
m[12] = m[13] = m[14] = 0.0; }

inline RotateX(zfloat x)
{
LoadIdentity();
At(2,2) = At(3,3) = cos( Z_DEG_TO_RAD(x) );
At(2,3) = sin( Z_DEG_TO_RAD(x) );
At(3,2) = -sin( Z_DEG_TO_RAD(x) );
}

inline glMultMatrix()
{ glMultMatrixf( m ); }

};
//
/////////////////////////////////////////////////////////////////////

zfloat xoff = (offset controlled by keypresses);
zfloat yaw = (angle controlled by keypresses);


In my render loop I had:

glPushMatrix();
glTranslatef( 0.0, 0.0, xoff );
glRotatef( yaw, 0.0, 1.0, 0.0 );
glTranslatef( -4096.0, -768.0, 4596.0 );
glRotatef( -90.0, 1.0, 0.0, 0.0 );

Which kinda sorta worked... at least well enough for me to see and move around. If I replace the above with:

glPushMatrix();
glTranslatef( 0.0, 0.0, xoff );
glRotatef( yaw, 0.0, 1.0, 0.0 );
glTranslatef( -4096.0, -768.0, 4596.0 );
ZMatrix mat;
mat.RotateX( -90.0 );
mat.glMultMatrix();

Everything goes berserk!

Bob
08-12-2000, 02:09 AM
Yepp, a locical error...

The error is in you function At(row, col). Remember that the first row (aswell as first column too) in you matrix is 0 (zero), and not 1 (one). So by doing At(2,2)=cos(x) means you set third row in the third column to cos(x), when you intend to set second row in second column. Just have a look at how it works, if you pass At(3,3), it will return the address to m[3*4 + 3], which equals m[15], which in turn is the last (row 4, col 4) cell in your matrix. Either change all At()-calls by decreasing all arguments by one, or change the function to automativcally decrease row and col by one before returning the address.

BwB
08-12-2000, 03:31 AM
Doh!! Thank you very much, I should have been able to figure that one out http://www.opengl.org/discussion_boards/ubb/smile.gif