相机矩阵变化基础:http://blog.csdn.net/popy007/article/details/5120158html
osg漫游器原理:http://blog.csdn.net/csxiaoshui/article/details/51295591函数
osgGA::CameraManpulator原理:http://blog.csdn.net/csxiaoshui/article/details/51303086ui
简单的说osgGA::CameraManipulator就是用来修改相机节点姿态的。spa
关于osg相机的默认姿态:http://www.cnblogs.com/lyggqm/p/8073688.html.net
osg一帧的绘制中会经历 事件遍历、更新遍历、渲染这三个过程。code
事件遍历处理完其余事件回调后会调用漫游器的handle()函数htm
更新遍历处理完其余更新回调后会调用漫游器的updateCamera()函数blog
也就是说须要自定义漫游器最重要的两个重写函数是:事件
//事件处理,按键,鼠标交互处理 bool handle(const GUIEventAdapter& ea,GUIActionAdapter& us);
//更新当前帧的摄像机(一般由viewer调用) //默认实现只需设置摄像机视图矩阵。 virtual void updateCamera(osg::Camera& camera);
而 updateCamera() 通常也不会重写,而是重写getInverseMatrix() ip
//全部漫游器都必须实现的4个纯虚函数 virtual void setByMatrix(const osg::Matrixd& matrix){} //设置相机的位置姿态矩阵 virtual void setByInverseMatrix(const osg::Matrixd& matrix){} //设置相机的视图矩阵 virtual osg::Matrixd getMatrix() const{return osg::Matrix();} //获取相机的姿态矩阵 virtual osg::Matrixd getInverseMatrix() const; //获取相机的视图矩阵
通常重写getInverseMatrix()。 由于这个函数返回的矩阵在updateCamera中使用:
virtual void updateCamera(osg::Camera& camera) { camera.setViewMatrix(getInverseMatrix()); }
因此,自定义函数最重要的两个重写函数是:
handle 和 getInverseMatrix