Show
Ignore:
Timestamp:
10/14/04 12:38:29 (10 years ago)
Author:
robert
Message:

Improvements to the NodeTrackManipulator? and osgsimulation example

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgsimulation/osgsimulation.cpp

    r3490 r3495  
    198198    viewer.getUsage(*arguments.getApplicationUsage()); 
    199199 
     200    osg::Quat rotation; 
     201    osg::Vec4 vec4; 
     202    while (arguments.read("--rotate-model",vec4[0],vec4[1],vec4[2],vec4[3])) 
     203    { 
     204        osg::Quat local_rotate; 
     205        local_rotate.makeRotate(osg::DegreesToRadians(vec4[0]),vec4[1],vec4[2],vec4[3]); 
     206         
     207        rotation = rotation * local_rotate; 
     208    } 
     209 
     210    osg::NodeCallback* nc = 0; 
     211    std::string flightpath_filename; 
     212    while (arguments.read("--flight-path",flightpath_filename)) 
     213    { 
     214        std::fstream fin(flightpath_filename.c_str()); 
     215        if (fin) 
     216        { 
     217            osg::AnimationPath* path = new osg::AnimationPath; 
     218            path->read(fin); 
     219            nc = new osg::AnimationPathCallback(path); 
     220        } 
     221    } 
     222     
     223    osgGA::NodeTrackerManipulator::TrackerMode trackerMode = osgGA::NodeTrackerManipulator::NODE_CENTER_AND_ROTATION; 
     224    std::string mode; 
     225    while (arguments.read("--tracker-mode",mode)) 
     226    { 
     227        if (mode=="NODE_CENTER_AND_ROTATION") trackerMode = osgGA::NodeTrackerManipulator::NODE_CENTER_AND_ROTATION; 
     228        else if (mode=="NODE_CENTER_AND_AZIM") trackerMode = osgGA::NodeTrackerManipulator::NODE_CENTER_AND_AZIM; 
     229        else if (mode=="NODE_CENTER") trackerMode = osgGA::NodeTrackerManipulator::NODE_CENTER; 
     230        else 
     231        { 
     232            std::cout<<"Unrecognized --tracker-mode option "<<mode<<", valid options are:"<<std::endl; 
     233            std::cout<<"    NODE_CENTER_AND_ROTATION"<<std::endl; 
     234            std::cout<<"    NODE_CENTER_AND_AZIM"<<std::endl; 
     235            std::cout<<"    NODE_CENTER"<<std::endl; 
     236            return 1; 
     237        } 
     238    } 
     239     
     240     
     241    osgGA::NodeTrackerManipulator::RotationMode rotationMode = osgGA::NodeTrackerManipulator::TRACKBALL; 
     242    while (arguments.read("--rotation-mode",mode)) 
     243    { 
     244        if (mode=="TRACKBALL") rotationMode = osgGA::NodeTrackerManipulator::TRACKBALL; 
     245        else if (mode=="ELEVATION_AZIM") rotationMode = osgGA::NodeTrackerManipulator::ELEVATION_AZIM; 
     246        else 
     247        { 
     248            std::cout<<"Unrecognized --rotation-mode option "<<mode<<", valid options are:"<<std::endl; 
     249            std::cout<<"    TRACKBALL"<<std::endl; 
     250            std::cout<<"    ELEVATION_AZIM"<<std::endl; 
     251            return 1; 
     252        } 
     253    } 
     254 
    200255    // if user request help write it out to cout. 
    201256    if (arguments.read("-h") || arguments.read("--help")) 
     
    232287            osg::MatrixTransform* scaler = new osg::MatrixTransform; 
    233288            scaler->addChild(cessna); 
    234             scaler->setMatrix(osg::Matrixd::scale(s,s,s)); 
     289            scaler->setMatrix(osg::Matrixd::scale(s,s,s)*osg::Matrixd::rotate(rotation)); 
    235290            scaler->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);         
    236291         
    237292            osg::MatrixTransform* mt = new osg::MatrixTransform; 
    238293            mt->addChild(scaler); 
    239             mt->setUpdateCallback(new ModelPositionCallback); 
     294 
     295 
     296            if (!nc) nc = new ModelPositionCallback; 
     297 
     298            mt->setUpdateCallback(nc); 
    240299 
    241300            csn->addChild(mt); 
    242301 
    243302            osgGA::NodeTrackerManipulator* tm = new osgGA::NodeTrackerManipulator; 
     303            tm->setTrackerMode(trackerMode); 
     304            tm->setRotationMode(rotationMode); 
    244305            tm->setTrackNode(scaler); 
    245306