# OpenGL Issue using my first rotation matrix in OpenGL

This topic is 3722 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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?
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() {

glTranslatef(0.0f,0.0f,-12.0f); // move back 12 units, otherwise can't see objects
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
}

From my main file:
	case WM_KEYDOWN:
switch ((int)wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_UP:
myCube.rotate(10.0f);
break;


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]

##### Share on other sites
Nevermind, figured it out, I had my objects stored in a vector and silly me wasn't using pointers so the constructer kept resetting the matrix values every time I passed the vector to a function.

1. 1
2. 2
3. 3
Rutin
22
4. 4
JoeJ
16
5. 5

• 14
• 29
• 13
• 11
• 11
• ### Forum Statistics

• Total Topics
631774
• Total Posts
3002292
×