查看: 1950|回复: 2

关于拖曳器范例的问题

[复制链接]

该用户从未签到

发表于 2011-7-12 11:12:55 | 显示全部楼层 |阅读模式
本帖最后由 Jetty 于 2011-7-12 11:14 编辑

大家好。我刚接触OSG不久,碰到一段范例程序,有些地方不懂,向大家请教。
程序来源: 《OpenSceneGraph三维渲染疫情设计与实践》 王锐,钱学雷 编著,清华大学出版社 P214 例8.23
原文代码如下:
#include <osgManipulator/CommandManager>
#include <osgManipulator/TranslateAxisDragger>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
class PickModelHandler:public osgGA::GUIEventHandler
{
protected:
        osgManipulator::Dragger* _activeDragger;
        osgManipulator::PointerInfo _pointer;
public:
        PickModelHandler()
        {
                _activeDragger=0;
        }
        bool handle(const osgGA::GUIEventAdapter& ea,
                osgGA::GUIActionAdapter& aa,
                osg::Object*, osg::NodeVisitor*)
        {
                osgViewer::View* view=dynamic_cast<osgViewer::View*>(&aa);
                if(!view)
                        return false;

                switch(ea.getEventType())
                {
                case osgGA::GUIEventAdapter::PUSH:
                        {
                                _pointer.reset();
                                osgUtil::LineSegmentIntersector::Intersections hits;
                                if(view->computeIntersections(ea.getX(),ea.getY(),hits))
                                {
                                        _pointer.setCamera(view->getCamera());
                                        _pointer.setMousePosition(ea.getX(),ea.getY());

                                        osgUtil::LineSegmentIntersector::Intersections ::iterator hitr;

                                        for(hitr=hits.begin();hitr!=hits.end();++hitr)
                                        {
                                                _pointer.addIntersection(hitr->nodePath, hitr->getLocalIntersectPoint());
                                        }

                                        osg::NodePath::iterator itr;
                                        for(itr=_pointer._hitList.front().first.begin();
                                                itr!=_pointer._hitList.front().first.end();++itr)
                                        {
                                                osgManipulator::Dragger* dragger=
                                                        dynamic_cast<osgManipulator::Dragger*>(*itr);
                                                if(dragger)
                                                {
                                                        dragger->handle(_pointer,ea,aa);
                                                        _activeDragger=dragger;
                                                        break;
                                                }
                                        }
                                }
                                break;
                        }
                case osgGA::GUIEventAdapter::DRAG:
                case osgGA::GUIEventAdapter::RELEASE:
                        {
                                if(_activeDragger)
                                {
                                        _pointer._hitIter=_pointer._hitList.begin();
                                        _pointer.setCamera(view->getCamera());
                                        _pointer.setMousePosition(ea.getX(),ea.getY());
                                        _activeDragger->handle(_pointer,ea,aa);
                                }
                               
                                if(ea.getEventType()==osgGA::GUIEventAdapter::RELEASE)
                                {
                                        _activeDragger=NULL;
                                        _pointer.reset();
                                }
                                break;
                        }
                default:break;

                }
                return true;
}

};


int _tmain(int argc, _TCHAR* argv[])
{
        osg::Node* model=osgDB::readNodeFile("cow.osg");
        osg::ref_ptr<osgManipulator::Selection>selection=new osgManipulator::Selection;
        selection->addChild(model);

        float scale=model->getBound().radius()*1.6;
        osg::ref_ptr<osgManipulator::TranslateAxisDragger>dragger=new osgManipulator::TranslateAxisDragger;
        dragger->setupDefaultGeometry();
        dragger->setMatrix(osg::Matrix::scale(scale,scale,scale)*
                osg::Matrix::translate(model->getBound().center()));

    osg::ref_ptr<osg::Group>root=new osg::Group;
       
        root->addChild(dragger.get());
        root->addChild(selection.get());
        root->addChild(osgDB::readNodeFile("axes.osg"));
        osg::ref_ptr<osgManipulator::CommandManager>manager=new osgManipulator::CommandManager;
        manager->connect(*dragger,*selection);

        osgViewer::Viewer viewer;
        viewer.addEventHandler(new PickModelHandler);
        viewer.setSceneData(root.get());
        return viewer.run();
}
问题如下:
1)请问是在哪句计算鼠标与坐标轴的交点,为什么是坐标轴而不是和牛的交点?
2)osgUtil::LineSegmentIntersector::Intersections ::iterator hitr;osg::NodePath::iterator itr; 作用是什么?iterator是什么含义?
3)for(itr=_pointer._hitList.front().first.begin();itr!=_pointer._hitList.front().first.end();++itr)是什么意思?
4)_pointer._hitIter=_pointer._hitList.begin();的作用是什么?
希望大家不吝赐教,先说谢谢了。

该用户从未签到

发表于 2011-7-12 12:34:33 | 显示全部楼层
这个拖曳器的代码已经过时了,3.0已经使用了更为适宜的架构来处理。至于您的问题:
(1)computeIntersections,至于您说的“坐标轴的交点”,我不明白您的意思
(2)-(4)iterator迭代器是STL最基本的概念,它的用法也是每个C++开发者所必须掌握的,我想您应该恶补学习一下

该用户从未签到

 楼主| 发表于 2011-7-12 13:54:34 | 显示全部楼层
谢谢array,我的基础确实不牢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表