Merge pull request #22 from andreja6/MusicalProgrammer

Fixed a camera zooming bug.
This commit is contained in:
MusicalProgrammer
2018-06-02 16:37:34 -04:00
committed by GitHub
3 changed files with 36 additions and 11 deletions

View File

@@ -49,6 +49,13 @@ CoordinateFrame CameraController::getCoordinateFrame() {
return cf; 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) void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY)
{ {
yaw+=spdX; yaw+=spdX;
@@ -60,24 +67,40 @@ void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY)
frame->lookAt(focusPosition); frame->lookAt(focusPosition);
} }
bool CameraController::onMouseWheel(int x, int y, short delta) bool CameraController::onMouseWheel(int x, int y, short delta)
{
Zoom(delta);
return true;
}
void CameraController::Zoom(short delta)
{ {
CoordinateFrame frame = g3dCamera.getCoordinateFrame(); CoordinateFrame frame = g3dCamera.getCoordinateFrame();
if (delta>0) { // Mouse wheel up if (delta>0) { // Mouse wheel up
CoordinateFrame zoomFrame = frame+frame.lookVector()*(zoom/5);
zoom=(zoomFrame.translation-focusPosition).magnitude();
if (zoom>CAM_ZOOM_MIN) if (zoom>CAM_ZOOM_MIN)
frame = frame+frame.lookVector()*(zoom/5); {
setFrame(zoomFrame);
}
else
{
zoom=CAM_ZOOM_MIN;
refreshZoom(frame);
}
} }
else { else {
CoordinateFrame zoomFrame = frame-frame.lookVector()*(zoom/5);
zoom=(zoomFrame.translation-focusPosition).magnitude();
if (zoom<CAM_ZOOM_MAX) if (zoom<CAM_ZOOM_MAX)
frame = frame-frame.lookVector()*(zoom/5); {
setFrame(zoomFrame);
}
else
{
zoom=CAM_ZOOM_MAX;
refreshZoom(frame);
}
} }
zoom=(frame.translation-focusPosition).magnitude();
if (zoom<CAM_ZOOM_MIN) zoom=CAM_ZOOM_MIN;
if (zoom>CAM_ZOOM_MAX) zoom=CAM_ZOOM_MAX;
setFrame(frame);
return true;
} }
void CameraController::panLeft() void CameraController::panLeft()

View File

@@ -16,6 +16,7 @@ class CameraController {
void setFrame(const CoordinateFrame& cf); void setFrame(const CoordinateFrame& cf);
void lookAt(const Vector3& position); void lookAt(const Vector3& position);
void refreshZoom(const CoordinateFrame& frame);
void pan(CoordinateFrame* frame,float spdX,float spdY); void pan(CoordinateFrame* frame,float spdX,float spdY);
void update(Demo* demo); void update(Demo* demo);
void centerCamera(Instance* selection); void centerCamera(Instance* selection);
@@ -23,6 +24,7 @@ class CameraController {
void panRight(); void panRight();
void tiltUp(); void tiltUp();
void tiltDown(); void tiltDown();
void Zoom(short delta);
bool onMouseWheel(int x, int y, short delta); bool onMouseWheel(int x, int y, short delta);
GCamera* getCamera(); GCamera* getCamera();
private: private:

View File

@@ -171,9 +171,9 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button)
if(button->name == "CenterCam") if(button->name == "CenterCam")
usableApp->cameraController.centerCamera(selectedInstance); usableApp->cameraController.centerCamera(selectedInstance);
else if(button->name == "ZoomIn") 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") 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") else if(button->name == "PanRight")
usableApp->cameraController.panRight(); usableApp->cameraController.panRight();
else if(button->name == "PanLeft") else if(button->name == "PanLeft")