Jump to content
  • Advertisement
Sign in to follow this  
Danicco

Rotation of a 2D Object using Quaternions is deformed

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

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

Share this post


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

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!