OSG基础虚拟现实仿真软件编程技术讲解与实战.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:21 大小:297KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

OSG基础虚拟现实仿真软件编程技术讲解与实战.ppt

OSG基础虚拟现实仿真软件编程技术讲解与实战.ppt

预览

免费试读已结束,剩余 11 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

最简单的OSG程序(1)、建立和设置工程2、编辑程序viewer.frame();}viewer.sync();return0;}编译运行后,就能看到一个飞机的模型。NOTE:如果看不到模型,检查OSG1.0是否正确安装,即OSG_FILE_PATH是否设置正确。这个程序的核心是,osgProducer命名空间的Viewer类实例,这个类负责管理窗口的创建,控制投影矩阵,控制OpenGL的渲染,实现程序的主循环。它还具有控制场景渲染状态,查看帧速,抓图等功能。OsgDB命名空间的readNodeFile函数负责从文件里读入三维模型及其纹理等数据,它返回读入的节点,可以加到场景图中。主循环分三步,同步,更新和绘制,当用户按下ESC键时,osgProducer::Viewer::done()返回true,主循环结束。(3)、程序的操作键盘:总结:OSG的Viewer类本身提供了很多功能,所以,只需要简单的几句代码,就能有一个不错的程序,这些功能如果用OpenGL实现,需要很多的时间。当不再为这些基础功能操心的时候,我们就能把精力放在我们要实现的功能上面。节点的更新回调和位置姿态控制(1)、添加自定义节点classCCessna:publicosg::PositionAttitudeTransform{public:CCessna(void);~CCessna(void);private:osg::ref_ptr<osg::Node>_Model;};成员变量_Model是保存模型的指针。这样,在构造函数里,将_Model加为儿子:CCessna::CCessna(void){_Model=osgDB::readNodeFile("cessna.osg");this->addChild(_Model.get());}继续使用第一个教程的源码,将这一句:osg::Node*node=osgDB::readNodeFile("cessna.osg");viewer.setSceneData(node);改为:CCessna*cessna=newCcessna();viewer.setSceneData(cessna);就能看到效果了。(2)、给节点添加更新回调并控制节点运动classCCessnaUpdateCallback:publicosg::NodeCallback{virtualvoidoperator()(osg::Node*node,osg::NodeVisitor*nv){CCessna*cessna=dynamic_cast<CCessna*>(node);if(cessna!=NULL){cessna->update();}}};这个类覆盖了基类对操作符()的重载,所以说它实际上是一个函数对象,因为这个重载是通用的,在函数里我们要先动态转换成CCessna类的指针,然后调用她的更新成员函数。为了让这个回调起作用,不要忘了在CCessna类的构造函数里设置更新回调:this->setUpdateCallback(newCCessnaUpdateCallback());下面设计让飞机绕圈飞行,同时让飞机横滚,代码都是写计算操作,需要注意的是PositionAttitudeTransform类提供的设置姿态的方法不是使用通常习惯的HPR为参数,而是一个四元数,关于四元数数学请参考相关书籍,但是HPR向四元数的转换还是很直接的,这就是我们的setRotation方法:voidCCessna::setRotation(osg::Vec3&rot){osg::Quatq(rot.x(),osg::Vec3(1.0f,0.0f,0.0f),rot.y(),osg::Vec3(0.0f,1.0f,0.0f),rot.z(),osg::Vec3(0.0f,0.0f,1.0f));this->setAttitude(q);}在update方法里,通过设置位置和旋转来控制飞机运动,具体请查看代码。(3)、完善程序总结:要想实现自己的功能,加入自己的代码,就要定义自己的节点类,由于OSG使用了组合设计模式,我们自己定义的类在OSG看来和它自己的类是一样的,OSG的这种场景图结构,基本上是业界的一种标准,很多程序都实现了类似的结构。6、Delta3d虚拟现实仿真工具编程技术讲解与实战最简单的Delta3D程序(2)、编辑程序app->AddDrawable(terrain.get());//加载一个物体dtCore::RefPtr<dtCore::Object>brdm=newdtCore::O