Skip to main content
GameDev.net gamedev.net
🔒 Locked

Issue using my first rotation matrix in OpenGL

Started by pjyelton May 13, 2008 at 12:32 PM 0 replies 2.1k views
Original Post
pjyelton
pjyelton
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() {

	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
}
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]
pjyelton
pjyelton
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.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.