Sign in to follow this  
Photon Man

Rotation & Translation on Textured Quads

Recommended Posts

Photon Man    150
I have a textured quad, (obviously four vertexes, one for each corner) that I want rotated. I already have a function that spins the quad by its center axis, but every time (while it is rotating) I try to translate it, it either shrinks or grows in size! So I need a math function that takes each of the four vertexes, (say you know the x, y, width, and height) and translates it, while rotating by its center axis. (Or simply, Moves the rotating quad without size or weird errors.) Thanks! Note: I'm using DX 9.0, and defined the vertexes like this:
   
      // the top left vertex       // the top right vertex
      vertex[0].x        /*&*/      vertex[1].width

      // the bottom left vertex       // the bottom right vertex
      vertex[2].y        /*&*/      vertex[3].height


///// What the Texture quads look like in action
//
//    0--------1
//    |       /|
//    |      / |  
//    |     /  | 
//    |    #   |  
//    |   /    |
//    |  /     |         
//    | /      |      
//    2--------3
//
//    # = Center Axis

///// This is the desired result
//
//   x = 0                          x = 100
//   y = 0                to        y = 0
//   rot = 20;//degrees             rot = 0;
//
//   0--------1                  0--------1
//   \       | \                 |       /|
//    \      |  \                |      / |  
//     \     |   \      ->       |     /  | 
//      \    #    \              |    #   |  
//       \   |     \             |   /    |
//        \  |      \            |  /     |         
//         \ |       \           | /      |      
//          2--------3           2--------3
//

Share this post


Link to post
Share on other sites
Sneftel    1788
Wait... do you want rotation, or shear? What you're showing there is shear.

Assuming it's the picture that's off and you do want rotation, multiplying each vertex by a rotation matrix should be sufficient. If you're having problems with that, you should post your code.

Share this post


Link to post
Share on other sites
Photon Man    150

//
// x = 0 x = 100
// y = 0 to y = 0
// rot = 20;//degrees rot = 0;
//
// ----1 0--------1
// 0---- | \ | /|
// \ | \ | / |
// \ | \ -> | / |
// \ # \ | # |
// \ | \ | / |
// \ | \ | / |
// \ | \ | / |
// \| ----3 2--------3
// 2----

// New code //

// Rotate the vertexes individualy
for (int curr_vert = 0; curr_vert < 4; ++curr_vert)
{
float xr = 0;
float yr = 0;


// perform rotation
xr = (float)vertices[curr_vert].x * cos(rotate) -
(float)vertices[curr_vert].y * sin(rotate);

yr = (float)vertices[curr_vert].x * sin(rotate) +
(float)vertices[curr_vert].y * cos(rotate);


vertices[curr_vert].x = xr;
vertices[curr_vert].y = yr;


} // end for curr_vert



Every time I put this it rotates with x = 0 & y = 0 as the axis. How do I get the axis in the center? (obviously I use the width, and height, but I can't seem to find where to put them in the code above.)

Share this post


Link to post
Share on other sites
Sneftel    1788
Easiest way is to subtract the center from the vertices first, then add it back afterward. Alternatively you can multiply the transformation matrices together and multiply the vertices by the resultant matrix, but that's trickier to do if you aren't actually using a vector math library.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this