Jump to content
  • Advertisement
Sign in to follow this  
pjyelton

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.

If you intended to correct an error in the post then please contact us.

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

	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]

Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!