查看: 854|回复: 2

基于mfc的osg 漫游器键盘鼠标操作问题

[复制链接]

该用户从未签到

发表于 2015-5-14 13:27:33 | 显示全部楼层 |阅读模式
地形模型加载之后,通过键盘实现前进后退,通过鼠标实现移动视角,怎么实现。
下面这段代码,好像没什么用。是不是mfc 中不是这样写。下面这段代码我是从网上看到的。在他们的程序中就可以,为啥我的不可以。郁闷



bool TrackballManipulator::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() == 0x20)
                        {
                                us.requestRedraw();
                                us.requestContinuousUpdate(false);

                                return true;

                        }

                        // 上移键key_home
                        if (ea.getKey() == 0xFF50)
                        {
                                ChangePosition(osg::Vec3(0, 0, m_fMoveSpeed));

                                return true;
                        }

                        // 下移键key_end
                        if (ea.getKey() == 0xFF57)
                        {
                                ChangePosition(osg::Vec3(0, 0, -m_fMoveSpeed));

                                return true;
                        }

                        // 加速enter
                        if (ea.getKey() == 0x2B)
                        {
                                m_fMoveSpeed += 1.0f;

                                return true;
                        }

                        // 减少速度
                        if (ea.getKey() == 0x2D)
                        {
                                m_fMoveSpeed -= 0.1f;

                                if(m_fMoveSpeed < 1.0f)
                                {
                                        m_fMoveSpeed = 1.0f;
                                }

                                return true;
                        }

                        // 前进
                        if (ea.getKey() == 0xFF52 || ea.getKey() == 0x57 || ea.getKey() == 0x77)
                        {
                                ChangePosition(osg::Vec3(0, m_fMoveSpeed * sinf(osg:I_2 + m_vRotation._v[2]), 0));
                                ChangePosition(osg::Vec3(m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));

                                return true;
                        }

                        // 后退
                        if (ea.getKey() == 0xFF54 || ea.getKey() == 0x53 || ea.getKey() == 0x73)
                        {
                                ChangePosition(osg::Vec3(0, -m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]), 0));
                                ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0,0));

                                return true;
                        }

                        // 向左
                        if (ea.getKey() == 0x41 || ea.getKey() == 0x61)
                        {
                                ChangePosition(osg::Vec3(0, m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0));
                                ChangePosition(osg::Vec3(-m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0,0));

                                return true;
                        }
                       
                        // 向右
                        if (ea.getKey() == 0x44 || ea.getKey() == 0x64)
                        {
                                ChangePosition(osg::Vec3(0, -m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation._v[2]),0));
                                ChangePosition(osg::Vec3(m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation._v[2]),0,0));

                                return true;
                        }

                        // 向右转
                        if (ea.getKey() == 0xFF53)
                        {
                                m_vRotation._v[2] -= osg:egreesToRadians(m_fAngle);
                        }

                        // 向左转
                        if (ea.getKey() == 0xFF51)
                        {
                                m_vRotation._v[2] += osg::DegreesToRadians(m_fAngle);
                        }

                        // 改变屏幕角度F键
                        if (ea.getKey() == 0x46 || ea.getKey() == 0x66)
                        {
                                m_fAngle -= 0.2;

                                return true;
                        }

                        //G键
                        if (ea.getKey() == 0x47 || ea.getKey() == 0x66)
                        {
                                m_fAngle += 0.2;

                                return true;
                        }

                        return true;
        }

        case(osgGA::GUIEventAdapter::PUSH):

                if (ea.getButton() == 1)
                {
                        m_fpushX = mouseX;
                        m_fpushY = mouseY;

                        m_bLeftButtonDown = true;
                }

                return true;

                // 拖动
        case(osgGA::GUIEventAdapter::DRAG):

                if (m_bLeftButtonDown)
                {
                        m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle * (mouseX - m_fpushX)) / 200;
                        m_vRotation._v[0] += osg::DegreesToRadians(1.1 * (mouseY - m_fpushY)) / 200;

                        if (m_vRotation._v[0] >= 3.14)
                        {
                                m_vRotation._v[0] = 3.14;
                        }

                        if (m_vRotation._v[0] <= 0)
                        {
                                m_vRotation._v[0] = 0;
                        }
                }

                return false;

                // 鼠标释放
        case(osgGA::GUIEventAdapter::RELEASE):

                if (ea.getButton() == 1)
                {
                        m_bLeftButtonDown = false;
                }

                return false;

        default:

                return false;
}
        }

该用户从未签到

 楼主| 发表于 2015-5-14 13:32:13 | 显示全部楼层
我是新手啊,跪求大神赐教啊

该用户从未签到

发表于 2015-6-5 15:38:57 | 显示全部楼层
首先检测::MOVE   鼠标滑动改变视角,也就是改变m_vRotation,鼠标滑动有两个分量,水平是视口左右移动,垂直是上下移动,思路有了,你可以动手试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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