利用前一篇博客的场景,添加两个坦克结点,一个结点是报废的坦克,一个是旋转炮塔的坦克,需要用到DOF和MultSwitch。

1.坦克模型由许多的其他模型结点组成,这里就包括炮塔结点和炮筒结点,本文只用了炮塔。

2.需要一个能找到炮塔结点的方法,这里我们定义了一个类myFindNodeVisitor.

myFindNodeVisitor.h


//By smells2 At Lab 2012-02-24#include <osg/NodeVisitor>
#include <osgSim/DOFTransform
#include <iostream>
#include <vector>#ifdef _DEBUG
#pragma comment(lib,"osgSimd.lib")
#else
#pragma comment(lib,"osgSim.lib")
#endif
class myFindNodeVisitor :public osg::NodeVisitor
{public://构造函数,两种,一种无参,一种有参,参数为欲查询结点的名字myFindNodeVisitor();myFindNodeVisitor(const std::string &searchNmae);//更改所要查询的结点名字void setNameToFind(const std::string &searchName);//重载apply函数,主要的查询代码在这里实现virtual void apply(osg::Node& node);virtual void apply(osg::Transform& node);//获取查询结果列表的第一个结点osg::Node* getFirst();//获取结点列表typedef std::vector<osg::Node*> NodeListType;NodeListType& getNodeList(){return m_nodeList;}protected:std::string m_searchName;NodeListType m_nodeList;
};

myFindNodeVisitor.cpp


#include "myFindNodeVisitor.h"myFindNodeVisitor::myFindNodeVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),m_searchName()
{}myFindNodeVisitor::myFindNodeVisitor(const std::string &searchNmae):osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
m_searchName(searchNmae)
{}void myFindNodeVisitor::setNameToFind(const std::string &searchName)
{m_searchName = searchName;m_nodeList.clear();
}osg::Node* myFindNodeVisitor::getFirst()
{return *(m_nodeList.begin());
}void myFindNodeVisitor::apply(osg::Node& node)
{if (node.getName() == m_searchName){m_nodeList.push_back(&node);}traverse(node);
}void myFindNodeVisitor::apply(osg::Transform &searchNode)
{   osgSim::DOFTransform* dofNode =    dynamic_cast<osgSim::DOFTransform*> (&searchNode);   if (dofNode)   {   dofNode->setAnimationOn(false);   }   apply ( (osg::Node&) searchNode);   traverse(searchNode);
}

准备好上述代码,我们来做炮塔的旋转和报废的坦克。


#include "myFindNodeVisitor.h"
#include <osgDB/readfile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osg/Group>
#include <osg/Node>
#include <osg/PositionAttitudeTransform>
#include <osgSim/MultiSwitch>
#include <iostream>
#ifdef _DEBUG
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgSimd.lib")
#else
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osgSim.lib")
#endifint main()
{osg::ref_ptr<osg::Group> root = new osg::Group;//载入三个坦克模型,并按照一定的顺序摆放,摆放的位置和角度是一次一次运行测试出来的。osg::ref_ptr<osg::Node> normalTank = osgDB::readNodeFile("t72-tank/t72-tank_des.flt");osg::ref_ptr<osg::Node> brokenTank = osgDB::readNodeFile("t72-tank/t72-tank_des.flt");=osg::ref_ptr<osg::Node> atteckTank = osgDB::readNodeFile("t72-tank/t72-tank_des.flt");osg::ref_ptr<osg::Node> landDust = osgDB::readNodeFile("t72-tank/JoeDirt.flt");root->addChild(landDust.get());osg::ref_ptr<osg::PositionAttitudeTransform> normalTankPAT = new osg::PositionAttitudeTransform;normalTankPAT->addChild(normalTank.get());normalTankPAT->setPosition(osg::Vec3(0,20,7));root->addChild(normalTankPAT.get());osg::ref_ptr<osg::PositionAttitudeTransform> brokenTankPAT = new osg::PositionAttitudeTransform;brokenTankPAT->addChild(brokenTank.get());brokenTankPAT->setPosition(osg::Vec3(20,10,8));brokenTankPAT->setAttitude(osg::Quat(osg::DegreesToRadians(22.5f),osg::Vec3(0.0f,0.0f,1.0f)));root->addChild(brokenTankPAT.get());osg::ref_ptr<osg::PositionAttitudeTransform> atteckTankPAT = new osg::PositionAttitudeTransform;atteckTankPAT->addChild(atteckTank.get());atteckTankPAT->setPosition(osg::Vec3(-20,50,5));atteckTankPAT->setAttitude(osg::Quat(osg::DegreesToRadians(45.0f),osg::Vec3(0.0f,0.0f,1.0f)));root->addChild(atteckTankPAT.get());//声明myFindNodeVisitor对象,并用“sw1”字符串初始化myFindNodeVisitor findNodeVisitor;findNodeVisitor.setNameToFind("sw1");//开始执行访问器实例的遍历过程,起点是brokenTank,搜索它所有的子节点并创建一个列表,用于保存所有符合搜索条件的节点brokenTank->accept(findNodeVisitor);osgSim::MultiSwitch* brokenTankSwitch = dynamic_cast<osgSim::MultiSwitch*>(findNodeVisitor.getFirst());if (!brokenTankSwitch){std::cout<<"Finding 'sw1' node failed !"<<std::endl;return -1;}brokenTankSwitch->setSingleChildOn(0,true);//搜索炮塔结点,找到后将炮塔旋转一个角度myFindNodeVisitor findDOF;findDOF.setNameToFind("turret");atteckTankPAT->accept(findDOF);osgSim::DOFTransform* thirdTankDOFTurret = dynamic_cast<osgSim::DOFTransform*>(findDOF.getFirst());if (!thirdTankDOFTurret){std::cout<<"Finding 'sw1' node failed !"<<std::endl;return -1;}thirdTankDOFTurret->setCurrentHPR(osg::Vec3(-3.14159/4.0,0.0,0.0));osgDB::writeNodeFile(*(normalTank.get()),"/tank.osg");osgViewer::Viewer myViewer;myViewer.setSceneData(root.get());myViewer.realize();myViewer.run();
}

