查看: 3650|回复: 9

【新手求助】OSG拖拽器旋转或缩放时,位置发生变化。

[复制链接]

该用户从未签到

发表于 2012-9-6 12:08:16 | 显示全部楼层 |阅读模式
看Array大哥的例子,自己也做了做,后来发现问题,Array大哥的例子中,如果使用旋转和缩放拖拽器时,物体就会发生偏移,这是个问题啊。如何解决的呢?dragger中有一个方法是removeTransformUpdating(),不知道是否与之相关,相关的话该如何设置呢?以下是Array大哥osg edit例子中的部分代码。
bool PickModelHandler::SelectNode( const osgGA::GUIEventAdapter &ea,
                                                                  osgGA::GUIActionAdapter &aa ){
    osgViewer::View* view = dynamic_cast<osgViewer::View*>( &aa );
        _pointer.reset();
        TestOperationType();
        osgUtil:ineSegmentIntersector::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 ){
                                if( !_hasSelected ){
                                        switch( _selectType ){
                                                case GEOD:
                                                        {
                                                                osg::ref_ptr<osg::Geode> gode = dynamic_cast<osg::Geode*>( *itr );
                                                                if( gode ){
                                                                        float scale = gode->computeBound().radius() * 1.6;
                                                                        _selection->setMatrix( osg::Matrix::identity() );
                                                                        _dragger->setMatrix( osg::Matrix::scale( scale, scale, scale ) *
                                                                                osg::Matrix::translate( gode->computeBound().center() ) );
                                                                        gode->getParent( 0 )->addChild( _selection.get() );
                                                                        gode->getParent( 0 )->addChild( _dragger.get() );
                                                                        _selection->addChild( gode.get() );
                                                                        gode->getParent( 0 )->removeChild( gode.get() );
                                                                        _dragger->setNodeMask( 1 );
                                                                        _hasSelected = true;
                                                                        return true;
                                                                }
                                                        }
                                                        break;

                                                case MODEL:
                                                        {
                                                                osg::ref_ptr<osg::Group> group = dynamic_cast<osg::Group*>( *itr );
                                                                if( group ){
                                                                        if( group->getName() == "MODEL" ){
                                                                                float scale = group->computeBound().radius() * 1.6;
                                                                                _selection->setMatrix( osg::Matrix::identity() );
                                                                                _dragger->setMatrix( osg::Matrix::scale( scale, scale, scale ) *
                                                                                        osg::Matrix::translate( group->computeBound().center() ) );
                                                                                group->getParent( 0 )->addChild( _selection.get() );
                                                                                group->getParent( 0 )->addChild( _dragger.get() );
                                                                                _selection->addChild( group.get() );
                                                                                group->getParent( 0 )->removeChild( group.get() );
                                                                                _dragger->setNodeMask( 1 );
                                                                                _hasSelected = true;
                                                                                return true;
                                                                        }
                                                                }
                                                        }
                                                        break;
                                        }
                                }else{
                                        osgManipulator:ragger* dragger = dynamic_cast<osgManipulator::Dragger*>( *itr );
                                        if( dragger ){
                                                dragger->handle( _pointer, ea, aa );
                                                _activeDragger = dragger;
                                                return true;
                                        }
                                }
                }
        }else{
                _draggerTranslate->setNodeMask( 0 );
                _draggerRotate->setNodeMask( 0 );
                _draggerScale->setNodeMask( 0 );
                _hasSelected = false;
                if( _selection->getNumChildren() != 0 ){
                        osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>( _selection->getParent( 0 ) );
                        if( mt ){
                                mt->setMatrix( mt->getMatrix() * _selection->getMatrix() );
                                mt->removeChild( _selection.get() );
                                mt->removeChild( _dragger.get() );
                                mt->addChild( _selection->getChild( 0 ) );
                                _selection->removeChild( _selection->getChild( 0 ) );
                        }else{
                                osg::MatrixTransform* mt = new osg::MatrixTransform;
                                mt->setMatrix( _selection->getMatrix() );
                                _selection->getParent( 0 )->addChild( mt );
                                _selection->getParent( 0 )->removeChild( _dragger.get() );
                                _selection->getParent( 0 )->removeChild( _selection.get() );
                                mt->addChild( _selection->getChild( 0 ) );
                                _selection->removeChild( _selection->getChild( 0 ) );
                        }
                }
                return view->getCameraManipulator()->handle( ea, aa );
        }
        return false;
}

