mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-03 08:49:40 +00:00
Better center picking for the Orbit Camera.
This commit is contained in:
parent
a0fb242bf8
commit
fbe9177f5d
1 changed files with 27 additions and 3 deletions
|
@ -7,6 +7,10 @@
|
|||
#include <osg/Matrixd>
|
||||
#include <osg/Quat>
|
||||
|
||||
#include <osgUtil/LineSegmentIntersector>
|
||||
|
||||
#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<osgUtil::LineSegmentIntersector> intersector (new osgUtil::LineSegmentIntersector(
|
||||
osgUtil::Intersector::PROJECTION, osg::Vec3d(0, 0, 0), LocalForward));
|
||||
|
||||
mDistance = DefaultStartDistance;
|
||||
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);
|
||||
|
||||
if (intersector->getIntersections().begin() != intersector->getIntersections().end())
|
||||
{
|
||||
mCenter = intersector->getIntersections().begin()->getWorldIntersectPoint();
|
||||
mDistance = (eye - center).length();
|
||||
}
|
||||
else
|
||||
{
|
||||
mCenter = center;
|
||||
mDistance = DefaultStartDistance;
|
||||
}
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue