diff --git a/LearnOpenGL/OpenGLWrapper.cpp b/LearnOpenGL/OpenGLWrapper.cpp
index 6f282f145b8c1dbad6c55981ac45ed69302a64f1..a55ac047ab20bf0436b141d02e62e32ab3a4d4e0 100644
--- a/LearnOpenGL/OpenGLWrapper.cpp
+++ b/LearnOpenGL/OpenGLWrapper.cpp
@@ -61,14 +61,8 @@ GLuint Material::get_specularMap()
 
 RenderObject::RenderObject(Mesh * _mesh)
 {
-	translate = glm::vec3(0.0f, 0.0f, 0.0f);
-	rotate = glm::vec3(0.0f, 0.0f, 0.0f);
-	scale = glm::vec3(1.0f, 1.0f, 1.0f);
-
+	transform = Transform();
 	mesh = _mesh;
-
-	update_model_matrix();
-	update_directional_vector();
 }
 
 Material *RenderObject::get_material()
@@ -81,12 +75,22 @@ GLuint RenderObject::get_vertex_count()
 	return mesh->get_vertex_count();
 }
 
-glm::mat4 RenderObject::get_model_matrix()
+Transform::Transform()
+{
+	translate = glm::vec3(0.0f, 0.0f, 0.0f);
+	rotate = glm::vec3(0.0f, 0.0f, 0.0f);
+	scale = glm::vec3(1.0f, 1.0f, 1.0f);
+
+	update_model_matrix();
+	update_directional_vector();
+}
+
+glm::mat4 Transform::get_model_matrix()
 {
 	return model;
 }
 
-void RenderObject::update_model_matrix()
+void Transform::update_model_matrix()
 {
 	model = glm::mat4(1.0f);
 	model = glm::translate(model, translate);
@@ -98,7 +102,7 @@ void RenderObject::update_model_matrix()
 	model = glm::scale(model, scale);
 }
 
-void RenderObject::update_directional_vector()
+void Transform::update_directional_vector()
 {
 	glm::vec3 front;
 	glm::vec3 up;
@@ -115,7 +119,12 @@ void RenderObject::update_directional_vector()
 	up = glm::normalize(glm::cross(right, front));
 }
 
-void RenderObject::set_translate(glm::vec3 _translate)
+Transform *RenderObject::get_transform()
+{
+	return &transform;
+}
+
+void Transform::set_translate(glm::vec3 _translate)
 {
 	translate = _translate;
 
@@ -123,7 +132,7 @@ void RenderObject::set_translate(glm::vec3 _translate)
 	update_directional_vector();
 }
 
-void RenderObject::set_rotate(glm::vec3 _rotate)
+void Transform::set_rotate(glm::vec3 _rotate)
 {
 	rotate = _rotate;
 
@@ -131,14 +140,14 @@ void RenderObject::set_rotate(glm::vec3 _rotate)
 	update_directional_vector();
 }
 
-void RenderObject::set_scale(glm::vec3 _scale)
+void Transform::set_scale(glm::vec3 _scale)
 {
 	scale = _scale;
 
 	update_model_matrix();
 }
 
-void RenderObject::move(glm::vec3 _delta)
+void Transform::move(glm::vec3 _delta)
 {
 	translate += _delta;
 
@@ -146,7 +155,7 @@ void RenderObject::move(glm::vec3 _delta)
 	update_directional_vector();
 }
 
-void RenderObject::move(glm::vec3 _direction, glm::vec1 _velocity)
+void Transform::move(glm::vec3 _direction, glm::vec1 _velocity)
 {
 	translate += glm::vec3(_velocity *_direction.x, _velocity *_direction.y, _velocity *_direction.z);
 
@@ -177,6 +186,8 @@ void RenderObject::render(Camera &camera)
 
 	glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 500.0f);
 	glm::mat4 view = camera.GetViewMatrix();
+	glm::mat4 model = transform.get_model_matrix();
+
 	set_uniform_value(prog, "projection", projection);
 	set_uniform_value(prog, "view", view);
 	set_uniform_value(prog, "model", model);
@@ -223,6 +234,7 @@ void RenderObject::projective_render(Camera &camera)
 
 	glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 500.0f);
 	glm::mat4 view = camera.GetViewMatrix();
+	glm::mat4 model = transform.get_model_matrix();
 
 	set_uniform_value(prog, "projectorBias", bias);
 	set_uniform_value(prog, "projectorProjection", projector_projection);
@@ -260,7 +272,7 @@ RenderObject *make_render_object(Mesh *mesh)
 	RenderObject *ro = new RenderObject(mesh);
 
 	return ro;
-};
+}
 
 GLuint build_program(const std::string name)
 {
diff --git a/LearnOpenGL/OpenGLWrapper.h b/LearnOpenGL/OpenGLWrapper.h
index 2c42d76936309e109a244e71ef8116c8e90025df..df4d0ae80cb85793a4625034c00e47666bdc29c6 100644
--- a/LearnOpenGL/OpenGLWrapper.h
+++ b/LearnOpenGL/OpenGLWrapper.h
@@ -50,14 +50,9 @@ public:
 	GLuint get_specularMap();
 };
 
