From db9e030b53ad7464f9cb5c902b43727a95340e31 Mon Sep 17 00:00:00 2001 From: MusicalProgrammer <38636805+MusicalProgrammer@users.noreply.github.com> Date: Sat, 2 Jun 2018 16:29:34 -0400 Subject: [PATCH] Fixed a camera zooming bug. --- CameraController.cpp | 41 ++++++++++++++++++++++++++++++++--------- CameraController.h | 2 ++ main.cpp | 4 ++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/CameraController.cpp b/CameraController.cpp index a1e791e..a7c78bf 100644 --- a/CameraController.cpp +++ b/CameraController.cpp @@ -49,6 +49,13 @@ CoordinateFrame CameraController::getCoordinateFrame() { return cf; } +void CameraController::refreshZoom(const CoordinateFrame& frame) +{ + CoordinateFrame zoomFrame = focusPosition-frame.lookVector()*zoom; + zoomFrame.lookAt(focusPosition); + setFrame(zoomFrame); +} + void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY) { yaw+=spdX; @@ -60,24 +67,40 @@ void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY) frame->lookAt(focusPosition); } bool CameraController::onMouseWheel(int x, int y, short delta) +{ + Zoom(delta); + return true; +} +void CameraController::Zoom(short delta) { CoordinateFrame frame = g3dCamera.getCoordinateFrame(); if (delta>0) { // Mouse wheel up + CoordinateFrame zoomFrame = frame+frame.lookVector()*(zoom/5); + zoom=(zoomFrame.translation-focusPosition).magnitude(); if (zoom>CAM_ZOOM_MIN) - frame = frame+frame.lookVector()*(zoom/5); + { + setFrame(zoomFrame); + } + else + { + zoom=CAM_ZOOM_MIN; + refreshZoom(frame); + } } else { + CoordinateFrame zoomFrame = frame-frame.lookVector()*(zoom/5); + zoom=(zoomFrame.translation-focusPosition).magnitude(); if (zoomCAM_ZOOM_MAX) zoom=CAM_ZOOM_MAX; - - setFrame(frame); - return true; } void CameraController::panLeft() diff --git a/CameraController.h b/CameraController.h index e931b59..8fd23a3 100644 --- a/CameraController.h +++ b/CameraController.h @@ -16,6 +16,7 @@ class CameraController { void setFrame(const CoordinateFrame& cf); void lookAt(const Vector3& position); + void refreshZoom(const CoordinateFrame& frame); void pan(CoordinateFrame* frame,float spdX,float spdY); void update(Demo* demo); void centerCamera(Instance* selection); @@ -23,6 +24,7 @@ class CameraController { void panRight(); void tiltUp(); void tiltDown(); + void Zoom(short delta); bool onMouseWheel(int x, int y, short delta); GCamera* getCamera(); private: diff --git a/main.cpp b/main.cpp index 01f255a..6c710b2 100644 --- a/main.cpp +++ b/main.cpp @@ -171,9 +171,9 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button) if(button->name == "CenterCam") usableApp->cameraController.centerCamera(selectedInstance); else if(button->name == "ZoomIn") - cameraPos = Vector3(cameraPos.x, cameraPos.y, cameraPos.z) + frame.lookVector()*2; + usableApp->cameraController.Zoom(1); else if(button->name == "ZoomOut") - cameraPos = Vector3(cameraPos.x, cameraPos.y, cameraPos.z) - frame.lookVector()*2; + usableApp->cameraController.Zoom(-1); else if(button->name == "PanRight") usableApp->cameraController.panRight(); else if(button->name == "PanLeft")