相機矩陣變化基礎: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