bool PickModelHandler::DragNode( const osgGA::GUIEventAdapter &ea,
                                                                osgGA::GUIActionAdapter &aa ){
        osgViewer::View* view = dynamic_cast<osgViewer::View*>( &aa );
        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();
                }
                return true;
        }else
                return view->getCameraManipulator()->handle( ea, aa );
}
该如何调整呢?搞了好久了。不知道怎么整了,大牛出来帮帮小弟吧。

该用户从未签到

发表于 2012-9-6 17:35:37 | 显示全部楼层
OSG 3.0版本以后的Manipulator有了很大改变,函数接口和使用方法都被大大简化了,您不妨看一看

该用户从未签到

 楼主| 发表于 2012-9-6 21:09:36 | 显示全部楼层
array 发表于 2012-9-6 17:35
OSG 3.0版本以后的Manipulator有了很大改变,函数接口和使用方法都被大大简化了,您不妨看一看

正在研读,感觉不应该出现这种问题的,要是谁有好的拖拽器的例子,不要藏了,拿出来吧。
array大哥要是闲的话,不妨帮小菜看看,嘿嘿。

该用户从未签到

发表于 2012-9-7 01:07:21 | 显示全部楼层
参照osgexample的osgManipulator例子,确实很省事,有很多种dragger可以直接用,但是我想去掉那些诸如TabBoxDragger的外框和坐标轴,该如何去掉啊?

“如果使用旋转和缩放拖拽器时,物体就会发生偏移” 拖拽器是对node进行操作,而camera的视角是不变的,这样node的位置变了,当然看上去会有偏移了,不知道这样理解对不?

该用户从未签到

发表于 2012-9-7 08:23:37 | 显示全部楼层
看看我的帖子

该用户从未签到

发表于 2012-9-7 08:44:15 | 显示全部楼层
libGizmo

该用户从未签到

发表于 2012-9-7 19:25:35 | 显示全部楼层
您的帖子确实很好很强大,期待源码哦!

该用户从未签到

 楼主| 发表于 2012-9-7 23:29:19 | 显示全部楼层
xyjackxjw 发表于 2012-9-7 01:07
参照osgexample的osgManipulator例子,确实很省事,有很多种dragger可以直接用,但是我想去掉那些诸如TabBo ...

我在拖拽的时候,摄像机对视角的操作返回的是true,所以不存在这样的问题,即便向您说的这样的话,那么其他的物体也应该会有所偏移,最最主要的很奇怪的一个现象就是,如果选中的是两个物体,我们进行对x轴的缩放,缩放完成后,位置改变是两个物体都相对的移动了点,而且移动的方向是不一样的。这个问题很困扰啊。
不知道有没有高人看看,到底应该是怎么回事。
首先osg拖拽的话,是需要将结点绑定到selection中,而且为了不重复显示要替换掉原结点,操作完后要替换回来,感觉这块很不适应,所有的结点都是以matrixtransform结点来构造的。
所以,有的时候,在不停的获取parent时,总会出错,但是这次这个例子,实在不明白,按理说,替换节点那是没有问题的。dragger也是没有问题。o(︶︿︶)o 唉。

该用户从未签到

 楼主| 发表于 2012-9-7 23:31:05 | 显示全部楼层
xyjackxjw 发表于 2012-9-7 19:25
您的帖子确实很好很强大,期待源码哦!

。。。偶都惭愧,总是问些比较简单的问题。还在学习中,好多都不懂。
期待您也能帮帮我。

该用户从未签到

发表于 2013-5-4 14:59:16 | 显示全部楼层
liuzhiyu123 发表于 2012-9-7 08:23
看看我的帖子

您好,我按照上面拖拽器的例子实现了拖拽,然后想每拖拽一次后获取节点模型的世界坐标,也就是作为关键点来形成路径的,请问该怎么做呢?
不知道我说明白了没?期待您的回复,先谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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