I have issues bringing rotations into my app. I want to rotate a sprite around its center, consisting of 2 Polygons.
My Setup:
I set the projection matrix in the shader. I want to do the rotation on the cpu using glm. Otherwise I won’t be able to batch every sprite that needs rotation.
My approach:
f32 x_origin = position.x - size.x / 2;
f32 y_origin = position.y - size.y / 2;
x = ((pos.x - x_origin) * cos(angle)) - ((y_origin - pos.y) * sin(angle))
y = ((y_origin - pos.y) * cos(angle)) - ((pos.x - x_origin) * sin(angle))
But the sprite just vanishes from the screen.
Can someone help me understanding this?
I have updated my code:
for ( int i=0; i < 6; i++ )
{
f32 x_origin = m_vertices[i].x - m_size.x / 2;
f32 y_origin = m_vertices[i].y - m_size.y / 2;
f32 x = (m_vertices[i].x * std::cos(angle)) - (m_vertices[i].y * std::sin(angle) );
f32 y = (m_vertices[i].y * std::cos(angle)) + (m_vertices[i].x * std::sin(angle) );
m_vertices[i].x = x + x_origin;
m_vertices[i].y = y + y_origin;
}
I made this according to a tutorial, but now nothing is happening. I noticed values going to minus. Ofc, when I substract the vertice which has 10 (position) and substract size(32) then it is -22.
What to do?
What you want:
rotate( m_vertices[i] - translate ) + translate
That’s not what you’re doing.
have you tried using matrices, they are really good once you learn them
I know, but when I make + translate the sprite goes away :(.
I tried to use glm. But I could not figure out which function to use to multiply it with the vertex. The documentation is somewhat “spare”.
The problem is:
I batch nearly all my sprites on the screen. So I cannot simply send a Rotation Matrix and multiply it with the Projection Matrix in the Shader.
f32 rad = angle * (NL_PI / 180.0f );
for (int i=0; i<6; i++)
{
f32 center_x = m_vertices[i].x - m_size.x / 2;
f32 center_y = m_vertices[i].y - m_size.y / 2;
f32 x = ((m_vertices[i].x - center_x) * std::cos(rad)) - ((m_vertices[i].y - center_y) * std::sin(rad) );
f32 y = ((m_vertices[i].x - center_x) * std::sin(rad)) + ((m_vertices[i].y - center_y) * std::cos(rad) );
m_vertices[i].x = x - center_x;
m_vertices[i].y = y - center_y;
}
I got this equetation running and it is rotating around a point, but it is flickering and I want it to behave like glRotatef.
Unfortunately I am not smart enough to implement the matrix from the documentation of glRotatef.
// Center of Sprite
glm::vec3 center = glm::vec3(m_position.x + m_size.x / 2, m_position.y + m_size.y / 2, m_position.z);
// Translate to center
glm::mat4 trans_tmp = glm::translate(glm::mat4(1), center);
// Rotate
glm::mat4 rotation_tmp = glm::rotate(trans_tmp, angle, glm::vec3(0,0,1));
// Translate back
m_rotation = glm::translate(rotation_tmp, -center);
Solved it