Rotation of a 2D Object using Quaternions is deformed

Started by
0 comments, last by Danicco 10 years, 7 months ago

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?

Advertisement

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.

This topic is closed to new replies.

Advertisement