#168 Fixed zoom along ray problem making the camera end up with the scene behind it.

This commit is contained in:
Jacob Støren 2016-08-16 13:41:10 +02:00
parent 0eace5579a
commit d13d0775b4
2 changed files with 9 additions and 7 deletions

View File

@ -159,6 +159,8 @@ void caf::TrackBallBasedNavigation::zoomAlongRay(cvf::Ray* ray, int delta)
m_viewer->mainCamera()->setFromLookAt(newPos, newVrp, up ); m_viewer->mainCamera()->setFromLookAt(newPos, newVrp, up );
m_viewer->updateParallelProjectionHeightFromMoveZoom(m_pointOfInterest); m_viewer->updateParallelProjectionHeightFromMoveZoom(m_pointOfInterest);
m_viewer->updateParallelProjectionCameraPosFromPointOfInterestMove(m_pointOfInterest);
m_viewer->navigationPolicyUpdate(); m_viewer->navigationPolicyUpdate();
} }
} }

View File

@ -1050,9 +1050,8 @@ void caf::Viewer::enableParallelProjection(bool enableOrtho)
// so we do not need to update the camera position based on orthoHeight and fieldOfView. // so we do not need to update the camera position based on orthoHeight and fieldOfView.
// We assume the camera is in a sensible position. // We assume the camera is in a sensible position.
// Set a dummy near plane to be > 0 and < farPlane. These wll be updated by the optimize clipping planes // Set dummy near and far plane. These wll be updated by the optimize clipping planes
double dummyNearPlane = m_mainCamera->farPlane() *0.1; m_mainCamera->setProjectionAsPerspective(m_cameraFieldOfViewYDeg, 0.1, 1.0);
m_mainCamera->setProjectionAsPerspective(m_cameraFieldOfViewYDeg, dummyNearPlane, m_mainCamera->farPlane());
this->m_renderingSequence->setDefaultFFLightPositional(cvf::Vec3f(0.5, 5.0, 7.0)); this->m_renderingSequence->setDefaultFFLightPositional(cvf::Vec3f(0.5, 5.0, 7.0));
m_globalUniformSet->setHeadLightPosition(cvf::Vec3f(0.5, 5.0, 7.0)); m_globalUniformSet->setHeadLightPosition(cvf::Vec3f(0.5, 5.0, 7.0));
@ -1073,7 +1072,7 @@ double calculateOrthoHeight(double perspectiveViewAngleYDeg, double focusPlaneDi
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
double calculateDistToPlaneOfInterest(double perspectiveViewAngleYDeg, double orthoHeight) double calculateDistToPlaneOfOrthoHeight(double perspectiveViewAngleYDeg, double orthoHeight)
{ {
return orthoHeight / (2 * (cvf::Math::tan( cvf::Math::toRadians(0.5 * perspectiveViewAngleYDeg) ))); return orthoHeight / (2 * (cvf::Math::tan( cvf::Math::toRadians(0.5 * perspectiveViewAngleYDeg) )));
} }
@ -1097,7 +1096,7 @@ double distToPlaneOfInterest(const cvf::Camera* camera, const cvf::Vec3d& pointO
Vec3d eyeToFocus = pointOfInterest - eye; Vec3d eyeToFocus = pointOfInterest - eye;
double distToFocusPlane = eyeToFocus*camDir; double distToFocusPlane = eyeToFocus*camDir;
return cvf::Math::abs(distToFocusPlane); return distToFocusPlane;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1111,8 +1110,9 @@ void caf::Viewer::updateParallelProjectionHeightFromMoveZoom(const cvf::Vec3d& p
if (!camera || camera->projection() != Camera::ORTHO) return; if (!camera || camera->projection() != Camera::ORTHO) return;
// Negative distance can occur. If so, do not set a negative ortho.
double distToFocusPlane = distToPlaneOfInterest(camera, pointOfInterest); double distToFocusPlane = cvf::Math::abs( distToPlaneOfInterest(camera, pointOfInterest));
double orthoHeight = calculateOrthoHeight(m_cameraFieldOfViewYDeg, distToFocusPlane); double orthoHeight = calculateOrthoHeight(m_cameraFieldOfViewYDeg, distToFocusPlane);
@ -1134,7 +1134,7 @@ void caf::Viewer::updateParallelProjectionCameraPosFromPointOfInterestMove(const
double orthoHeight = camera->frontPlaneFrustumHeight(); double orthoHeight = camera->frontPlaneFrustumHeight();
//Trace::show(String::number(orthoHeight)); //Trace::show(String::number(orthoHeight));
double neededDistToFocusPlane = calculateDistToPlaneOfInterest(m_cameraFieldOfViewYDeg, orthoHeight); double neededDistToFocusPlane = calculateDistToPlaneOfOrthoHeight(m_cameraFieldOfViewYDeg, orthoHeight);
Vec3d eye, vrp, up; Vec3d eye, vrp, up;
camera->toLookAt(&eye, &vrp, &up); camera->toLookAt(&eye, &vrp, &up);