Translate Transformation Does Not Behave As I Expected!!!

First take a look of the behavior:

Youtube Video

I was expecting to see the player moving around and not that C image. I believe, for some reason i’m giving a “Camera” effect but i don’t know why and also i don’t want this for my game.

Take a look at my rendering code and Move Method:

Sprite Object Render Method


//Render.
void Sprite::Render(Window * window)
{

	//Create the projection Matrix based on the current window width and height.
	glm::mat4 proj = glm::ortho(0.0f, (float)window->GetWidth(), 0.0f, (float)window->GetHeight(), -1.0f, 1.0f);


	//Set the MVP Uniform.
	m_Impl->program->setUniformMat4f("u_MVP", proj * m_Impl->model);

	
	//Run All The Brains (Scripts) of this game object (sprite).
	for (unsigned int i = 0; i < m_Impl->brains.size(); i++)
	{

		//Get Current Brain.
		Brain *brain = m_Impl->brains[i];

		//Call the start function only once!
		if (brain->GetStart())
		{
			brain->SetStart(false);
			brain->Start();
		}

		//Call the update function every frame.
		brain->Update();
	}


	//Render.
	window->GetRenderer()->Draw(m_Impl->vao, m_Impl->ibo, m_Impl->texture, m_Impl->program);
}

Renderer


void Renderer::Draw(VertexArray * vao, IndexBuffer * ibo, Texture *texture, Shader * program)
{
	vao->Bind();
	ibo->Bind();
	program->Bind();

	if (texture != NULL)
		texture->Bind();

	GLCall(glDrawElements(GL_TRIANGLES, ibo->GetCount(), GL_UNSIGNED_INT, NULL));
}

Move Method


void Sprite::Move(float speed, bool left, bool right, bool up, bool down)
{
	if (left)
	{
		m_Impl->pos.x -= speed;
		m_Impl->model = glm::translate(m_Impl->model, glm::vec3(-speed, 0, 0));
	}

	if (right)
	{
		m_Impl->pos.x += speed;
		m_Impl->model = glm::translate(m_Impl->model, glm::vec3(speed, 0, 0));
	}

	if (up)
	{
		m_Impl->pos.y += speed;
		m_Impl->model = glm::translate(m_Impl->model, glm::vec3(0, speed, 0));
	}

	if (down)
	{
		m_Impl->pos.y -= speed;
		m_Impl->model = glm::translate(m_Impl->model, glm::vec3(0, -speed, 0));
	}
}

Also, please notice that my vertex data are fixed:


Sprite::Sprite(std::string image_path, std::string tag, float x, float y)
{
	//Create Pointer To Implementaion.
	m_Impl = new Implementation();

	//Set the Position of the Sprite object.
	m_Impl->pos.x = x;
	m_Impl->pos.y = y;

	//Set the tag.
	m_Impl->tag = tag;

	//Create The Texture.
	m_Impl->texture = new Texture(image_path);

	//Initialize the model Matrix.
	m_Impl->model = glm::mat4(1.0f);

	//Get the Width and the Height of the Texture.
	int width  = m_Impl->texture->GetWidth();
	int height = m_Impl->texture->GetHeight();


	//Create the Verticies.
	float verticies[] =
	{

		//Positions                //Texture Coordinates.
		x, y,                      0.0f, 0.0f,
		x + width, y,              1.0f, 0.0f,
		x + width, y + height,     1.0f, 1.0f,
		x, y + height,             0.0f, 1.0f
	};



	//Create the Indicies.
	unsigned int indicies[] =
	{
		0, 1, 2,
		2, 3, 0
	};


	//Create Vertex Array.
	m_Impl->vao = new VertexArray();


	//Create the Vertex Buffer.
	m_Impl->vbo = new VertexBuffer((void *)verticies, sizeof(verticies));


	//Create The Layout.
	m_Impl->layout = new VertexBufferLayout();
	m_Impl->layout->PushFloat(2);
	m_Impl->layout->PushFloat(2);
	m_Impl->vao->AddBuffer(m_Impl->vbo, m_Impl->layout);


	//Create the Index Buffer.
	m_Impl->ibo = new IndexBuffer(indicies, 6);


	//Create the new shader.
	m_Impl->program = new Shader("Shaders/SpriteShader.shader");
}

As you can see in my Sprite Class i have a m_Impl->model Matrix which i update every time inside the Move Method.
Inside the Sprite Render Method, i multiply the Projection (proj) Matriw with the model (m_Impl->model) Matrix and setting a uniform.

Take a look also at my Shader:


#shader vertex
#version 330 core

layout(location = 0) in vec4 aPos;
layout(location = 1) in vec2 aTexCoord;

out vec2 t_TexCoord;

uniform mat4 u_MVP;

void main()
{
	gl_Position = u_MVP * aPos;
	t_TexCoord = aTexCoord;
}




#shader fragment
#version 330 core

out vec4 aColor;
in vec2 t_TexCoord;

uniform sampler2D u_Texture;

void main()
{
	aColor = texture(u_Texture, t_TexCoord);
}

Probably i didn’t understand the Transformation Matrices correctly or the ViewPort option and i’m doing something wrong.

I’m also setting a glViewPort(0, 0, screen_width, screen_height)

This seems so weird. How it is possible to translate the Player’s vertices but the Player is always being drawn at the same position in the screen
and that C image which i do not translate, is being drawn elsewhere every frame. I literally can’t understand what’s happening.

Thanks for your help!!!