diff --git a/src/cv.cpp b/src/cv.cpp
index c4dfe05..03b8c27 100644
--- a/src/cv.cpp
+++ b/src/cv.cpp
@@ -62,17 +62,29 @@ void cvFrame() {
 
 		//send control information to graphics
 		float faceSize = landmarks[biggestFace][14].x - landmarks[biggestFace][2].x;
-		updateModel(glm::vec2(
+		updateModel(
+			//head position
+			glm::vec2(
 			(landmarks[biggestFace][2].x + landmarks[biggestFace][14].x) / 2
 				* 2 / (float)frame.cols - 1,
 			(landmarks[biggestFace][2].y + landmarks[biggestFace][14].y) / 2
 				* 2 / (float)frame.rows - 1
 			),
+
+			//face position
 			glm::vec2(
 			landmarks[biggestFace][30].x * 2 / (float)frame.cols - 1,
 			landmarks[biggestFace][30].y * 2 / (float)frame.rows - 1
 			),
+
+			//rotation
+			atanf((float)(landmarks[biggestFace][14].y - landmarks[biggestFace][2].y) /
+				(float)(landmarks[biggestFace][2].x - landmarks[biggestFace][14].x)),
+
+			//scale
 			faceSize * 6 / (float)frame.cols,
+
+			//mouth open/closed state
 			(landmarks[biggestFace][66].y - landmarks[biggestFace][62].y) / faceSize > 0.04f);
 	}
 }
diff --git a/src/graphics.cpp b/src/graphics.cpp
index 3b9e880..5d39953 100644
--- a/src/graphics.cpp
+++ b/src/graphics.cpp
@@ -175,11 +175,11 @@ void initModel () {
 
 }
 
-void updateModel(glm::vec2 headPos, glm::vec2 facePos, float scale, bool mouthOpen) {
+void updateModel(glm::vec2 headPos, glm::vec2 facePos, float rotation, float scale, bool mouthOpen) {
 	//calculate transforms
-	parts[0].setTransform(headPos, scale);
-	parts[1].setTransform(facePos, scale);
-	parts[2].setTransform(facePos, scale);
+	parts[0].setTransform(headPos, rotation, scale);
+	parts[1].setTransform(facePos, rotation, scale);
+	parts[2].setTransform(facePos, rotation, scale);
 
 	//set mouth texture to open or closed
 	parts[2].selectTexture(mouthOpen ? 1 : 0);
diff --git a/src/graphics.hpp b/src/graphics.hpp
index 8bbac13..57d992f 100644
--- a/src/graphics.hpp
+++ b/src/graphics.hpp
@@ -16,6 +16,6 @@ void initShader();
 
 void printShaderCompileLog(GLuint shader);
 
-void updateModel(glm::vec2 headPos, glm::vec2 facePos, float scale, bool mouthOpen);
+void updateModel(glm::vec2 headPos, glm::vec2 facePos, float rotation, float scale, bool mouthOpen);
 
 #endif
diff --git a/src/modelpart.cpp b/src/modelpart.cpp
index b5b8e35..d013f41 100644
--- a/src/modelpart.cpp
+++ b/src/modelpart.cpp
@@ -29,8 +29,9 @@ void ModelPart::bindAndDraw() {
 	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
 }
 
-void ModelPart::setTransform(glm::vec2 position, float scale) {
+void ModelPart::setTransform(glm::vec2 position, float rotation, float scale) {
 	transMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(position.x, -position.y, 0.0f));
+	transMatrix = glm::rotate(transMatrix, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
 	transMatrix = glm::scale(transMatrix, glm::vec3(scale, scale, scale));
 }
 
diff --git a/src/modelpart.hpp b/src/modelpart.hpp
index 054bb6d..ad62fea 100644
--- a/src/modelpart.hpp
+++ b/src/modelpart.hpp
@@ -20,7 +20,7 @@ class ModelPart {
 
 		void bindAndDraw();
 
-		void setTransform(glm::vec2 position, float scale);
+		void setTransform(glm::vec2 position, float rotation, float scale);
 
 		void addTexture(const char* texPath, size_t slot);