问题的提出:

有时我们需要按节点名称找出模型中的节点,例如如下代码:

class findNodeVisitor : public osg::NodeVisitor
{public:findNodeVisitor();findNodeVisitor(const std::string &searchName);virtual void apply(osg::Node &searchNode);virtual void apply(osg::Transform &searchNode);void setNameToFind(const std::string &searchName);osg::Node* getFirst();typedef std::vector<osg::Node*> nodeListType;nodeListType& getNodeList() { return foundNodeList; }private:std::string searchForName;nodeListType foundNodeList;};findNodeVisitor::findNodeVisitor() : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), searchForName()
{}findNodeVisitor::findNodeVisitor(const std::string &searchName) : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), searchForName(searchName)
{}void findNodeVisitor::setNameToFind(const std::string &searchName)
{searchForName = searchName;foundNodeList.clear();}osg::Node* findNodeVisitor::getFirst()
{return *(foundNodeList.begin());}void findNodeVisitor::apply(osg::Node &searchNode)
{if (searchNode.getName() == searchForName){foundNodeList.push_back(&searchNode);}traverse(searchNode);
}void findNodeVisitor::apply(osg::Transform &searchNode)
{osgSim::DOFTransform* dofNode =dynamic_cast<osgSim::DOFTransform*> (&searchNode);if (dofNode){dofNode->setAnimationOn(false);}apply((osg::Node&) searchNode);traverse(searchNode);}
int main()
{// 初始化变量和模型,建立场景osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::Group> root = new osg::Group();osg::ref_ptr<osg::Node> tankNode = osgDB::readNodeFile("d:\\1.OSGB");root->addChild(tankNode.get());findNodeVisitor findGun("gun"); root->accept(findGun);//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());//设置场景数据viewer->setSceneData(root.get());//初始化并创建窗口viewer->realize();//开始渲染viewer->run();return 0;}

在上面的代码段main函数中的如下代码:

findNodeVisitor findGun("gun"); 
中的”gun“表示按节点名称来查找,只找模型中名称为"gun"的节点,有时我们从3D建模人员拿到的模型文件他们也不记得模型中各个节点的名称了,那我们怎么办呢?我们可以用如下代码枚举出模型中的每个节点的名称、库名、类名,如下:

#include <iostream>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/NodeVisitor>
#include <osg/Node>
#include <osg/Group>
#include <osgSim/DOFTransform>
#include <osgUtil/Optimizer>
#include <osg/NodeVisitor>
#include <iostream>
#include <vector>
#include <codecvt>
#include <locale>
using namespace std;
#ifdef WIN32
#include<Windows.h>
#endifstring Utf8ToGB2312(const std::string& strUtf8)
{std::wstring_convert<std::codecvt_utf8<wchar_t>> cutf8;std::wstring wTemp = cutf8.from_bytes(strUtf8);
#ifdef _MSC_VERstd::locale loc("zh-CN");
#elsestd::locale loc("zh_CN.GB18030");
#endifconst wchar_t* pwszNext = nullptr;char* pszNext = nullptr;mbstate_t state = {};std::vector<char> buff(wTemp.size() * 2);int res = std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >(loc).out(state,wTemp.data(), wTemp.data() + wTemp.size(), pwszNext,buff.data(), buff.data() + buff.size(), pszNext);if (std::codecvt_base::ok == res){return std::string(buff.data(), pszNext);}return "";
}
class InfoVisitor : public osg::NodeVisitor
{
public:InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}virtual void apply(osg::Node& node){for (int i = 0; i < _indent; i++)  cout << "    ";cout << "[" << _indent << "]" << node.libraryName()<< "::" << node.className() << "----" << Utf8ToGB2312(node.getName()) << endl;_indent++;traverse(node);_indent--;for (int i = 0; i < _indent; i++)  cout << "    ";cout << "[" << _indent << "] " << node.libraryName()<< "::" << node.className() << "----" << Utf8ToGB2312(node.getName()) << endl;}virtual void apply(osg::Geode& node){for (int i = 0; i < _indent; i++)  cout << "    ";cout << "[" << _indent << "] " << node.libraryName()<< "::" << node.className() << "----" << Utf8ToGB2312(node.getName()) << endl;_indent++;for (unsigned int n = 0; n < node.getNumDrawables(); n++){osg::Drawable* draw = node.getDrawable(n);if (!draw)continue;for (int i = 0; i < _indent; i++)  cout << "    ";cout << "[" << _indent << "]" << draw->libraryName() << "::"<< draw->className() << "----" << Utf8ToGB2312(node.getName()) << endl;}traverse(node);_indent--;for (int i = 0; i < _indent; i++)  cout << "    ";cout << "[" << _indent << "]" << node.libraryName()<< "::" << node.className()  << "----" << Utf8ToGB2312(node.getName()) <<  endl;}private:int _indent;
};
int main()
{// 初始化变量和模型,建立场景osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::Group> root = new osg::Group();osg::ref_ptr<osg::Node> tankNode = osgDB::readNodeFile("d:\\1.OSGB");root->addChild(tankNode.get());InfoVisitor infoVisitor;if (root){root->accept(infoVisitor);}//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());//设置场景数据viewer->setSceneData(root.get());//初始化并创建窗口viewer->realize();//开始渲染viewer->run();return 0;}

注意:上述的node.getName()即节点名称要用Utf8ToGB2312函数转换一下,否则对于中文的名称会出现乱码。运行截图如下:

参考链接:OSG节点访问和遍历 - adyzng - 博客园 (cnblogs.com)

如何知道osg模型每个节点的名称相关推荐

  1. 【深度学习】ONNX 模型文件修改节点的名称,修改输入名称,修改输出名称

    想要修改onnx模型文件的节点名称,要么在最初的pytorch代码里去改,要么就直接在onnx模型文件里改. 而我这里直接在onnx模型文件改,我有一个onnx文件,输出节点的名字是这样的: 这不改就 ...

  2. osg中父子节点关系对坐标系的影响(相对坐标绝对坐标%矩阵变换)

    从头梳理一下碰到的坐标问题. osgEarth中坐标系有很多,如世界坐标系,地理坐标系,相机坐标系等等,然后根据形式又分为相对坐标系和绝对坐标系. 这里先记录一下绝对坐标系和相对坐标系 当你构建场景的 ...

  3. OSG——第一个程序,加载一个osg模型文件

    初学OSG,该模块为自己学习时保存的一些代码,无教学意义 //创建viewer对象,场景游览器osg::ref_ptr<osgViewer::Viewer> _mViewer = new ...

  4. 使用tensoflow serving来部署模型推理节点

    使用tensoflow serving来部署模型推理节点 这里使用的时docker来进行模型的部署,主要是docker更轻便和方便. 1.训练一个分类模型 分类模型一般很简单,这里我已经训练好一个(测 ...

  5. zTree实现更新根节点中第i个节点的名称

    zTree实现更新根节点中第i个节点的名称 1.实现源码 <!DOCTYPE html> <html> <head><title>zTree实现基本树& ...

  6. Ventuz6之模型动画节点[Animation Rig]

    Animation Rig感觉就像是把模型软件里得效果完全在Ventuz里面展示了.和模型软件里面展示的效果应该没什么区别.(不会模型,纯个人理解) 首先去官网看文档了解一下.然后一堆英文挺懵逼的 然 ...

  7. matlab13节点线路模型,13节点配电网的建模与仿真.doc

    . . 大学生课外创新实验竞赛总结报告 项目简介: 在配电网的正常运行中,随着用电负荷的变化和系统运行方式的改变,网络中的损耗也将发生变化.要严格保证所有的用户在任何时刻都有额定的电压是不可能的,因此 ...

  8. OSG 实现跟随节点的相机(转)

    本章教程将继续使用回调和节点路径(NodePath)来检索节点的世界坐标. 本章目标: 在一个典型的仿真过程中,用户可能需要从场景中的各种车辆和人物里选择一个进行跟随.本章将介绍一种将摄像机" ...

  9. OSG 之学习二:OSG 模型简单控制

    文章目录 说明 1. 模型的基本操作 1.1 添加模型 1.2 删除模型 1.3 隐藏模型 1.4 结点开关 1.5 超级指针(其实就是智能指针,smart pointer) 2. 移动/旋转/缩放模 ...

最新文章

  1. cmake java_JNI系列之AS支持CMake了
  2. java vector_Java Vector sureCapacity()方法与示例
  3. SQL死锁知识及解决办法
  4. Python项目实践:天天向上的力量
  5. Java教程:Java String字符串和整型int的相互转换
  6. 大数据之-Hadoop3.x_MapReduce_WordCount编写_Driver---大数据之hadoop3.x工作笔记0091
  7. C++_类和对象_封装_访问权限_C++中struct和class的区别---C++语言工作笔记037
  8. 2021年中国带LED显示屏的温度调节器市场趋势报告、技术动态创新及2027年市场预测
  9. java 字符串 float_Java 字符串转float运算 float转字符串
  10. 中国物联网潜力巨大 还需加快投资节奏
  11. 如何用html和css制作网页,html和css如何实现制作一个网页
  12. B站视频、音频分开传输
  13. Zynga的数据分析
  14. C51单片机实验——7段数码管实验
  15. C语言求输入一个非负数,返回它组成数字之和
  16. 【路径规划】基于模糊逻辑系统实现车辆的自主导航附matlab代码
  17. 宝德服务器——企业需要真正的按需定制产品
  18. 计算机网络概述 第二部分
  19. margin设置百分比
  20. java短信验证码 60秒_Rxjava操作符飙车系列(三)验证码倒计时

热门文章

  1. 面试官:“你大学做过真实项目吗?”
  2. 不懂电容原理?那是你没看到这些动图
  3. php websocket 实战,一次WebSocket项目实战后总结的经验
  4. php post处理,PHP处理GETPOST方法
  5. mysql读取和写入的峰值_计算MySQL的内存峰值公式
  6. 全志r11_全志R328 Demo开发板;全志R333开发板/核心板;全志R11开发板/核心板;全志R16开发板/方案设计...
  7. mysql 雇员表脚本,mysql压力测试脚本实例_MySQL
  8. Java反射机制01_反射的概念以及获取字节码信息 的四种方式
  9. c#汉字拼音转换拼音
  10. 1.给定区间的二分查找