Dear community,

I use the OpenCV Library to collect feature points in an image and I need to do 
intersection testing through the 2D-coordinates of these feature points with 
osg.

The origin of the opencv image data structure is top left. The topmost pixel on 
the left side is 0,0 and the bottommost on the right side is 639, 479 for 
images with the resolution 640x480.

OpenSceneGraph has its origin at the bottom left.  That's no problem so far. If 
the origin of Osg was at 0,0 bottom left I would just need to use (x, (height - 
1) - y) to get a conversion.

But is the Origin of the visible osgviewer at 0,0? because when I use a 
PickHandler i get at each corner:

Bottom left: 0, 1
Bottom right: 639, 1
Top left: 0, 480
Top right: 639, 480

So, is the origin really at 0,1? I thought it was strange that x and y 
coordinate origin are different. If it was like that I would need to use (x, 
height - y) .

This is the code I used to check the coordinates. Is there something I missed 
or are my thoughts correct?


Code:

#include <windows.h>
#include <iostream>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>

class PickHandler : public osgGA::GUIEventHandler {

public: 
        PickHandler(){}        
    ~PickHandler() {}
    bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
    virtual void pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea);
  
};

bool PickHandler::handle(const osgGA::GUIEventAdapter& 
ea,osgGA::GUIActionAdapter& aa){
    
        switch(ea.getEventType())
    {
        case(osgGA::GUIEventAdapter::PUSH):
                {
                        osgViewer::View* view = 
dynamic_cast<osgViewer::View*>(&aa);
            if (view) pick(view,ea);
                        return false;
        }    
        default:
                return false;
    }
}

void PickHandler::pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea){
    float x = ea.getX();
    float y = ea.getY();
        std::cout<<"X: "<<x<<"  Y: "<<y<<std::endl;
}

int main( int argc, char **argv ){
        
        osg::ref_ptr<osg::Group> root = new osg::Group;
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
        viewer->setSceneData(root.get());
        viewer->addEventHandler(new osgViewer::StatsHandler);
        viewer->setCameraManipulator(new osgGA::TrackballManipulator);
        viewer->addEventHandler(new PickHandler());
        viewer->setUpViewInWindow(100, 50, 640, 480);
        viewer->run();
}




Thank you!
Dakota

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=45529#45529





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to