1. virtual void apply(osg::Geode& node)
  2. {
  3. for (int i = ; i < node.getNumDrawables(); i++)
  4. {
  5. osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(node.getDrawable(i));
  6. if (geometry)
  7. {
  8. //apply(*g);
  9. //***********************************************
  10. //解析顶点
  11. osg::Array* vertexArray = geometry->getVertexArray();
  12. if (vertexArray == NULL)
  13. return;
  14.  
  15. //顶点数组
  16. osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>(vertexArray);
  17. long lVertNum = verts->size();
  18. std::vector<osg::Vec3 >::iterator iter_ver = verts->begin();
  19.  
  20. //遍历顶点值
  21. for (; iter_ver != verts->end(); iter_ver++)
  22. {
  23. double x = iter_ver->x();
  24. double y = iter_ver->y();
  25. double z = iter_ver->z();
  26. }
  27.  
  28. //纹理
  29. osg::Texture2D* tex2D = dynamic_cast<osg::Texture2D*>(geometry->getStateSet()->getTextureAttribute(, osg::StateAttribute::TEXTURE));
  30. osg::Image* image = tex2D->getImage();
  31. osgDB::writeImageFile(*image, "abc.jpg");
  32. int width = image->s();
  33. int height = image->t();
  34. /*osg::Vec2 color;
  35. osg::Vec4 c = image->getColor(color);*/
  36.  
  37. //UV
  38. osg::Array* uvArry = geometry->getTexCoordArray();
  39. osg::Vec2Array* vertsUV = dynamic_cast<osg::Vec2Array*>(uvArry);
  40. std::vector<osg::Vec2 >::iterator iter_verUV = vertsUV->begin();
  41.  
  42. std::vector<int> greenPointIndices;
  43. int i = ;
  44. for (; iter_verUV != vertsUV->end(); iter_verUV++)
  45. {
  46. double u = iter_verUV->x();
  47. double v = iter_verUV->y();
  48. osg::Vec2 color(u, v);
  49. osg::Vec4 c = image->getColor(color);
  50. float r = c.r() * ;
  51. float g = c.g() * ;
  52. float b = c.b() * ;
  53. if (r < && g < && b < )
  54. greenPointIndices.push_back(i);
  55. i++;
  56. }
  57.  
  58. //索引
  59. int numP = geometry->getNumPrimitiveSets();
  60. osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt = new osg::DrawElementsUInt(GL_TRIANGLES);
  61. for (unsigned int ipr = ; ipr < numP; ipr++)
  62. {
  63. osg::PrimitiveSet* prset = geometry->getPrimitiveSet(ipr);
  64. unsigned int ncnt = prset->getNumIndices();
  65. for (unsigned int ic = ; ic * < prset->getNumIndices(); ic++)
  66. {
  67. unsigned int iIndex0 = prset->index(ic * );
  68. unsigned int iIndex1 = prset->index(ic * + );
  69. unsigned int iIndex2 = prset->index(ic * + );
  70. bool find = false;
  71. for (int i = ; i < greenPointIndices.size(); i++)
  72. {
  73. if (greenPointIndices[i] == iIndex0 || greenPointIndices[i] == iIndex1 || greenPointIndices[i] == iIndex2)
  74. {
  75. find = true;
  76. break;
  77. }
  78. }
  79. if (find)
  80. continue;
  81. else
  82. {
  83. drawElemUInt->push_back(prset->index(ic * ));
  84. drawElemUInt->push_back(prset->index(ic * + ));
  85. drawElemUInt->push_back(prset->index(ic * + ));
  86. }
  87. }
  88. }
  89.  
  90. osg::ref_ptr<osg::Geometry> geometry_new = new osg::Geometry();
  91. geometry_new->setVertexArray(verts);
  92. geometry_new->getOrCreateStateSet()->setTextureAttributeAndModes(, tex2D, osg::StateAttribute::ON);
  93. geometry_new->setTexCoordArray(, uvArry);
  94. geometry_new->addPrimitiveSet(drawElemUInt);
  95.  
  96. osg::Geode* pGeode_new = new osg::Geode;
  97. pGeode_new->removeDrawables(, pGeode_new->getNumDrawables());
  98. pGeode_new->addDrawable(geometry_new);
  99. osgDB::writeNodeFile(*pGeode_new, "test.osgb", new osgDB::Options("WriteImageHint=IncludeData Compressor=zlib"));
  100.  
  101. //***********************************************
  102. }
  103. }
  104. }

geode中顶点对应UV色彩在阈值范围内的三角形删除,并生成新的geode保存成osgb文件输出

