[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
相關文章
相關標籤/搜索