Original Post
Hi guys, new to OpenGL, REALLY new to using my own matrices in OpenGL, and I'm having problems getting my code to work. I have a feeling I'm making a false assumption somewhere in my logic, mostly because the tutorials I have spend a lot of time using the built in OpenGL functions, and no time showing how to use your own matrices other than giving the functions glLoadMatrixf() and glMultMatrixf(). In a nutshell, I have a cube object that contains its own matrix that when initialized starts off as the identity matrix. Every frame I load up this matrix using the glLoadMatrix() function and draw the object. When the user presses the up key I want the cube to rotate around the x axis by a specified number of degree/radians, so I create a rotation matrix and call a function from the cube object that multiplies and updates its matrix by the rotation matrix. My assumption is that the next frame when I the cube loads the new updated matrix the cube will have rotated. Nope, no rotation at all. Am I making a false assumption or does it sound like I'm missing some command somewhere? Before anyone asks why I'm doing it this way instead of using the prebuilt OpenGL rotation functions, its because I intend my project to have many of these cube objects. Each cube can be rotate independently from every other cube so I need each object to be able to keep track of its individual orientation and be able to rotate around an arbitrary axis by itself. Here are snippets of my code, anyone see anything amiss? From my main file: Then I call myCube.draw() every frame. Anyone see anything? First time ever using matrices this way, anything you could think of that I might have overlooked? When I debug I can clearly see that the cube matrix is updating when I push the up key, but still no rotation. [Edited by - pjyelton on May 13, 2008 3:25:05 PM]
class cube {
private:
float centerx, centery, centerz; // initial offset from origin
float width;
GLfloat matrix[16];
public:
cube(float, float, float, float);
void draw();
void rotate(float);
};
void cube::rotate(float xangle)
{
// create rotation matrix and multiply with cube matrix
GLfloat r[16] = {1.0f, 0, 0, 0,
0, cos(xangle), sin(xangle), 0,
0,-sin(xangle), cos(xangle), 0,
0, 0, 0, 1.0f};
GLfloat m[16]; // temporary matrix to store values from matrix multiplication
m[0]=matrix[0]*r[0]+matrix[4]*r[1]+matrix[8]*r[2]+matrix[12]*r[3];
m[1]=matrix[1]*r[0]+matrix[5]*r[1]+matrix[9]*r[2]+matrix[13]*r[3];
m[2]=matrix[2]*r[0]+matrix[6]*r[1]+matrix[10]*r[2]+matrix[14]*r[3];
m[3]=matrix[3]*r[0]+matrix[7]*r[1]+matrix[11]*r[2]+matrix[15]*r[3];
m[4]=matrix[0]*r[4]+matrix[4]*r[5]+matrix[8]*r[6]+matrix[12]*r[7];
m[5]=matrix[1]*r[4]+matrix[5]*r[5]+matrix[9]*r[6]+matrix[13]*r[7];
m[6]=matrix[2]*r[4]+matrix[6]*r[5]+matrix[10]*r[6]+matrix[14]*r[7];
m[7]=matrix[3]*r[4]+matrix[7]*r[5]+matrix[11]*r[6]+matrix[15]*r[7];
m[8]=matrix[0]*r[8]+matrix[4]*r[9]+matrix[8]*r[10]+matrix[12]*r[11];
m[9]=matrix[1]*r[8]+matrix[5]*r[9]+matrix[9]*r[10]+matrix[13]*r[11];
m[10]=matrix[2]*r[8]+matrix[6]*r[9]+matrix[10]*r[10]+matrix[14]*r[11];
m[11]=matrix[3]*r[8]+matrix[7]*r[9]+matrix[11]*r[10]+matrix[15]*r[11];
m[12]=matrix[0]*r[12]+matrix[4]*r[13]+matrix[8]*r[14]+matrix[12]*r[15];
m[13]=matrix[1]*r[12]+matrix[5]*r[13]+matrix[9]*r[14]+matrix[13]*r[15];
m[14]=matrix[2]*r[12]+matrix[6]*r[13]+matrix[10]*r[14]+matrix[14]*r[15];
m[15]=matrix[3]*r[12]+matrix[7]*r[13]+matrix[11]*r[14]+matrix[15]*r[15];
for ( int x=0; x<=16; x++) {
matrix[x] = m[x];
}
}
void cube::draw() {
glLoadMatrixf(matrix);
glTranslatef(0.0f,0.0f,-12.0f); // move back 12 units, otherwise can't see objects
glBegin(GL_QUADS);
glVertex3f(centerx-width/2.0f,centery+width/2.0f,centerz-width/2.0f);
glVertex3f(centerx+width/2.0f,centery+width/2.0f,centerz-width/2.0f);
glVertex3f(centerx+width/2.0f,centery-width/2.0f,centerz-width/2.0f);
glVertex3f(centerx-width/2.0f,centery-width/2.0f,centerz-width/2.0f);
glEnd();
// etc etc, 5 more sides are drawn the same as above
}
case WM_KEYDOWN:
switch ((int)wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_UP:
myCube.rotate(10.0f);
break;