查看: 1605|回复: 4

该变视点位置

[复制链接]

该用户从未签到

发表于 2010-7-15 12:19:45 | 显示全部楼层 |阅读模式
class KeySwitchManipulatorExt:public osgGA::KeySwitchMatrixManipulator
{
public:
virtual bool handle(const GUIEventAdapter& ea,GUIActionAdapter& us);
private:
osg::Vec3f  eye;
osg::Vec3f  center;
osg::Vec3f  up;
};
bool KeySwitchManipulatorExt::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
{
bool resu=false;
   
osgViewer::View* view=dynamic_cast<osgViewer::View*>(&us);

if (!ea.getHandled()&&ea.getEventType()==GUIEventAdapter:EFT_MOUSE_BUTTON||ea.getEventType()==GUIEventAdapter::MOVE)
{
  std::string str=getCurrentMatrixManipulator()->className();
  if ("Trackball"==str)
  {
   view->getCamera()->getViewMatrixAsLookAt(eye,center,up);
  }
   
}
  resu=KeySwitchMatrixManipulator::handle(ea,us);
  if (ea.getEventType()==GUIEventAdapter::KEYDOWN)
  {
    std::string str1=getCurrentMatrixManipulator()->className();
if ("Terrain"==str1)
{
  
  view->getCamera()->setViewMatrixAsLookAt(eye,center,up);

  
}
  }
return resu;
}
这是我重写keyswitchmatrixmanipulator的handle函数,我想当控制器是Trackball时,记录当前相机视点位置,切换到Terrain控制器时不要改变相机视点的位置,但是这样做仍然无效,相机的位置还是会回到原来Terrain控制器时的那个位置,这是什么原因?

该用户从未签到

发表于 2010-7-15 23:33:46 | 显示全部楼层
您应该继续osgGA::MatrixManipulator,,再重写handle,,具体的代码类似TrackballManipulator

该用户从未签到

 楼主| 发表于 2010-7-17 09:20:28 | 显示全部楼层
版主,能不能说清楚点啊?

该用户从未签到

发表于 2010-7-17 09:31:05 | 显示全部楼层
请您参考osgGA::TrackballManipulator的实现代码

该用户从未签到

发表于 2010-7-18 15:21:14 | 显示全部楼层
其它的代码我没有细看,不过这里:
  1. if ("Terrain"==str1)
复制代码
显然不会有正确的结果,两个漫游器的className()的内容分别是"TrackballManipulator"和"TerrainManipulator"
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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