-class RenderObject
+class Transform
 {
 private:
-	GLuint id;
-
-	Mesh *mesh;
-	Material *material;
-
 	glm::mat4 model;
 
 	glm::vec3 translate;
@@ -72,10 +67,7 @@ private:
 	void update_directional_vector();
 
 public:
-	RenderObject(Mesh * _mesh);
-
-	Material *get_material();
-	GLuint get_vertex_count();
+	Transform();
 	glm::mat4 get_model_matrix();
 	glm::vec3 get_front();
 
@@ -85,6 +77,23 @@ public:
 
 	void move(glm::vec3 _delta);
 	void move(glm::vec3 _direction, glm::vec1 _velocity);
+};
+
+class RenderObject
+{
+private:
+	GLuint id;
+
+	Transform transform;
+	Mesh *mesh;
+	Material *material;
+
+public:
+	RenderObject(Mesh * _mesh);
+
+	Transform *get_transform();
+	Material *get_material();
+	GLuint get_vertex_count();
 
 	void set_material(Material *_material);
 
diff --git a/LearnOpenGL/Source.cpp b/LearnOpenGL/Source.cpp
index ea9995701be0ff4959270297096eb53ed439b7fb..b95a20bc80d38758d724ae53dfc0a2599e01fffb 100644
--- a/LearnOpenGL/Source.cpp
+++ b/LearnOpenGL/Source.cpp
@@ -77,18 +77,11 @@ int main()
 	auto planeMaterial = new Material(lightmap, magenta, transparent);
 	auto projectorMaterial = new Material(projector_shader, wall_tex, wall);
 
-	auto projector = make_render_object(cube);
-	{
-		projector->set_translate(glm::vec3(0.0f, 10.0f, 0.0f));
-	}
-	{
-		projector->set_material(projectorMaterial);
-	}
-
 	auto teapot = make_render_object(make_mesh("teapot.obj"));
 	{
-		teapot->set_translate(glm::vec3(0.0f, -10.0f, -40.0f));
-		teapot->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
+		auto transform = teapot->get_transform();
+		transform->set_translate(glm::vec3(0.0f, -10.0f, -40.0f));
+		transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
 	}
 	{
 		teapot->set_material(projectorMaterial);
@@ -96,9 +89,10 @@ int main()
 
 	auto cube1 = make_render_object(cube);
 	{
-		cube1->set_translate(glm::vec3(0, -15, -40));
-		cube1->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
-		cube1->set_scale(glm::vec3(10, 10, 4));
+		auto transform = cube1->get_transform();
+		transform->set_translate(glm::vec3(0, -15, -40));
+		transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
+		transform->set_scale(glm::vec3(10, 10, 4));
 	}
 	{
 		cube1->set_material(cubeMaterial);
@@ -106,9 +100,10 @@ int main()
 
 	auto cube2 = make_render_object(cube);
 	{
-		cube2->set_translate(glm::vec3(0, -10, -40));
-		cube1->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
-		cube2->set_scale(glm::vec3(12, 12, 1));
+		auto transform = cube2->get_transform();
+		transform->set_translate(glm::vec3(0, -10, -40));
+		transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
+		transform->set_scale(glm::vec3(12, 12, 1));
 	}
 	{
 		cube2->set_material(cubeMaterial);
@@ -116,7 +111,8 @@ int main()
 
 	auto plane = make_render_object(make_mesh("plane.obj"));
 	{
-		plane->set_scale(glm::vec3(10, 10, 1));
+		auto transform = plane->get_transform();
+		transform->set_scale(glm::vec3(10, 10, 1));
 	}
 	{
 		plane->set_material(planeMaterial);
@@ -124,9 +120,10 @@ int main()
 
 	auto cube3 = make_render_object(cube);
 	{
-		cube3->set_translate(glm::vec3(0.0f, -20.0f, -40.0f));
-		cube3->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
-		cube3->set_scale(glm::vec3(50, 50, 0.5));
+		auto transform = cube3->get_transform();
+		transform->set_translate(glm::vec3(0.0f, -20.0f, -40.0f));
+		transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f));
+		transform->set_scale(glm::vec3(50, 50, 0.5));
 	}
 	{
 		cube3->set_material(cubeMaterial);
@@ -134,7 +131,8 @@ int main()
 
 	auto cube4 = make_render_object(cube);
 	{
-		cube4->set_translate(glm::vec3(0.0f, 10.0f, 0.0f));
+		auto transform = cube4->get_transform();
+		transform->set_translate(glm::vec3(0.0f, 10.0f, 0.0f));
 	}
 	{
 		cube4->set_material(cubeMaterial);
@@ -153,11 +151,11 @@ int main()
 
 		{
 			teapot->projective_render(camera);
-			cube1->render(camera);
-			cube2->render(camera);
-			cube3->render(camera);
-			plane->render(camera);
-			cube4->render(camera);
+			cube1->projective_render(camera);
+			cube2->projective_render(camera);
+			cube3->projective_render(camera);
+			plane->projective_render(camera);
+			cube4->projective_render(camera);
 		}
 
 		glfwSwapBuffers(window);