Jump to content

  • Log In with Google      Sign In   
  • Create Account


Rotation of a 2D Object using Quaternions is deformed


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Danicco   Members   -  Reputation: 449

Like
0Likes
Like

Posted 24 August 2013 - 10:14 PM

I have an Orientation class with these functions:

void Orientation::AddRotation(float axisX, float axisY, float axisZ, float angleDegrees)
{
    float angleRadians = angleDegrees * PI / 180;
    float cAngle = cosf(angleRadians / 2);
    float sAngle = sinf(angleRadians / 2);
 
    Quaternion tRotation;
    tRotation.w = cAngle;
    tRotation.x = axisX * sAngle;
    tRotation.y = axisY * sAngle;
    tRotation.z = axisZ * sAngle;
   
   //rotation is a Quaternion member
    rotation = tRotation * rotation;
}
 
//This updates the Matrix4x4 member
void Orientation::UpdateMatrix()
{
    _matrix[0][0] = 1 - (2 * rotation.y * rotation.y) - (2 * rotation.z * rotation.z);
    _matrix[0][1] = (2 * rotation.x * rotation.y) - (2 * rotation.w * rotation.z);
    _matrix[0][2] = (2 * rotation.x * rotation.z) + (2 * rotation.w * rotation.y);
    _matrix[0][3] = 0;
 
    _matrix[1][0] = (2 * rotation.x * rotation.y) + (2 * rotation.w * rotation.z);
    _matrix[1][1] = 1 - (2 * rotation.x * rotation.x) - (2 * rotation.z * rotation.z);
    _matrix[1][2] = (2 * rotation.y * rotation.z) + (2 * rotation.w * rotation.x);
    _matrix[1][3] = 0;
 
    _matrix[2][0] = (2 * rotation.x * rotation.z) - (2 * rotation.w * rotation.y);
    _matrix[2][1] = (2 * rotation.y * rotation.z) - (2 * rotation.w * rotation.x);
    _matrix[2][2] = 1 - (2 * rotation.x * rotation.x) - (2 * rotation.y * rotation.y);
    _matrix[2][3] = 0;
 
    _matrix[3][0] = 0;
    _matrix[3][1] = 0;
    _matrix[3][2] = 0;
    _matrix[3][3] = 1;
}

Last time I tested it, it was working perfectly with 3Ds.

Now I'm adding some 2D planes to work as Sprites and trying to rotate them in the Z axis for W angles, but my Rect gets all deformed (flattened) and I can't figure why.

 

To create the Rect, I load an image, check it's width/height, figure the pixel size in vector coordinates, then create a new VBO with 4 vertexes and the size of the image.

 

The only difference in the shader program is that for 2Ds I multiply the gl_Position for the modelMatrix only, no View/Projection matrices.

 

When the rotation goes back to 180, it's size/ratio goes back to normal (perfectly rotated), so the problem is between 0 > X < 180 and 180 > X < 360.

 

What could be the problem?

 

Edit: After some tests, I figured it has to do with the screen ratio. Using a perfectly square screen, the image doesn't get deformed, so I must be missing something... after some more research, I found out that I need to multiply 2D objects by an "ortho" matrix (The tutorial I was reading from just had the vertexPositions), and after some more research how to generate my own ortho matrix... the image doesn't appear at all.

 

In my Draw function:

mat4 myProj = glm::ortho(0.0f, 1366.0f, 0.0f, 768.0f);
unsigned int projectionMatrixID = glGetUniformLocation(3, "projectionMatrix");

unsigned int modelMatrixID = glGetUniformLocation(3, "modelMatrix");
 


glUniformMatrix4fv(projectionMatrixID, 1, GL_FALSE, &myProj[0][0]);
glUniformMatrix4fv(modelMatrixID, 1, GL_FALSE, _orientation.GetMatrix()[0]);

 

And my vertex shader is:

gl_Position = projectionMatrix * modelMatrix * vec4(vertexPosition, 1);

 

For now modelMatrix is just an identity matrix, I also tried removing it (because I wasn't rotating it anymore) but the image isn't showing with just the ortho matrix.

How can I solve this?


Edited by Danicco, 24 August 2013 - 11:13 PM.


Sponsor:

#2 Danicco   Members   -  Reputation: 449

Like
0Likes
Like

Posted 25 August 2013 - 12:16 AM

After some tests, I figured it was the size of the shape I was drawing... it was so tiny it was a single pixel on screen... sigh.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS