查看: 2228|回复: 7

关于OSG中使用3dconnexion

[复制链接]

该用户从未签到

发表于 2008-12-18 12:59:45 | 显示全部楼层 |阅读模式
我使用的是3dconnexion explorer,大致思路如下图:
调试过程中,void ChangePosition(osg::Vec3& delta)函数已经执行,但场景视点不变,请教大家具体原因?

思路

思路

该用户从未签到

发表于 2008-12-18 13:12:27 | 显示全部楼层
唔,抱歉我从来没用过3dconnexion,因此也不知道这里的OnSensorInput和ChangePosition函数应当作何解释。这两者是如何进行数据传递的,传递了什么类型的数据,在ChangePosition函数中进行了怎样的处理,如何传递给OSG的EventQueue或者EventCallback?楼主可以一一排查

该用户从未签到

发表于 2008-12-18 13:14:16 | 显示全部楼层
我觉得这种问题还是很难直接说清楚的,,,,关键还是看代码有什么问题比较明白~~~~~~~~~~

该用户从未签到

 楼主| 发表于 2008-12-18 14:39:02 | 显示全部楼层
MainFrm.cpp代码如下
  1.       CComPtr<IAngleAxis> pRotation;
  2.       HRESULT hr = m_pISensor->get_Rotation(&pRotation);

  3.       double angle;
  4.       pRotation->get_Angle(&angle);


  5.       CComPtr<IVector3D> pTranslation;
  6.       hr = m_pISensor->get_Translation(&pTranslation);
  7.       

  8.       double length;
  9.       pTranslation->get_Length(&length);

  10.       if (angle > 0. || length > 0.)
  11.       {
  12.          double x, y, z;
  13.          double timeFactor = 1.;

  14.          DWORD dwNow = ::GetTickCount();
  15.          if (s_dwLastDraw)
  16.          {
  17.             double period;
  18.             m_pISensor->get_Period(&period);
  19.             timeFactor = (double)(dwNow-s_dwLastDraw)/period;
  20.          }
  21.          s_dwLastDraw = dwNow;      

  22.          length *= timeFactor;
  23.          length /= ScaleTranslation*Sensitivity;
  24.          pTranslation->put_Length(length);
  25.          pTranslation->get_X(&x);
  26.          pTranslation->get_Y(&y);
  27.          pTranslation->get_Z(&z);
复制代码

[ 本帖最后由 湖面之舟 于 2008-12-26 13:36 编辑 ]

该用户从未签到

 楼主| 发表于 2008-12-18 14:40:09 | 显示全部楼层
South.cpp部分代码如下
  1. bool CSouth::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &us)
  2. {
  3. float mouseX = ea.getX();

  4. float mouseY = ea.getY();

  5. // float mouseZ = ea.getZ();

  6. switch(ea.getEventType())
  7. {
  8. case(osgGA::GUIEventAdapter::KEYDOWN):

  9. {

  10. if (ea.getKey() == VK_SPACE)//' '
  11. {
  12. us.requestRedraw();

  13. us.requestContinuousUpdate(false);

  14. return true;
  15. }
  16.             //q或e直线上升或下降
  17. if (ea.getKey() == VK_HOME || ea.getKey() == 'q' || ea.getKey() == 'Q')//home
  18. {

  19. ChangePosition(osg::Vec3 (0, 0, m_fMoveSpeed)) ;

  20. return true;
  21. }
  22. if (ea.getKey() == VK_END || ea.getKey() == 'e' || ea.getKey() == 'E') //end
  23. {

  24. ChangePosition(osg::Vec3 (0, 0, -m_fMoveSpeed)) ;
  25. return true;
  26. }
复制代码

[ 本帖最后由 湖面之舟 于 2008-12-26 13:35 编辑 ]

该用户从未签到

发表于 2008-12-18 15:25:57 | 显示全部楼层
您的意思是,这里没有按照您的意愿执行?
  1. //  MessageBox(str);
  2. mOSG->getSouth()->ChangePosition(osg:: Vec3 (100,100,1000)) ;
复制代码
那么检查ChangePosition函数中的m_vPosition变量是否有变化就可以了,如果没有变化,可以看一看IntersectVisitor的交集检测有没有问题;否则可以排除,把调试的方向转到别的地方去,比如m_vPosition的值起了什么作用,传递给哪些函数;

还有麻烦您不要直接粘贴这么大量的代码,作为从未参与过您的项目,对您的开发思路也一无所知的局外人,抱歉我很难从中整理出明确的头绪来。如果您觉得某些问题非要他人来解决不可,并且没有什么保密和商业上的顾忌的话,不妨将一个能明确表达自己的问题的工程打包传上来,不需要VS工程文件,只包含源文件和Makefile就足够了,无论NMake,mingw32还是g++的Makefile我都可以处理。非常感谢!~~~~

该用户从未签到

 楼主| 发表于 2008-12-18 17:29:50 | 显示全部楼层
呵呵,谢谢,我再调试一下

该用户从未签到

 楼主| 发表于 2008-12-19 12:37:54 | 显示全部楼层
问题已经解决,原因在于没有操作当前的操作器类,谢谢大家的指教
前沿.JPG
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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