本文转自:https://blog.csdn.net/smells2/article/details/7295071

DOF和MultiSwitch的使用相关推荐

  1. dof景深matlab,CG制作景深(DOF)的方法

    推荐使用景深插件final DOF,或者渲出Z通道后在后期软件中制作景深. 方法一:使用3D的摄像机制作景深效果 建议测试景深效果前先关闭光线追踪.面阴影.全局光照等耗时的设置,测试好景深后再将其打开 ...

  2. 【TA-霜狼_may-《百人计划》】图形4.5 DoF景深基础

    [TA-霜狼_may-<百人计划>]图形4.5 Dof景深基础 @[TOC]([TA-霜狼_may-<百人计划>]图形4.5 Dof景深基础 4.5.1 景深 离散圈 4.5. ...

  3. URP Bokeh DOF 分析

    URP Bokeh DOF 分析 "眼中只有你!" 文章目录 URP Bokeh DOF 分析 1 景深与散景 2 基本方向 3 实现细节 3.1 弥散圆的计算 3.2 降采样与创 ...

  4. 【技美百人计划】图形 4.5 Dof景深基础

    笔记 景深原理 ● 指相机对焦点前后相对清晰的成像范围,是一段三维空间. ● 针对相机成像产生的概念,肉眼也有类似的效果 景深遇到的问题 因为是基于深度图的实现,如果是半透明物体,则没有深度,要如何解 ...

  5. Magic Leap开发指南(9)-- 6 DOF(Unity)

    本部分的教程主要是介绍Magic Leap One的6 DOF能力.我们通过一个小例子来实现这个功能: 为控件初始化6自由度. 接收控件的位置和方向数据. 设计一个像激光束一样的指针,从控制器开始,延 ...

  6. 光流分析 Optical Flow Lucas-Kanade 算法 DOF Dense Optical Flow

    光流跟踪算法对车位进行跟踪 概念 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相 ...

  7. VR 中的 3 DoF 与 ​​6 DoF是什么 ?

    文章目录 与 VR 相关的 3DoF 与 6DoF 是什么? 3 DoF 6 DoF 为什么不是所有的 VR 都使用 6DoF? 那么,哪个更好? 翻译 原文 DoF 代表什么?6 比 3 好吗?方向 ...

  8. depth-of-focus,DOF概念

    聚焦深度DOF

  9. 基于自适应反步法的三自由度直升机(3 DOF Helicopter)轨迹跟踪

    文章目录 前言 一.3 DOF Helicopter实验装置 二.3 DOF Helicopter模型建立及简化 2.1模型建立 2.1.1 俯仰轴建模 2.1.2 横侧轴建模 2.1.3 旋转轴建模 ...

最新文章

  1. 管理95后员工,管理者必知的4条底层逻辑
  2. 干货 | VMAF视频质量评估在视频云转码中的应用
  3. 《JAVA练习题目11》学生类有属性姓名(字符串类型)和选修课程信息(ArrayList<Course>对象)两个属性,和三个方法
  4. BZOJ-1027 [JSOI2007]合金
  5. 一个LINUX高手写给初学者的话
  6. 产品认识:一个可直接套用的产品分析框架(纯干货)
  7. Nature Reviews Cancer综述:长非编码RNA在肿瘤转移中的作用
  8. 2018四川高考文科21题
  9. Alibaba 表格开源工具 easyexcel 快速使用教程
  10. HTML5+CSS3之字体的下载使用
  11. 汉语字典_Android版最新官方版,汉语字典专业版2020
  12. vue 使用ace编辑器
  13. python识别图形形状
  14. Java-Preferences用法-入门
  15. 让你的 Mac 用上最美的屏保,Aerial 使用教程
  16. 摩拜免押金是在阿里的哈罗猛烈攻击下的应对举措
  17. 计算机管理里边如何分盘,如何给电脑分盘【设置门径】
  18. ❤️数据可视化❤️:基于Echarts + GeoJson实现的地图视觉映射散点(气泡)组件【7】 - 海南省
  19. 我在大学读计算机 英语,托福极速英语:我在大学主修计算机
  20. 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式

热门文章

  1. 骚操作!用铁丝做“电路”,不服不行!
  2. 机器人抓取方式,值得研究。
  3. 计算机组成与架构综述学习报告
  4. java如何arraylist_Java如何使用ArrayList类?
  5. java getselecteditem_Java JComboBox.getSelectedItem方法代碼示例
  6. dockerclient 查看端口占用_docker 端口被占用问题解决
  7. 05 JS基础DOM
  8. 前端基础之操作标签—文档处理
  9. requests源码分析
  10. 第二章 DateTime工具类