diff --git a/apps/opencs/view/render/cameracontroller.cpp b/apps/opencs/view/render/cameracontroller.cpp index bfdb00089..8e990482c 100644 --- a/apps/opencs/view/render/cameracontroller.cpp +++ b/apps/opencs/view/render/cameracontroller.cpp @@ -7,6 +7,10 @@ #include #include +#include + +#include "mask.hpp" + namespace CSVRender { @@ -481,10 +485,30 @@ namespace CSVRender { static const int DefaultStartDistance = 10000.f; - osg::Vec3d eye, up; - getCamera()->getViewMatrixAsLookAt(eye, mCenter, up, DefaultStartDistance); + // Try to intelligently pick focus object + osg::ref_ptr intersector (new osgUtil::LineSegmentIntersector( + osgUtil::Intersector::PROJECTION, osg::Vec3d(0, 0, 0), LocalForward)); + + intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST); + osgUtil::IntersectionVisitor visitor(intersector); + + visitor.setTraversalMask(Mask_Reference | Mask_Terrain); + + getCamera()->accept(visitor); + + osg::Vec3d eye, center, up; + getCamera()->getViewMatrixAsLookAt(eye, center, up, DefaultStartDistance); - mDistance = DefaultStartDistance; + if (intersector->getIntersections().begin() != intersector->getIntersections().end()) + { + mCenter = intersector->getIntersections().begin()->getWorldIntersectPoint(); + mDistance = (eye - center).length(); + } + else + { + mCenter = center; + mDistance = DefaultStartDistance; + } mInitialized = true; }