查看: 1223|回复: 3

摄像机漫游奇 奇怪 问题 求助!

[复制链接]

该用户从未签到

发表于 2011-6-24 09:45:04 | 显示全部楼层 |阅读模式
这个漫游器,当同时按下 方向键(wasd) 和 鼠标左键 进行旋转 的时候,鼠标和键盘大概在同时释放时。摄像机 会一直 沿着 某个放心 移动。 keydown 后。鼠标释放后,keyup 没有在执行 不知道为什么? 看了好久了。请大家 帮忙看下 什么问题?我在控制台下 测试的。

  1. #ifndef _CAMERAMANIPULATOR_H_
  2. #define _CAMERAMANIPULATOR_H_
  3. #include <osgGA/MatrixManipulator>

  4. class FPCameraManipulator : public osgGA::MatrixManipulator {
  5. public:
  6.         FPCameraManipulator();
  7.         ~FPCameraManipulator(){};

  8.         virtual void setByMatrix( const osg::Matrixd& matrix );
  9.         virtual void setByInverseMatrix( const osg::Matrixd& matrix );
  10.         virtual osg::Matrixd getMatrix() const;
  11.         virtual osg::Matrixd getInverseMatrix() const;
  12.         virtual bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa );

  13.         void updatePosition();
  14. private:
  15.         osg::Vec3 m_vPosition;
  16.         osg::Vec3 m_vRotation;
  17.         osg::Vec2 m_vPos;
  18.         osg::Vec2 m_vTemp;
  19.         std::set<int> m_kSet;
  20.         float m_fMoveSpeed;
  21. protected:
  22. };
  23. #endif
