查看: 1559|回复: 6

《三维渲染引擎设计和实现》中拖曳器例子问题

[复制链接]

该用户从未签到

发表于 2010-10-25 14:38:51 | 显示全部楼层 |阅读模式
我运行了一下,可是发现为什么不能沿着某个轴平移呀?所有的功能和osgviewer一样,为什么会这样呢?
/* -*-c++-*- Copyright (C) 2009 Wang Rui <wangray84 at gmail dot com>
* OpenSceneGraph Engine Book - Design and Implementation
* How to manipulate 3D objects with draggers
*/

#include <osgManipulator/CommandManager>
#include <osgManipulator/TranslateAxisDragger>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

class PickModelHandler : public osgGA::GUIEventHandler
{
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;
        
        if ( (ea.getModKeyMask()&osgGA::GUIEventAdapter::MODKEY_SHIFT)==0 )
            return false;
        
        switch ( ea.getEventType() )
        {
            case osgGA::GUIEventAdapter:USH:
            {
                _pointer.reset();
               
                osgUtil:ineSegmentIntersector::Intersections intersections;
                if ( view->computeIntersections(ea.getX(), ea.getY(), intersections) )
                {
                    _pointer.setCamera( view->getCamera() );
                    _pointer.setMousePosition( ea.getX(), ea.getY() );
                    
                    for ( osgUtil::LineSegmentIntersector::Intersections::iterator hitr=intersections.begin();
                          hitr != intersections.end(); ++hitr)
                    {
                        _pointer.addIntersection( hitr->nodePath, hitr->getLocalIntersectPoint() );
                    }
                    
                    for ( osg::NodePath::iterator itr=_pointer._hitList.front().first.begin();
                          itr != _pointer._hitList.front().first.end(); ++itr )
                    {
                        osgManipulator:ragger* 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;
    }

protected:
    osgManipulator::Dragger* _activeDragger;
    osgManipulator::PointerInfo _pointer;
};

int main( int argc, char** argv )
{
    osg::ArgumentParser arguments( &argc, argv );
    osg::Node* model = osgDB::readNodeFiles( arguments );
    if ( !model ) 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();
}

该用户从未签到

 楼主| 发表于 2010-10-25 16:24:33 | 显示全部楼层

RE: 《三维渲染引擎设计和实现》中拖曳器例子问题

1# a456759

我懂了。没有错误,只不过要持续按着shift键

该用户从未签到

发表于 2010-10-26 08:46:53 | 显示全部楼层
这个例子在最新的OSG中已经过时了,它的部分实现已经被直接包含在缺省的Dragger代码中~~

该用户从未签到

 楼主| 发表于 2010-10-27 10:12:00 | 显示全部楼层
3# array 我用的就是2.8.3版本的呀,没有发现已经集成了此功能呀。

该用户从未签到

发表于 2010-10-27 21:05:07 | 显示全部楼层
2.8.3是一个比较老的版本了,2.9.9是最新的开发者版本

该用户从未签到

发表于 2011-11-9 22:48:04 | 显示全部楼层
array 发表于 2010-10-26 08:46
这个例子在最新的OSG中已经过时了,它的部分实现已经被直接包含在缺省的Dragger代码中~~

请问一下Array哥,那新的拖曳器该怎么使用?能否给个例子

该用户从未签到

发表于 2011-11-10 08:55:01 | 显示全部楼层
最新的版本中本身就是有例子的,Manipulator。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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