|
楼主 |
发表于 2011-5-29 15:15:37
|
显示全部楼层
本帖最后由 lanxun1988 于 2011-5-29 15:17 编辑
回复 3# garyliyong
您好,非常感谢您的指导。我根据我的理解,我需要在相机的事件回调中用setViewMatrixAsLookAt进行设置。我的几个重要代码如下:
(1)首先定义了一个class CCameraEventCallback :public osg::NodeCallback 的相机回调类,类中几个重要的代码是这样的:
-
- virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
- {
- if(nv->getVisitorType()==osg::NodeVisitor::EVENT_VISITOR)
- {
- osg::ref_ptr<osgGA::EventVisitor> ev = dynamic_cast<osgGA::EventVisitor*> (nv);
- if(ev)
- {
- osgGA::GUIActionAdapter* aa = ev->getActionAdapter();
- osgGA::EventQueue::Events& events = ev->getEvents();
- for(osgGA::EventQueue::Events::iterator itr = events.begin();itr != events.end();++itr)
- {
- handle(*(*itr),*(aa),node )//这个里面去改相机的位置
- }
- }
- }
- }
复制代码
上面的handle的具体代码是:
- bool CCameraEventCallback::handle(const osgGA::GUIEventAdapter& ea ,osgGA::GUIActionAdapter& aa,osg::Node* node)
- {
- switch(ea.getEventType())
- {
- case osgGA::GUIEventAdapter::DOUBLECLICK://如果是鼠标双击事件
- if(ea.getButton()==1)//确保是鼠标左键双击
- {
- osg::Vec3 cameraEye;
- osg::Vec3 toCenter;
- osg::Vec3 cameraUp;//这些变量用来保存camera的各个参数
- //自己写的那个漫游器类的初始化为
- // m_vPosition = osg::Vec3(0.0f,-70.0f,0.0f);
- // m_vRotation = osg::Vec3(osg::PI_2,0.0f,0.0f);
- dynamic_cast<osg::Camera*>(node)->getViewMatrixAsLookAt(cameraEye,toCenter,cameraUp);//获取当前camera的各个参数
- //断点后发现cameraEye确实是(0.0f,-70.0f,0.0f)
- dynamic_cast<osg::Camera*>(node)->setViewMatrixAsLookAt(osg::Vec3(cameraEye.x(),cameraEye.y()+50,cameraEye.z()),toCenter,cameraUp);//只是想让这个cameraEye的y变大一点,也就是感觉上相机往前进了一些
- AfxMessageBox("双击事件捕获到了");//这个是我来测试双击事件有没有捕获到的
- }
- break;
- default:
- break;
- }
- return false;
- }
复制代码
(3)另外,相机初始时候是这样设置的
- mViewer->addSlave(camera.get());
- mViewer->setCameraManipulator(new CTravelManipulator(mViewer));
- camera->setEventCallback(new CCameraEventCallback());//用camera来设置事件回调,因此handle函数中的node其实就是这个camera
- mViewer->setSceneData(mRoot.get());
复制代码
但是很悲催的是,相机的位置依旧没有改变。。。。不知道我哪里理解错了。。。。。至于您说的第一种去漫游器里面改变matrix的值的方法,我不知道具体该如何操作。。。。。麻烦您了 |
|