OSG-漫游

转载 2017年08月28日 22:18:52
本文转至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文件。



相关文章推荐

UE4深入学习

UE4 深入讲解,很多东西了解的都比较深,讲得也很详细。 想学习UE4的可以去看看。 因为博主禁止转载,所以就放个链接吧:https://zhuanlan.zhihu.com/insideue4...

osg demo1 hello,osg

//功能:Hello,osg! #include #include void main() { osgViewer::Viewer viewer; viewer.setSceneData(...

OSG漫游系统

  • 2015年01月06日 15:53
  • 5.73MB
  • 下载

OSG虚拟校园漫游

  • 2013年09月26日 14:36
  • 2.76MB
  • 下载

OSG漫游:实现按键控制的操作器

OSG提供了几种manipulator(操作器),已经能胜任很多场合了。但玩过射击类游戏的都比较熟悉使用按键的方式控制人物角色的移动,自己也想来实现一个,于是参考了OSG程序设计 一书,进行实现。功能...
  • chlk118
  • chlk118
  • 2015年08月03日 20:17
  • 2207

osg中漫游器的原理——osgGA::CameraManipulator(二)

osgGA库中所有漫游器的基类是CameraManipulator,本文就对这个类进行一个完整的解析。通过之前的分析(详细请参考这一些列的第一篇),可以知道为了实现一个自定义的漫游器,我们至少需要实现...

osg 自动漫游

介绍两种漫游方式,都是操作器的方式,但是都有所不同。 第一种为节点跟踪漫游器(NodeTrackerManipulator),主要是当前视点跟随这个节点的包围盒中心点,所以只要设置这个节点一个路径动...

OpenGL的视图变换与OSG漫游器

在OpenGL固定管线内容中有一个过程是进行视图变换,主要目的是将世界坐标变换到相机坐标空间中,OpenGL的视图变换所处的位置如下图所示: 在OSG中通过重写漫游器的时候需要实现的4个虚函...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG-漫游
举报原因:
原因补充:

(最多只允许输入30个字)