• Create Account

Banner advertising on our site currently available from just \$5!

### #ActualDanicco

Posted 24 August 2013 - 11:13 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;
}

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]);



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?

### #1Danicco

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;
}

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?

PARTNERS