复制代码

  1. #include "CameraManipulator.h"

  2. FPCameraManipulator::FPCameraManipulator() : m_fMoveSpeed( 10.5f ){
  3.         m_vPosition = osg::Vec3( 0.0f, 0.0f, 0.0f );
  4.         m_vRotation = osg::Vec3( osg::PI_2, 0.0f, 0.0f );
  5.         m_kSet.clear();
  6. }

  7. void FPCameraManipulator::setByMatrix( const osg::Matrixd& matrix ){
  8.         m_vPosition = matrix.getTrans();
  9.         m_vRotation = matrix.getRotate().asVec3();
  10. }
  11. void FPCameraManipulator::setByInverseMatrix( const osg::Matrixd& matrix ){
  12.         setByMatrix( osg::Matrixd::inverse( matrix ) );
  13. }

  14. osg::Matrixd FPCameraManipulator::getMatrix() const{
  15.         osg::Matrixd mat;
  16.         mat.makeRotate( m_vRotation._v[0], osg::Vec3( 1.0f, 0.0f, 0.0f ),
  17.                 m_vRotation._v[1], osg::Vec3( 0.0f, 1.0f, 0.0f ),
  18.                 m_vRotation._v[2], osg::Vec3( 0.0f, 0.0f, 1.0f ) );
  19.         return mat * osg::Matrixd::translate( m_vPosition );
  20. }

  21. osg::Matrixd FPCameraManipulator::getInverseMatrix() const{
  22.         osg::Matrixd mat;
  23.         mat.makeRotate( m_vRotation._v[0], osg::Vec3( 1.0f, 0.0f, 0.0f ),
  24.                 m_vRotation._v[1], osg::Vec3( 0.0f, 1.0f, 0.0f ),
  25.                 m_vRotation._v[2], osg::Vec3( 0.0f, 0.0f, 1.0f ) );
  26.         return osg::Matrixd::inverse( mat * osg::Matrixd::translate( m_vPosition ) );
  27. }

  28. bool FPCameraManipulator::handle( const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa ){
  29.         switch( ea.getEventType() ){
  30.                 case osgGA::GUIEventAdapter::FRAME:
  31.                         FPCameraManipulator::updatePosition();
  32.                         return true;

  33.                 case osgGA::GUIEventAdapter::KEYDOWN:
  34.                         if( ea.getKey() == 0x20 ){
  35.                                 aa.requestRedraw();
  36.                                 aa.requestContinuousUpdate( false );
  37.                                 return true;
  38.                         }
  39.                         m_kSet.insert( ea.getKey() );
  40.                         return false;

  41.                 case osgGA::GUIEventAdapter::KEYUP:
  42.                         m_kSet.erase( ea.getKey() );
  43.                         return true;

  44.                 case osgGA::GUIEventAdapter::PUSH:
  45.                         if( ea.getHandled() )
  46.                                 return false;
  47.                         if( ea.getButton() == 1 ){
  48.                                 m_vPos.set( ea.getX(), ea.getY() );
  49.                                 m_vTemp.set( m_vRotation._v[2], m_vRotation._v[0] );
  50.                                 return true;
  51.                         }
  52.                         return false;

  53.                 case osgGA::GUIEventAdapter::DRAG:
  54.                         if( ea.getHandled() )
  55.                                 return false;
  56.                         m_vRotation._v[2] = m_vTemp.x() - 0.1 * osg::DegreesToRadians( ea.getX() - m_vPos.x() );
  57.                         m_vRotation._v[0] = m_vTemp.y() + 0.1 * osg::DegreesToRadians( ea.getY() - m_vPos.y() );
  58.                         return true;

  59.                 default:
  60.                         return false;
  61.         }
  62. }

  63. void FPCameraManipulator::updatePosition(){
  64.         osg::Vec3f eye, center, up, orient, orient_upright;
  65.         FPCameraManipulator::getInverseMatrix().getLookAt( eye, center, up );
  66.         orient.set( ( center - eye ).x() / ( center - eye ).length(),
  67.                 ( center - eye ).y() / ( center - eye ).length(),
  68.                 ( center - eye ).z() / ( center - eye ).length() );
  69.         orient.normalize();
  70.         orient_upright.set( ( orient ^ up ).x() / ( orient ^ up ).length(),
  71.                 ( orient ^ up ).y() / ( orient ^ up ).length(),
  72.                 ( orient ^ up ).z() / ( orient ^ up ).length() );
  73.         orient_upright.normalize();
  74.         float avgfMoveSpeed = m_fMoveSpeed / m_kSet.size();
  75.         if( m_kSet.find( 'w' ) != m_kSet.end() ){
  76.                 m_vPosition += osg::Vec3( avgfMoveSpeed * orient.x(),
  77.                         avgfMoveSpeed * orient.y(),
  78.                         avgfMoveSpeed * orient.z() );
  79.         }
  80.         if( m_kSet.find( 's' ) != m_kSet.end() ){
  81.                 m_vPosition += osg::Vec3( -avgfMoveSpeed * orient.x(),
  82.                         -avgfMoveSpeed * orient.y(),
  83.                         -avgfMoveSpeed * orient.z() );
  84.         }
  85.         if( m_kSet.find( 'a' ) != m_kSet.end() ){
  86.                 m_vPosition += osg::Vec3( -avgfMoveSpeed * orient_upright.x(),
  87.                         -avgfMoveSpeed * orient_upright.y(),
  88.                         -avgfMoveSpeed * orient_upright.z() );
  89.         }
  90.         if( m_kSet.find( 'd' ) != m_kSet.end() ){
  91.                 m_vPosition += osg::Vec3( avgfMoveSpeed * orient_upright.x(),
  92.                         avgfMoveSpeed * orient_upright.y(),
  93.                         avgfMoveSpeed * orient_upright.z() );
  94.         }
  95.         if( m_kSet.find( 'q' ) != m_kSet.end() )
  96.                 m_vPosition += osg::Vec3( 0.0f, 0.0f, m_fMoveSpeed );
  97.         if( m_kSet.find( 'e' ) != m_kSet.end() )
  98.                 m_vPosition += osg::Vec3( 0.0f, 0.0f, -m_fMoveSpeed );
  99. }
复制代码

该用户从未签到

 楼主| 发表于 2011-6-24 13:26:51 | 显示全部楼层
同时按下 wasd 和 鼠标左键 事。ea.getKey() 函数 在 updown 事件里 得到的不再是 插入的值。好像是 3 或 4.为什么 ea.getKey()  会 3 或4呢?  
还有 就是 双击 鼠标 KEYDOWN 事件 也响应?为什么呢?

该用户从未签到

发表于 2011-6-27 08:18:34 | 显示全部楼层
我想这应该是您自己的程序的问题,或者您的键盘出了毛病……

该用户从未签到

 楼主| 发表于 2011-6-27 08:58:22 | 显示全部楼层
可能是 键盘 鼠标 的 问题了。 放在 别 地机器上 倒没事了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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