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.**