Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 5ab1b20ab7c332e7f7a159b846f31aeb2cbc3a88)
+++ vulkan-game.cpp	(revision 15104a87760bafad33c7890536e50ee7bc8c97c0)
@@ -3,6 +3,4 @@
 #define GLM_FORCE_RADIANS
 #define GLM_FORCE_DEPTH_ZERO_TO_ONE
-
-#include <glm/gtc/matrix_transform.hpp>
 
 #include <array>
@@ -17,11 +15,4 @@
 
 using namespace std;
-using namespace glm;
-
-struct UniformBufferObject {
-   alignas(16) mat4 model;
-   alignas(16) mat4 view;
-   alignas(16) mat4 proj;
-};
 
 VulkanGame::VulkanGame(int maxFramesInFlight) : MAX_FRAMES_IN_FLIGHT(maxFramesInFlight) {
@@ -34,4 +25,6 @@
    currentFrame = 0;
    framebufferResized = false;
+
+   ubo = {};
 }
 
@@ -68,4 +61,5 @@
 
    initVulkan();
+   initMatrices();
    mainLoop();
    cleanup();
@@ -259,4 +253,22 @@
 
    createSyncObjects();
+}
+
+void VulkanGame::initMatrices() {
+   cam_pos = vec3(0.0f, 0.0f, 2.0f);
+
+   float cam_yaw = 0.0f;
+   float cam_pitch = -50.0f;
+
+   mat4 yaw_mat = rotate(mat4(1.0f), radians(-cam_yaw), vec3(0.0f, 1.0f, 0.0f));
+   mat4 pitch_mat = rotate(mat4(1.0f), radians(-cam_pitch), vec3(1.0f, 0.0f, 0.0f));
+
+   mat4 R = pitch_mat * yaw_mat;
+   mat4 T = translate(mat4(1.0f), vec3(-cam_pos.x, -cam_pos.y, -cam_pos.z));
+
+   ubo.view = R * T;
+
+   ubo.proj = perspective(radians(FOV_ANGLE), (float)swapChainExtent.width / (float)swapChainExtent.height, NEAR_CLIP, FAR_CLIP);
+   ubo.proj[1][1] *= -1; // flip the y-axis so that +y is up
 }
 
@@ -1002,9 +1014,7 @@
    float time = chrono::duration<float, chrono::seconds::period>(currentTime - startTime).count();
 
-   UniformBufferObject ubo = {};
-   ubo.model = rotate(mat4(1.0f), time * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
-   ubo.view = lookAt(vec3(0.0f, 2.0f, 2.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f));
-   ubo.proj = perspective(radians(FOV_ANGLE), (float)swapChainExtent.width / (float)swapChainExtent.height, NEAR_CLIP, FAR_CLIP);
-   ubo.proj[1][1] *= -1; // flip the y-axis so that +y is up
+   ubo.model =
+      translate(mat4(1.0f), vec3(0.0f, -2.0f, -0.0f)) * 
+      rotate(mat4(1.0f), time * radians(90.0f), vec3(0.0f, 0.0f, 1.0f));
 
    void* data;
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 5ab1b20ab7c332e7f7a159b846f31aeb2cbc3a88)
+++ vulkan-game.hpp	(revision 15104a87760bafad33c7890536e50ee7bc8c97c0)
@@ -3,4 +3,5 @@
 
 #include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
 
 #include "game-gui-sdl.hpp"
@@ -8,4 +9,6 @@
 
 #include "vulkan-utils.hpp"
+
+using namespace glm;
 
 #ifdef NDEBUG
@@ -16,12 +19,18 @@
 
 struct ModelVertex {
-   glm::vec3 pos;
-   glm::vec3 color;
-   glm::vec2 texCoord;
+   vec3 pos;
+   vec3 color;
+   vec2 texCoord;
 };
 
 struct OverlayVertex {
-   glm::vec3 pos;
-   glm::vec2 texCoord;
+   vec3 pos;
+   vec2 texCoord;
+};
+
+struct UniformBufferObject {
+   alignas(16) mat4 model;
+   alignas(16) mat4 view;
+   alignas(16) mat4 proj;
 };
 
@@ -39,4 +48,8 @@
       const float FAR_CLIP = 100.0f;
       const float FOV_ANGLE = 67.0f;
+
+      vec3 cam_pos;
+
+      UniformBufferObject ubo;
 
       GameGui* gui;
@@ -106,4 +119,5 @@
       bool initWindow(int width, int height, unsigned char guiFlags);
       void initVulkan();
+      void initMatrices();
       void mainLoop();
       void renderUI();
