[osg][原]自定义osgGA漫游器
相机矩阵变化基础:http://blog.csdn.net/popy007/article/details/5120158
osg漫游器原理:http://blog.csdn.net/csxiaoshui/article/details/51295591
osgGA::CameraManpulator原理:http://blog.csdn.net/csxiaoshui/article/details/51303086
简单的说osgGA::CameraManipulator就是用来修改相机节点姿态的。
关于osg相机的默认姿态:http://www.cnblogs.com/lyggqm/p/8073688.html
osg一帧的绘制中会经历 事件遍历、更新遍历、渲染这三个过程。
事件遍历处理完其他事件回调后会调用漫游器的handle()函数
更新遍历处理完其他更新回调后会调用漫游器的updateCamera()函数
也就是说需要自定义漫游器最重要的两个重写函数是:
//事件处理,按键,鼠标交互处理 bool handle(const GUIEventAdapter& ea,GUIActionAdapter& us);
//更新当前帧的摄像机(通常由viewer调用) //默认实现只需设置摄像机视图矩阵。 virtual void updateCamera(osg::Camera& camera);
而 updateCamera() 一般也不会重写,而是重写getInverseMatrix()
//所有漫游器都必须实现的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