osgb的顶点,纹理,索引,UV读取与存储的更多相关文章

  1. [原][spark]帧序列的纹理UV索引,修改spark源码,改变纹理索引方式,支持常规帧序列

    spark的纹理索引方式是左下为最小值0 右上为最大值k ,遍历顺序为横向即: 3 4 5 0 1 2 而常规的纹理帧序列是这样的: 0 1 2 3 4 5 所以,为了让spark的纹理遍历顺序能按照 ...

  2. Shader Model 3.0:Using Vertex Textures SM3:使用顶点纹理 (NVIDIA spec, 6800支持使用D3DFMT_R32F and D3DFMT_A32B32G32R32F的纹理格式实现Vertex Texture。)

    翻译者 周波 zhoubo22@hotmail.com 版权所有 Philipp Gerasimov Randima (Randy) Fernando Simon Green NVIDIA Corpo ...

  3. [Slimdx]顶点和索引缓冲,绘制了2个分离的三角形

    定义网格顶点和索引缓冲,绘制了2个分离的三角形. using System; using System.Drawing; using RGeos.SlimScene.Core; using SlimD ...

  4. MySQL数据库之索引、事务、存储引擎详细讲解

    一.索引 1.1 索引的概念 索引是一个排序的列表,存储着索引值和这个值所对应的物理地址 无须对整个表进行扫描,通过物理地址就可以找到所需数据 (数据库索引类似书中的目录,通过目录就可以快速査找所需信 ...

  5. Pandas_数据读取与存储数据(全面但不精炼)

    Pandas 读取和存储数据 目录 读取 csv数据 读取 txt数据 存储 csv 和 txt 文件 读取和存储 json数据 读取和存储 excel数据 一道练习题 参考 Numpy基础(全) P ...

  6. Pandas_数据读取与存储数据(精炼)

    # 一,读取 CSV 文件: # 文字解析函数: # pd.read_csv() 从文件中加载带分隔符的数据,默认分隔符为逗号 # pd.read_table() 从文件中加载带分隔符的数据,默认分隔 ...

  7. MySQL索引、事务、存储引擎

    一.MySQL 索引 1.索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址).●使用索引后可以不用扫描 ...

  8. MySQL 索引、事务与存储引擎

               MySQL 索引.事务与存储引擎 1.索引 2.事务 3.存储引擎 1.索引: 索引的概念 : 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ...

  9. 27.MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...

随机推荐

  1. CAN总线学习笔记

    1.CAN总线信息包的格式 问题: 1.CAN总线的初始化要初始化哪些东西? 2.处理器如何与CAN总线之间进行连接? 硬件连接 关于CC2底盘CAN通信的协议格式 备注: 设备地址为01 功能码

  2. php之新的开始---php的相关及其环境搭建

    写在前面:首先,感谢“奇矩”给的这次机会,不论结果如何,我都会尽我最大的努力! 在今晚之前,如果说,我与php的接触是停留在知道的阶段,那今晚过后,我想我算是认识了php.php作为一门编程语言,已经 ...

  3. Spring Boot Web 开发@Controller @RestController 使用教程

    在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...

  4. python3.8+PySimpleGUI+进度条代码大全

    1.python3.8+PySimpleGUI+进度条大全 2.效果图: 3.代码: #导出模块 import PySimpleGUI as sg import time import inspect ...

  5. 学校实训作业:Java爬虫(WebMagic框架)的简单操作

    项目名称:java爬虫 项目技术选型:Java.Maven.Mysql.WebMagic.Jsp.Servlet 项目实施方式:以认知java爬虫框架WebMagic开发为主,用所学java知识完成指 ...

  6. 根据class 属性判断所有的文本框必填

    <body> <!-- 遮罩层 --> <div id="hidediv" style="width: 100%;height: 100%; ...

  7. 简单实用的matlab柱状图显示比例及计数

    这个小代码用于matlab柱状图显示比例及数值, 函数如下: function myhist(x) % myhist Codeby SimonLiang % Email:idignew@126.com ...

  8. Unity的3种消息传递方法(SendMessage等)

    为了方便多个物体间的消息传达与接收,Unity中包含了几种消息推送机制 : 分别为SendMessage.SendMessageUpwards.BroadcastMessage. 我们首先以SendM ...

  9. DCL和DQL

    数据查询语言(DQL,Data Query Language) 主要是一些查询的sql语句. 语法 select * from test: 数据控制语言(DCL, Data Control Langu ...

  10. Caffe2 载入预训练模型(Loading Pre-Trained Models)[7]

    这一节我们主要讲述如何使用预训练模型.Ipython notebook链接在这里. 模型下载 你可以去Model Zoo下载预训练好的模型,或者使用Caffe2的models.download模块获取 ...