Jump to content
  • Advertisement
Sign in to follow this  
fooman_69

Z rotation issue

This topic is 4799 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

hiya, When I attempt to rotate a quad on it's z-axis using glRotate3f() I get odd results. Instead of rotation on it's axis as if it was on a fan, as described in NeHe's tuts, it rotates on a BIG arc. Am I missing a call somewhere that may be causing this problem? Here is some code...
//Draw arm of player who is throwing
	float p1_x = ent1->GetMapX();
	float p1_y = ent1->GetMapY();
	float p2_x = ent2->GetMapX();
	float p2_y = ent2->GetMapY();
	glLoadIdentity();
	glBindTexture(GL_TEXTURE_2D, g_textureID[ent1->GetTextureID()]);
	switch(turn)
	{
	case PLAYER1_TURN:
		glRotatef((float)ent1->GetAngle(), 0.0f, 0.0f, 1.0f);
		glBegin(GL_QUADS);
			glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 6);		glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE));							// Bottom Left Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 6);		glVertex2f((float)(p1_x * TILE_SIZE + TILE_SIZE), (float)(p1_y * TILE_SIZE));				// Bottom Right Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 7);		glVertex2f((float)(p1_x * TILE_SIZE+ TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE));	// Top Right Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 7);		glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE));				// Top left of the texture and quad
		glEnd();
		break;
	case PLAYER2_TURN:
		glRotatef((float)ent1->GetAngle(), 0.0f, 0.0f, 1.0f);
		glBegin(GL_QUADS);
			glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 6);		glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE));							// Bottom Left Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 6);		glVertex2f((float)(p1_x * TILE_SIZE + TILE_SIZE), (float)(p1_y * TILE_SIZE));				// Bottom Right Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 7);		glVertex2f((float)(p1_x * TILE_SIZE+ TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE));	// Top Right Of The Texture and Quad
			glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 7);		glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE));				// Top left of the texture and quad
		glEnd();
		break;
	}

Now the angle would be the angle that is currently set for the quad to rotate on (obviously). I have set the MODELVIEW_MATRIX about this im my app as well. Anything I am missing? [edit]Also, when rotating a quad or shape, if I rotate based on a variable I have initialized to 45 degrees will the quad change positions in it's axis everytime I call Render()? Or will it be always just the quad shown the same way everytime without changing position?? I'm not sure I totally understand how glRotate is used.

Share this post


Link to post
Share on other sites
Advertisement

I *believe* it's because of the way you're specifying the tiles. I'm not positive (a bit rusty), but I believe you should be:

1) glTranslate
2) glRotate
3) draw the polygon at the origin

The translation and rotation in that order should position it and rotate it correctly. I *think*.

Share this post


Link to post
Share on other sites
I think I am rendering things incorrectly. This is my rendering code:
void Video::Render(HDC &hDC, Entity *ent1, Entity *ent2, Sprite *map[3][MAP_HEIGHT][MAP_WIDTH], int turn)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);

if(g_bBlendOutColorKey == true)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

