diff --git a/modules/camera/include/vkcv/camera/CameraManager.hpp b/modules/camera/include/vkcv/camera/CameraManager.hpp
index f69ea121fee52f5f09df941fc325b07647f27c9e..5651ebd9c5875e0c2da3629e366e5507ed23ba8b 100644
--- a/modules/camera/include/vkcv/camera/CameraManager.hpp
+++ b/modules/camera/include/vkcv/camera/CameraManager.hpp
@@ -20,7 +20,7 @@ namespace vkcv{
         float m_width;
         float m_height;
 
-        bool m_roationActive = false;
+        bool m_rotationActive = false;
         double m_lastX ;
         double m_lastY ;
 
diff --git a/modules/camera/include/vkcv/camera/TrackballCamera.hpp b/modules/camera/include/vkcv/camera/TrackballCamera.hpp
index 21243532cbc2f146b91269ba140abee3593110b8..dd5ead6a51ba7c0ecbf8099043740dfb7472176d 100644
--- a/modules/camera/include/vkcv/camera/TrackballCamera.hpp
+++ b/modules/camera/include/vkcv/camera/TrackballCamera.hpp
@@ -8,6 +8,7 @@ namespace vkcv {
     protected:
         glm::vec3 m_center;
         float m_radius;
+        float m_scrollSensitivity;
 
     public:
 
@@ -19,7 +20,7 @@ namespace vkcv {
 
         void setRadius(float radius);
 
-        glm::vec3& getCenter();
+        glm::vec3 &getCenter();
 
         void setCenter(const glm::vec3 &center);
 
@@ -27,6 +28,10 @@ namespace vkcv {
 
         void setYaw(float yaw);
 
+        void changeFov(double fov);
+
+        void panView(double xOffset, double yOffset);
+
         glm::mat4 updateView(double deltaTime);
 
         void updatePosition(double deltaTime);
diff --git a/modules/camera/src/vkcv/camera/Camera.cpp b/modules/camera/src/vkcv/camera/Camera.cpp
index bc8a8498e67a6bd751f5a6ed1d4c4fba0279a68d..f60fd7455cc4731d489625980540e8c7f380358c 100644
--- a/modules/camera/src/vkcv/camera/Camera.cpp
+++ b/modules/camera/src/vkcv/camera/Camera.cpp
@@ -7,7 +7,7 @@ namespace vkcv {
         m_up = glm::vec3(0.0f, -1.0f, 0.0f);
         m_position = glm::vec3(0.0f, 0.0f, 0.0f);
         m_cameraSpeed = 2.f;
-        // front
+
         m_pitch = 0.0;
         m_yaw = 180.0;
 
@@ -148,8 +148,8 @@ namespace vkcv {
     }
 
     void Camera::panView(double xOffset, double yOffset) {
-        m_yaw += xOffset;
-        m_pitch += yOffset;
+        setYaw(m_yaw + xOffset);
+        setPitch(m_pitch + yOffset);
     }
 
     void Camera::updatePosition(double deltatime ){
diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp
index c3d52c3e5bf8f2a3114f74317af027a97b4f3247..efbbaa2723548a8abfebb4a841a681b60e8a3d0d 100644
--- a/modules/camera/src/vkcv/camera/CameraManager.cpp
+++ b/modules/camera/src/vkcv/camera/CameraManager.cpp
@@ -25,23 +25,22 @@ namespace vkcv{
     }
 
     void CameraManager::mouseButtonCallback(int button, int action, int mods){
-        if(button == GLFW_MOUSE_BUTTON_2 && m_roationActive == false && action == GLFW_PRESS){
+        if(button == GLFW_MOUSE_BUTTON_2 && m_rotationActive == false && action == GLFW_PRESS){
             glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-            m_roationActive = true;
-        }else if(button == GLFW_MOUSE_BUTTON_2 && m_roationActive == true && action == GLFW_RELEASE){
+            m_rotationActive = true;
+        }else if(button == GLFW_MOUSE_BUTTON_2 && m_rotationActive == true && action == GLFW_RELEASE){
             glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
-            m_roationActive = false;
+            m_rotationActive = false;
         }
     }
 
     void CameraManager::mouseMoveCallback(double x, double y){
-
         float xoffset = x - m_lastX;
         float yoffset = m_lastY - y;
         m_lastX = x;
         m_lastY = y;
 
-        if(!m_roationActive){
+        if(!m_rotationActive){
             return;
         }
 
diff --git a/modules/camera/src/vkcv/camera/TrackballCamera.cpp b/modules/camera/src/vkcv/camera/TrackballCamera.cpp
index c808611ebe1bf7d21144c81fd8cbfd7c3c525712..96f0503a44687a4de9d4b3d9d212d6393f73259b 100644
--- a/modules/camera/src/vkcv/camera/TrackballCamera.cpp
+++ b/modules/camera/src/vkcv/camera/TrackballCamera.cpp
@@ -1,13 +1,15 @@
 #include "vkcv/camera/TrackballCamera.hpp"
+#include <iostream>
 
 namespace vkcv {
 
     TrackballCamera::TrackballCamera() {
-        m_pitch = 90.0f;
+        m_pitch = 0.0f;
         m_yaw = 0.0f;
         m_radius = 1.5f;
-
         m_center = glm::vec3(0.0f,0.0f,0.0f);
+        m_cameraSpeed = 5.0f;
+        m_scrollSensitivity = 0.05f;
     }
 
     TrackballCamera::~TrackballCamera() = default;
@@ -32,35 +34,45 @@ namespace vkcv {
     }
 
     void TrackballCamera::setPitch(float pitch) {
-        if (pitch > 89.0f) {
-            pitch = 89.0f;
+        if (pitch < 0.0f) {
+            pitch += 360.0f;
         }
-        if (pitch < -89.0f) {
-            pitch = -89.0f;
+        else if (pitch > 360.0f) {
+            pitch -= 360.0f;
         }
         m_pitch = pitch;
     }
 
     void TrackballCamera::setYaw(float yaw) {
-        if (m_yaw < 0.0f) {
-            m_yaw += 360.0f;
+        if (yaw < 0.0f) {
+            yaw += 360.0f;
         }
-        else if (m_yaw > 360.0f) {
-            m_yaw -= 360.0f;
+        else if (yaw > 360.0f) {
+            yaw -= 360.0f;
         }
         m_yaw = yaw;
     }
 
+    void TrackballCamera::changeFov(double fov) {
+        setRadius(m_radius - fov * m_scrollSensitivity);
+    }
+
+    void TrackballCamera::panView(double xOffset, double yOffset) {
+        setYaw(m_yaw + xOffset * m_cameraSpeed);
+        setPitch(m_pitch + yOffset * m_cameraSpeed);
+    }
+
     glm::mat4 TrackballCamera::updateView(double deltaTime)  {
         updatePosition(deltaTime);
         return m_view = glm::lookAt(m_position, m_center, m_up);
     }
 
-    // TODO: deal with gimbal lock problem, e.g. using quaternions, angleaxis etc.
     void TrackballCamera::updatePosition(double deltaTime) {
-        m_position.x = m_center.x + m_radius * sin(glm::radians(m_pitch)) * sin(glm::radians(m_yaw));
-        m_position.y = m_center.y + m_radius * cos(glm::radians(m_pitch));
-        m_position.z = m_center.z + m_radius * sin(glm::radians(m_pitch)) * cos(glm::radians(m_yaw));
+        glm::mat4 rotationY = glm::rotate(glm::mat4(1.0f), glm::radians(m_yaw), glm::vec3(0.0f, 1.0f, 0.0f));
+        glm::mat4 rotationX = glm::rotate(rotationY, glm::radians(m_pitch), glm::vec3(1.0f, 0.0f, 0.0f));
+        glm::vec3 translate = glm::vec3(0.0f,0.0f,m_radius);
+        translate = glm::vec3(rotationX * glm::vec4(translate, 0.0f));
+        m_position = m_center + translate;
+        m_up = glm::vec3(rotationX * glm::vec4(glm::vec3(0.0f, 1.0f, 0.0f), 0.0f));
     }
-
 }
\ No newline at end of file
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 83df215a729d18ac5dcc40653fc4816bc570a283..192e3449063c59cda865c87980a9f0740bed75fa 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -17,7 +17,7 @@ int main(int argc, const char** argv) {
     );
 
     vkcv::CameraManager cameraManager(window, windowWidth, windowHeight);
-    cameraManager.getTrackballCamera().setPosition(glm::vec3(0.0f,0.0f,-0.5f));
+    cameraManager.getTrackballCamera().setPosition(glm::vec3(0.0f,0.5f,0.0f));
     cameraManager.getTrackballCamera().setCenter(glm::vec3(0.0f,0.0f,-1.0f));
 
     window.initEvents();
@@ -139,8 +139,10 @@ int main(int argc, const char** argv) {
         auto end = std::chrono::system_clock::now();
         auto deltatime = end - start;
         start = end;
+//        cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count());
+//		const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView();
         cameraManager.getTrackballCamera().updateView(std::chrono::duration<double>(deltatime).count());
-		const glm::mat4 mvp = cameraManager.getTrackballCamera().getProjection() * cameraManager.getTrackballCamera().getView();
+        const glm::mat4 mvp = cameraManager.getTrackballCamera().getProjection() * cameraManager.getTrackballCamera().getView();
 
 	    core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp);
 	    core.endFrame();