查看: 2080|回复: 2

扩展TrackballManipulator时遇到的奇怪现象

[复制链接]

该用户从未签到

发表于 2009-5-26 08:26:34 | 显示全部楼层 |阅读模式
昨天在家里试图扩展一下TrackballManipulator.由于我的问题使用eye,center,up来描述比较直观.所以我就打算将TrackballManipulator的矩阵先取出来 然后获取这三个参数,修改后再用TrackballManipulator的ComputePosition送回去.结果总是不对.在我无限简化我的代码后.发现一个很奇怪的现象:
在handle里面:当把eye,center,up取出来然后再送回去,场景就会消失.再取出来,送回去,场景就会出现.
下面是代码:
  1. #include "StdAfx.h"
  2. #include "TrackballManipulatorEx.h"

  3. TrackballManipulatorEx::TrackballManipulatorEx(Viewer* view)
  4. {
  5.         mMoveStep=1.0;
  6.         mRotateStep=2.5;
  7.         this->mView=view;
  8. }

  9. TrackballManipulatorEx::~TrackballManipulatorEx(void)
  10. {
  11. }
  12. void TrackballManipulatorEx::home(double currentTime)
  13. {
  14.         TrackballManipulator::home(currentTime);       
  15. }
  16. bool TrackballManipulatorEx::handleKeyDown(const GUIEventAdapter&ea,GUIActionAdapter& us)
  17. {
  18.         bool handled=false;
  19.    int keyCode=ea.getKey();
  20.    unsigned int mode=ea.getModKeyMask();
  21.    bool isCtrl=(GUIEventAdapter::MODKEY_CTRL&mode)!=0;
  22.    switch(keyCode)
  23.    {
  24.    case GUIEventAdapter::KEY_F1:
  25.            {
  26.            if(isCtrl)
  27.                    {
  28.              this->mRotateStep*=1.5;
  29.                    }else
  30.                    {

  31.                            this->mMoveStep*=1.5;
  32.                    }
  33.                    break;
  34.            }
  35.    case GUIEventAdapter::KEY_F2:
  36.            {
  37.                    if(isCtrl)
  38.                    {
  39.                            this->mRotateStep/=1.5;
  40.                    }else
  41.                    {

  42.                            this->mMoveStep/=1.5;
  43.                    }
  44.                    break;
  45.            }
  46.    case GUIEventAdapter::KEY_Up:
  47.    case GUIEventAdapter::KEY_KP_Up:
  48.            {
  49.                    Matrixd mat=getMatrix();
  50.                    Vec3 eye,center,up;
  51.                    mat.getLookAt(eye,center,up,_distance);
  52.                    computePosition(eye,center,up);
  53.                    handled=true;
  54.                    break;
  55.            }
  56.    case GUIEventAdapter::KEY_Down:
  57.    case GUIEventAdapter::KEY_KP_Down:
  58.            {
  59.                    Matrixd mat=getMatrix();
  60.                    Vec3 eye,center,up;
  61.                    mat.getLookAt(eye,center,up,_distance);                  
  62.                    computePosition(eye,center,up);
  63.                    handled=true;
  64.                    break;
  65.            }
  66.          
  67.    }
  68.    return handled;
  69. }
  70. bool TrackballManipulatorEx::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &us)
  71. {
  72.         bool handled=TrackballManipulator::handle(ea,us);
  73.         if(handled){
  74.                
  75.        
  76.         }       
  77.         else{
  78.                 switch(ea.getEventType())
  79.                 {
  80.                 case GUIEventAdapter::KEYDOWN:
  81.                         {
  82.                handled=handleKeyDown(ea,us);
  83.                            break;
  84.                         }
  85.                 }
  86.         }
  87.         return handled;
  88. }
复制代码
Stdafx中就是所有对osg头文件的引用.
另外该类public 派生于TrackballManipulator.
其中最诡异的就是:
handleKey中KEY_UP和KEY_DOWN的代码.其中KEY_UP会让场景消失,KEY_DOWN会让场景再次出现在原来的地方.

期待高人指点.

该用户从未签到

发表于 2009-5-26 09:02:55 | 显示全部楼层
这里有一个关键的问题:
MatrixManipulator::getMatrix()取得的是漫游器的空间位置矩阵,也就是摄像机观察矩阵的逆矩阵。从这个矩阵求取getLookAt肯定是错的,应该使用MatrixManipulator::getInverseMatrix()。至于楼主代码有没有其它问题我暂时没有细看。

该用户从未签到

 楼主| 发表于 2009-5-26 09:56:51 | 显示全部楼层
多谢.. 回家再看看 好像是有这么一回事.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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