//Tile the sky
glBindTexture(GL_TEXTURE_2D, g_textureID[2]);
for(int y = 0; y < MAP_HEIGHT; y++)
{
for(int x = 0; x < MAP_WIDTH; x++)
{
if(map[0][y][x] != NULL)
{
glBegin(GL_QUADS);
glTexCoord2f((float)map[0][y][x]->left, (float)map[0][y][x]->bottom); glVertex2f((float)(x * TILE_SIZE), (float)(y * TILE_SIZE + TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f((float)map[0][y][x]->right, (float)map[0][y][x]->bottom); glVertex2f((float)(x * TILE_SIZE + TILE_SIZE), (float)(y * TILE_SIZE + TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f((float)map[0][y][x]->right, (float)map[0][y][x]->top); glVertex2f((float)(x * TILE_SIZE + TILE_SIZE), (float)(y * TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f((float)map[0][y][x]->left, (float)map[0][y][x]->top); glVertex2f((float)(x * TILE_SIZE), (float)(y * TILE_SIZE)); // Top left of the texture and quad
glEnd();
}
}
}

//Tile the buildings
glBindTexture(GL_TEXTURE_2D, g_textureID[1]);
for(int y = 0; y < MAP_HEIGHT; y++)
{
for(int x = 0; x < MAP_WIDTH; x++)
{
if(map[1][y][x] != NULL)
{
glBegin(GL_QUADS);
glTexCoord2f((float)map[1][y][x]->left, (float)map[1][y][x]->bottom); glVertex2f((float)(x * TILE_SIZE), (float)(y * TILE_SIZE + TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f((float)map[1][y][x]->right, (float)map[1][y][x]->bottom); glVertex2f((float)(x * TILE_SIZE + TILE_SIZE), (float)(y * TILE_SIZE + TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f((float)map[1][y][x]->right, (float)map[1][y][x]->top); glVertex2f((float)(x * TILE_SIZE + TILE_SIZE), (float)(y * TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f((float)map[1][y][x]->left, (float)map[1][y][x]->top); glVertex2f((float)(x * TILE_SIZE), (float)(y * TILE_SIZE)); // Top left of the texture and quad
glEnd();
}
}
}

//Draw arm of player who is throwing
float p1_x = ent1->GetMapX();
float p1_y = ent1->GetMapY();
float p2_x = ent2->GetMapX();
float p2_y = ent2->GetMapY();
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, g_textureID[ent1->GetTextureID()]);
switch(turn)
{
case PLAYER1_TURN:
glRotatef((float)ent1->GetAngle(), 0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 6); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 6); glVertex2f((float)(p1_x * TILE_SIZE + TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 7); glVertex2f((float)(p1_x * TILE_SIZE+ TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 7); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top left of the texture and quad
glEnd();
break;
case PLAYER2_TURN:
glRotatef((float)ent1->GetAngle(), 0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 6); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 6); glVertex2f((float)(p1_x * TILE_SIZE + TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 3, SPRITE_SIZE * 7); glVertex2f((float)(p1_x * TILE_SIZE+ TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f(SPRITE_SIZE * 2, SPRITE_SIZE * 7); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top left of the texture and quad
glEnd();
break;
}

//Draw players
glLoadIdentity();
glBegin(GL_QUADS);
//player 1
glTexCoord2f(ent1->GetImage().left, ent1->GetImage().bottom); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f(ent1->GetImage().right, ent1->GetImage().bottom); glVertex2f((float)(p1_x * TILE_SIZE + TILE_SIZE), (float)(p1_y * TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f(ent1->GetImage().right, ent1->GetImage().top); glVertex2f((float)(p1_x * TILE_SIZE+ TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f(ent1->GetImage().left, ent1->GetImage().top); glVertex2f((float)(p1_x * TILE_SIZE), (float)(p1_y * TILE_SIZE - TILE_SIZE)); // Top left of the texture and quad

//player 2
glTexCoord2f(ent2->GetImage().left, ent2->GetImage().bottom); glVertex2f((float)(p2_x * TILE_SIZE), (float)(p2_y * TILE_SIZE)); // Bottom Left Of The Texture and Quad
glTexCoord2f(ent2->GetImage().right, ent2->GetImage().bottom); glVertex2f((float)(p2_x * TILE_SIZE + TILE_SIZE), (float)(p2_y * TILE_SIZE)); // Bottom Right Of The Texture and Quad
glTexCoord2f(ent2->GetImage().right, ent2->GetImage().top); glVertex2f((float)(p2_x * TILE_SIZE+ TILE_SIZE), (float)(p2_y * TILE_SIZE - TILE_SIZE)); // Top Right Of The Texture and Quad
glTexCoord2f(ent2->GetImage().left, ent2->GetImage().top); glVertex2f((float)(p2_x * TILE_SIZE), (float)(p2_y * TILE_SIZE - TILE_SIZE)); // Top left of the texture and quad
glEnd();

glDisable(GL_TEXTURE_2D);

//Put Scores on screen
glBindTexture(GL_TEXTURE_2D, g_textureID[3]);
PrintGL(20, 420, 1, "Player 1");
glBindTexture(GL_TEXTURE_2D, g_textureID[3]);
PrintGL(480, 420, 1, "Player 2");

glDisable(GL_BLEND);
SwapBuffers(hDC);
}
Should I be using glTranslate3f() instead of the way I am using glVertext() calls?

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!