[osg][原]自定义osgGA漫游器

相机矩阵变化基础: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
相关文章
相关标签/搜索