From 7aad7dfd788afbf9db9da94daf6b543e38c90b1a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 19 Mar 2013 16:43:27 +0000 Subject: [PATCH] Improve corner point tracking/keystone computation --- examples/osgkeystone/osgkeystone.cpp | 59 ++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/examples/osgkeystone/osgkeystone.cpp b/examples/osgkeystone/osgkeystone.cpp index bf10beb93..856f59675 100644 --- a/examples/osgkeystone/osgkeystone.cpp +++ b/examples/osgkeystone/osgkeystone.cpp @@ -68,16 +68,54 @@ public: { } + double angleBetweenVectors(const osg::Vec2d& v1, const osg::Vec2d& v2) const + { + osg::Vec2d v3(-v2.y(), v2.x()); + double p1 = v1*v2; + double p2 = v1*v3; + double a = atan2(p2, p1); + return a; + } + + osg::Vec2d rotateVector(osg::Vec2d& v, double s, double c) const + { + return osg::Vec2d(v.x()*c-v.y()*s, v.y()*c+v.x()*s); + } + + void updateKeystone(ControlPoints cp) { // compute translation translate = (cp.bottom_left+cp.bottom_right+cp.top_left+cp.top_right)*0.25; // adjust control points to fit translation - cp.top_left += translate; - cp.top_right += translate; - cp.bottom_right += translate; - cp.bottom_left += translate; + cp.top_left -= translate; + cp.top_right -= translate; + cp.bottom_right -= translate; + cp.bottom_left -= translate; + + angle = (angleBetweenVectors(cp.top_left, osg::Vec2d(-1.0,1.0)) + + angleBetweenVectors(cp.top_right, osg::Vec2d(1.0,1.0)) + + angleBetweenVectors(cp.bottom_right, osg::Vec2d(1.0,-1.0)) + + angleBetweenVectors(cp.bottom_left, osg::Vec2d(-1.0,-1.0)))*0.25; + + OSG_NOTICE<<"cp.top_left="<