本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html
作者写的比较好,再次收藏,希望更多的人可以看到这个文章
互联网是是一个相互分形并学习的平台,我希望我每个人可以将我们认为有价值的东西,在不损害他人利益的情况下分享给更多的人。
MatrixManipulator
场景的核心管理器是viewer,而漫游必须响应事件,比如鼠标动了,场景也在动。响应事件的类是osgGA::GUIEventHandler。我们想把响应事件的类派生一个新类出来,这个类专门用来根据响应控制viewer。这个类就是osgGA::MatrixManipulator,这个类有一些设置矩阵的公共接口,有了这些接口就可以有效的控制viewer了,根据不同的习惯,大家还会设置不同的控制方式,如同OSG自带的几个操作器,操作都不尽相同。来看一下漫游的主要流程如图6.1:
操作器必须从osgGA::MatrixManipulator派生而来。osgGA::MatrixManipulator有四个可以控制场景的重要接口:
virtual void setByMatrix(const osg::Matrixd&matrix)=0 virtual void setByInverseMatrix(const osg::Matrixd&matrix)=0 virtual osg::Matrixd getMatrix()const=0 virtual osg::Matrixd getInverseMatrix()const=0
四个矩阵接口可以有效的向viewer来传递矩阵的相关信息。
碰撞检测
最简单的碰撞检测如下图所示:
TravelManipulator.dll中用到的就是如图所示的原理,黑三角形代表没有移动之的位置,控制移动的函数是ChangePosition(osg::Vec3&delta),参数意思是要移动的相对于当前点的增量,在黑三角形没有移动时该函数在计算时先假设一点newPosition为移动后的点,而后通过连接这两个点,而后通过判断与场景的模型是否有交点来判定这个移动可不可以执行,如图所示,两者之间有个大盒子,是穿不过去的,所以只有保持在原地。就算没有这个盒子,移动后的新点又与地面在某种程序上有一个交点,这证明移动是不可行的。这可以防止用户穿过地板到达地下去。
路径漫游
使用path文件的方法如下面示例
#include<osgDB/ReadFile> #include<osgViewer/Viewer> #include<osg/Node> #include<osgGA/AnimationPathManipulator> void main() { osgViewer::Viewer viewer; viewer.setSceneData(osgDB::readNodeFile("glider.osg")); //申请一个操作器,参数为一个path文件。 osg::ref_ptr<osgGA::AnimationPathManipulator>amp=new osgGA::AnimationPathManipulator("glider.path"); //选择使用这个操作器。 viewer.setCameraManipulator(amp.get()); viewer.realize(); viewer.run(); }
我们可以用路径编辑器编辑path文件,或者可以控制程序中的某个物体的运动轨迹然后保存为path文件。