查看: 1429|回复: 9

关于OSG+QT 添加漫游器

[复制链接]

该用户从未签到

发表于 2013-1-29 12:06:00 | 显示全部楼层 |阅读模式
如题 OSG+QT的框架中 如何使用自己定义的漫游器?   求指点。。谢谢!

该用户从未签到

发表于 2013-1-29 12:10:37 | 显示全部楼层
viewer.setCameraMainpulator()

该用户从未签到

 楼主| 发表于 2013-1-29 12:16:16 | 显示全部楼层
liuzhiyu123 发表于 2013-1-29 12:10
viewer.setCameraMainpulator()

OSGWidget::OSGWidget(QWidget *parent)
        : AdapterWidget(parent)
{
        am = new AutoManipulator();
        this->setCameraManipulator(am);
}
我是在构造函数里 set的 然后是 我的操作器的代码 继承的FirstPersonManipulator

AutoManipulator::AutoManipulator(void){
        osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
        wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),width,height);        //获得宽和高
       

}

AutoManipulator::~AutoManipulator(void){

}

void AutoManipulator::moveLeftOrRight(const double distance)
{
        _eye += _rotation * osg::Vec3d(distance, 0., 0.);
}
void AutoManipulator::moveUp(const double distance)
{
        _eye += _rotation * osg::Vec3d(0., distance, 0.);
}

void AutoManipulator::moveForward(const double distance)
{
        _eye += _rotation * osg::Vec3d(0., 0., -distance);
}

bool AutoManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us){
        float mouseX = ea.getX();
        float mouseY = ea.getY();
       
        switch(ea.getEventType()){
                case osgGA::GUIEventAdapter::KEYDOWN:
                {
                        if(ea.getKey()==osgGA::GUIEventAdapter::KEY_W){
                                moveForward(100.0);
                                return true;
                        }else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_S){
                                moveForward(-100.0);
                                return true;
                        }else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_A){
                                moveLeftOrRight(-100.0);
                                return true;
                        }else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_D){
                                moveLeftOrRight(100.0);
                                return true;
                        }
                }
                default:
                        return false;
        }
}

但是运行程序后 按键响应没用啊? 请问是为什么啊

该用户从未签到

发表于 2013-1-29 12:18:35 | 显示全部楼层
不清楚您的OSGWidget 是怎么构造的 猜不出来

该用户从未签到

 楼主| 发表于 2013-1-29 13:31:15 | 显示全部楼层
liuzhiyu123 发表于 2013-1-29 12:18
不清楚您的OSGWidget 是怎么构造的 猜不出来

请问相关知识哪里可以找到啊?

该用户从未签到

发表于 2013-1-29 13:39:30 | 显示全部楼层
什么相关知识?

该用户从未签到

 楼主| 发表于 2013-1-29 13:57:09 | 显示全部楼层
liuzhiyu123 发表于 2013-1-29 13:39
什么相关知识?

就是在QT结合OSG的框架下 添加自己的操作器。。

该用户从未签到

发表于 2013-1-29 14:00:34 | 显示全部楼层
不清楚您在说什么,这个跟qt又有什么必然的联系?

该用户从未签到

 楼主| 发表于 2013-1-29 14:34:16 | 显示全部楼层
liuzhiyu123 发表于 2013-1-29 14:00
不清楚您在说什么,这个跟qt又有什么必然的联系?

我这个在一般OSG程序里就可以 但是结合QT之后就不行了啊  

这个是adapterwidget  OSGWidget继承的这个类

#include "adapterwidget.h"

AdapterWidget::AdapterWidget(QWidget *parent)
        : QGLWidget(parent)
{
        _gw = new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());
        setFocusPolicy(Qt::ClickFocus);
}

AdapterWidget::~AdapterWidget()
{

}

QSize AdapterWidget::minimumSizeHint() const
{
        return QSize(50, 50);
}

QSize AdapterWidget::sizeHint() const
{
        return QSize(400, 400);
}

void AdapterWidget::resizeGL(int width, int height)
{
        _gw->getEventQueue()->windowResize(0, 0, width, height );
        _gw->resized(0,0,width,height);
}

void AdapterWidget::keyPressEvent( QKeyEvent* event )
{
        _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) *(event->text().toAscii().data() ) );
}

void AdapterWidget::keyReleaseEvent( QKeyEvent* event )
{
        _gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) *(event->text().toAscii().data() ) );
}

void AdapterWidget::mouseMoveEvent( QMouseEvent* event )
{
        _gw->getEventQueue()->mouseMotion(event->x(), event->y());
}

void AdapterWidget::mousePressEvent( QMouseEvent* event )
{
        int button = 0;
        switch(event->button())
        {
                case(Qt:eftButton): button = 1; break;
                case(Qt::MidButton): button = 2; break;
                case(Qt::RightButton): button = 3; break;
                case(Qt::NoButton): button = 0; break;
                default: button = 0; break;
        }
        _gw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
}

void AdapterWidget::mouseReleaseEvent( QMouseEvent* event )
{
        int button = 0;
        switch(event->button())
        {
                case(Qt::LeftButton): button = 1; break;
                case(Qt::MidButton): button = 2; break;
                case(Qt::RightButton): button = 3; break;
                case(Qt::NoButton): button = 0; break;
                default: button = 0; break;
        }
        _gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
}

void AdapterWidget::wheelEvent( QWheelEvent* event )
{
        if( event->delta()<0 )
                _gw->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_DOWN);
        else if( event->delta()>0 )
                _gw->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_UP);

       
        //osgGA::GUIEventAdapter::ScrollingMotion::SCROLL_LEFT
}

该用户从未签到

发表于 2013-1-29 15:14:00 | 显示全部楼层
_gw是否给viewer设置了设置断点调试您的程序,使用GraphicsWindowQt也可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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