当前位置: 首页 > article >正文

场景交互与场景漫游-路径漫游(7)

路径漫游

        按照指定的路径进行漫游对一个演示是非常重要的。在osgViewer中,当第一次按下小写字母“z”时,开始记录动画路径;待动画录制完毕,按下大写字母“Z”,保存动画路径文件;使用osgViewer读取该动画路径文件时,会回放此动画路径的内容。按照指定的路径漫游称为路径漫游。同样,也可以指定物体按照指定的路径进行运动,此时就称为路径动画,其实它们本质是一样的,只是对路径的使用方法不同而已,但按照指定的路径比较简单。osgGA::MatrixManipulator有一个派生类一osgGA:AnimationPathManipulator 类,其继承关系图如图8-19所示。

图8-19 osgGA::AnimationPathManipulator 的继承关系图

        osgGA:: AnimationPathManipulator 继承自osgGA::MatrixManipulator类在使用时没有必要考虑它内部是否实现矩阵变换,使用这个类的主要目的是但它在内部已经实现了矩阵变换等一系列的操作。实现路径漫游。

        在osgGA::AnimationPathManipulator的类成员中已经包含了很多与路径关联的函数,此时读者的选择非常多,关联函数如下:

// 构造函数本身就关联

AnimationPathManipulator(osg::AnimationPath*animationPath = 0);

AnimationPathManipulator(const std::string &fileName);

// 得到或者设置路径

void setAnimationPath(osg::AnimationPath *animationPath);

const osg::AnimationPath *getAnimationPath()const;

了解了这些以后,路径漫游就变得非常简单了,其主要步骤如下:

<1> 创建一个osgGA::AnimationPathManipulator动画路径操作器实例

<2> 关联需要的路径。

<3> 设置当前视图场景操作器,关联该动画路径操作器。

viewer->setCameraMainpulator(camera);

        对于如何创建路径,方法有很多,读者可以使用插值的方式来得到一些关键点插值,或者从3d max导出路径,这些方法都比较简单,具体因不同的项目需要,路径录制的方式也不一样。

路径漫游示例

        路径漫游示例的代码如程序清单8-9所示

/* 路径漫游奇 */
void animationManipulator_8_9(const string &strDataFolder)
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
	osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
	traits->x = 50;
	traits->y = 50;
	traits->width = 1000;
	traits->height = 800;
	traits->windowDecoration = true;
	traits->doubleBuffer = true;
	traits->sharedContext = 0;

	osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

	osg::ref_ptr<osg::Camera> camera = new osg::Camera;
	camera->setGraphicsContext(gc.get());
	camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
	GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
	camera->setDrawBuffer(buffer);
	camera->setReadBuffer(buffer);

	viewer->addSlave(camera.get());
	osg::ref_ptr<osg::Group> root = new osg::Group;

	// 读取cow模型
	string strDataPath = strDataFolder + "cow.osg";
	osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile(strDataPath);

	// 申请一个操作器
	string strPath = strDataFolder + "animation.path";
	osg::ref_ptr<osgGA::AnimationPathManipulator> apm = new osgGA::AnimationPathManipulator(strPath);

	// 启用操作器
	viewer->setCameraManipulator(apm.get());

	root->addChild(cow.get());

	// 优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(root.get());

	viewer->setSceneData(root.get());

	viewer->realize();
	viewer->run();
}

                运行序,截图如图8-20所示

图8-20路径漫游示例截图


http://www.kler.cn/news/134982.html

相关文章:

  • 腾讯云轻量数据库性能如何?轻量数据库租用配置价格表
  • JavaScript实现飞机发射子弹详解(内含源码)
  • 超聚变服务器关闭超线程CPU的步骤(完整版)
  • 【开源】基于Vue.js的在线课程教学系统的设计和实现
  • 右键菜单和弹出菜单的区别
  • 基于springboot实现校园在线拍卖系统项目【项目源码】计算机毕业设计
  • 如何在Linux上搭建本地Docker Registry并实现远程连接
  • vscode 推送本地新项目到gitee
  • Linux入门(三)
  • 22. 深度学习 - 自动求导
  • 反射和序列化操作会破坏单例模式
  • redis 介绍1
  • three.js相机调用reset方法复原但无法完全复原
  • docker 部署Redis集群(三主三从,以及扩容、缩容)
  • flink的window和windowAll的区别
  • list转map(根据某个或多个属性分组)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(六)
  • JAVA必应回答。
  • 参加了南京 GDG 活动:这些精彩的技术讨论,值得与你分享~
  • 基于RFID的自动化仓储设备研发项目可行性研究报告
  • 【Linux基础】中断子系统 -- 内核宏 CONFIG_SPARSE_IRQ
  • leetcode面试经典150题——29 三数之和
  • C++ 继承和派生 万字长文超详解
  • 基本算法:二分
  • 【Linux】vscode远程连接ubuntu,含失败解决方案
  • 【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘
  • nvm的下载与使用
  • TEE威胁评分与评级
  • 大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)
  • Sam Altman重回OpenAI,工牌成亮点