DOF和MultiSwitch的使用
生活随笔
收集整理的這篇文章主要介紹了
DOF和MultiSwitch的使用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
利用前一篇博客的場(chǎng)景,添加兩個(gè)坦克結(jié)點(diǎn),一個(gè)結(jié)點(diǎn)是報(bào)廢的坦克,一個(gè)是旋轉(zhuǎn)炮塔的坦克,需要用到DOF和MultSwitch。
1.坦克模型由許多的其他模型結(jié)點(diǎn)組成,這里就包括炮塔結(jié)點(diǎn)和炮筒結(jié)點(diǎn),本文只用了炮塔。
2.需要一個(gè)能找到炮塔結(jié)點(diǎn)的方法,這里我們定義了一個(gè)類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://構(gòu)造函數(shù),兩種,一種無參,一種有參,參數(shù)為欲查詢結(jié)點(diǎn)的名字myFindNodeVisitor();myFindNodeVisitor(const std::string &searchNmae);//更改所要查詢的結(jié)點(diǎn)名字void setNameToFind(const std::string &searchName);//重載apply函數(shù),主要的查詢代碼在這里實(shí)現(xiàn)virtual void apply(osg::Node& node);virtual void apply(osg::Transform& node);//獲取查詢結(jié)果列表的第一個(gè)結(jié)點(diǎn)osg::Node* getFirst();//獲取結(jié)點(diǎn)列表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); }準(zhǔn)備好上述代碼,我們來做炮塔的旋轉(zhuǎn)和報(bào)廢的坦克。
#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;//載入三個(gè)坦克模型,并按照一定的順序擺放,擺放的位置和角度是一次一次運(yùn)行測(cè)試出來的。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對(duì)象,并用“sw1”字符串初始化myFindNodeVisitor findNodeVisitor;findNodeVisitor.setNameToFind("sw1");//開始執(zhí)行訪問器實(shí)例的遍歷過程,起點(diǎn)是brokenTank,搜索它所有的子節(jié)點(diǎn)并創(chuàng)建一個(gè)列表,用于保存所有符合搜索條件的節(jié)點(diǎn)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);//搜索炮塔結(jié)點(diǎn),找到后將炮塔旋轉(zhuǎn)一個(gè)角度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(); }本文轉(zhuǎn)自:https://blog.csdn.net/smells2/article/details/7295071
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的DOF和MultiSwitch的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos下SVN服务器怎么搭建
- 下一篇: python中popen函数怎么用