[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

 

posted @ 2018-01-11 13:54  南水之源  阅读(1593)  评论(0编辑  收藏  举报