NodeVisitor的使用-遍历Geode节点下的Geometry并获取顶点、法向量等数据
struct Subset
{
std::vector<float> vertexs;//位置
std::vector<float> normals;//法向
std::vector<float> texCoords;//纹理
std::vector<unsigned int> indices;//索引下标
std::vector<unsigned int> faceMtrls;//面材质索引
}; class GetSimplifySTLDataVisitor : public osg::NodeVisitor
{
public:
GetSimplifySTLDataVisitor(Subset &s):dstSubset(s),
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
{
} virtual void apply(osg::Geode& geode)
{
unsigned int count = geode.getNumDrawables();
for ( unsigned int i = ; i < count; i++ )
{
osg::Geometry *geometry = geode.getDrawable( i )->asGeometry();
if ( !geometry )
continue;
// 顶点数据
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());
int vertexlNum = vertices->size();
for ( int i=; i<vertexlNum; i++) {
dstSubset.vertexs.push_back( vertices->at(i).x() );
dstSubset.vertexs.push_back( vertices->at(i).y() );
dstSubset.vertexs.push_back( vertices->at(i).z() );
}
// 法向量
osg::Vec3Array* normals = dynamic_cast<osg::Vec3Array*>(geometry->getNormalArray());
int normalNum = normals->size();
for (int i=; i<normalNum; i++) {
dstSubset.normals.push_back( normals->at(i).x() );
dstSubset.normals.push_back( normals->at(i).y() );
dstSubset.normals.push_back( normals->at(i).z() );
}
normalBindKinds.insert(geometry->getNormalBinding());
if(osg::Geometry::BIND_PER_VERTEX != geometry->getNormalBinding() )
{
std::string msg="未处理的法向量绑定方式";
MessageBox(, LPCTSTR(msg.c_str()), "警告", MB_OK);
}
// 索引数组
for ( unsigned int i = ; i < geometry->getNumPrimitiveSets(); ++i )
{
osg::PrimitiveSet* ps = geometry->getPrimitiveSet( i );
if ( !ps ) continue;
pts.insert(ps->getType());
modes.insert(ps->getMode());
switch( ps->getType() )
{
case osg::PrimitiveSet::DrawElementsUIntPrimitiveType :
{
osg::DrawElementsUInt* deui = dynamic_cast<osg::DrawElementsUInt*>(ps);
const unsigned indexNum = deui->getNumIndices();
switch( deui->getMode() )
{
case osg::PrimitiveSet::TRIANGLES :
{
for (unsigned int i=; i<indexNum; i++)
{
dstSubset.indices.push_back( deui->at(i) );
}
break;
}
default:
{
std::string msg="未处理的绘制模式";
MessageBox(, LPCTSTR(msg.c_str()), "警告", MB_OK);
}
}
break;
}
case osg::PrimitiveSet::DrawElementsUShortPrimitiveType :
{
osg::DrawElementsUShort* de = dynamic_cast<osg::DrawElementsUShort*>(ps);
const unsigned indexNum = de->getNumIndices();
switch( de->getMode() )
{
case osg::PrimitiveSet::TRIANGLES :
{
for (unsigned int i=; i<indexNum; i++)
{
dstSubset.indices.push_back( de->at(i) );
}
break;
}
case osg::PrimitiveSet::TRIANGLE_STRIP :
{
for (unsigned int i=; i<indexNum-; i++)
{
//此处索引为何与基数偶数有关,可百度GL_TRIANGLE_STRIP
if (i%==)
{
dstSubset.indices.push_back( de->at(i) );
dstSubset.indices.push_back( de->at(i+) );
dstSubset.indices.push_back( de->at(i+) );
}
else
{
dstSubset.indices.push_back( de->at(i) );
dstSubset.indices.push_back( de->at(i+) );
dstSubset.indices.push_back( de->at(i+) );
}
}
break;
}
default:
{
std::string msg="未处理的绘制模式";
MessageBox(, LPCTSTR(msg.c_str()), "警告", MB_OK);
}
}
break;
}
case osg::PrimitiveSet::DrawArraysPrimitiveType :
{
osg::DrawArrays* da = dynamic_cast<osg::DrawArrays*>(ps);
int first=da->getFirst();
int count=da->getCount();
switch( da->getMode() )
{
case osg::PrimitiveSet::TRIANGLES :
{
for ( int i=first; i<first+count; i++) {
dstSubset.indices.push_back( i );
}
break;
}
case osg::PrimitiveSet::TRIANGLE_STRIP :
{
for ( int i=first; i<first+count-; i++) {
if(i%==)
{
dstSubset.indices.push_back( i );
dstSubset.indices.push_back( i+ );
dstSubset.indices.push_back( i+ );
}
else
{
dstSubset.indices.push_back( i );
dstSubset.indices.push_back( i+ );
dstSubset.indices.push_back( i+ );
}
}
break;
}
default:
{
std::string msg="未处理的绘制模式";
MessageBox(, LPCTSTR(msg.c_str()), "警告", MB_OK);
}
}
break;
}
default:
{
std::string msg="未处理的图元类型";
MessageBox(, LPCTSTR(msg.c_str()), "警告", MB_OK);
}
}
}
}
}
private:
Subset &dstSubset;
//以下三个数组用来测试
std::set<osg::Geometry::AttributeBinding> normalBindKinds;
std::set<osg::PrimitiveSet::Type> pts;
std::set<GLenum> modes;
};
NodeVisitor的使用-遍历Geode节点下的Geometry并获取顶点、法向量等数据的更多相关文章
- NodeVisitor的使用-遍历Geode节点并在它与父节点之间添加一个LOD节点
#include <osg\NodeVisitor>#include <osg\MatrixTransform>#include <osg\PagedLOD>#in ...
- PHP遍历文件夹下的文件和获取到input name的值
<?php$dir = dirname(__FILE__); //要遍历的目录名字 ->当前文件所在的文件夹//$dir='D:\PHP\wamp\www\admin\hosts\admi ...
- Extjs4.x Ext.tree.Panel 遍历当前节点下的所有子节点
Ext.define('WMS.controller.Org', { extend: 'Ext.app.Controller', stores: ['OrgUser', 'OrgTree'], mod ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- VBS获取Ini配置文件一个节点下的所有字段的值
''* 功能:使用VBS读取ini文件中指定节点下的所有值'* 输入参数:inipath :ini文件的地址'* initypes :ini文件中包含在"["和 ...
- 遍历树节点(多层)的方法(java)
前序遍历,后序遍历,广度遍历,深度遍历,遍历一级节点.以及按钮如何响应点击事件. import java.awt.*; import java.awt.event.*; import java.uti ...
- asp.net 遍历文件夹下全部子文件夹并绑定到gridview上
遍历文件夹下所有子文件夹,并且遍历配置文件某一节点中所有key,value并且绑定到GridView上 Helper app_Helper = new Helper(); DataSet ds = n ...
- 记录JS如何使用广度遍历找到节点的所有父节点
我们在实际的工作业务场景中经常遇到这样的场景,求取树数据中某个节点的父亲节点以及所有的父亲节点,这样的场景下不建议使用深度遍历,使用广度遍历可以更快找到. 1.案例解说 比如树的长相是这样的: 树的数 ...
- C#遍历文件夹下所有文件
FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...
随机推荐
- 原生态js获取节点的方法
<input value="我是用id来获取值的" type="button" onclick="GetById()"/> &l ...
- ios 微博登录 21338错误 sso package or sign error
os中,是你项目的bundle id 和 连接的微博开发账户里面的bundle id 不一致造成的. 特别是,你把你注册的appKey放到你下载的官方的demo里面测试,肯定会出现这种情况, 所以,你 ...
- FineUI第十四天---布局之垂直布局和水平布局
布局值水平布局和垂直布局 垂直盒子布局和水平盒子布局非常灵活易用,在很大程度上能够取代锚点布局,行布局和列布局. 1.垂直盒子布局: BoxConfigAlign:控制子容器的的尺寸 Start:位于 ...
- http://debugjs.com/
浏览器内调试js代码,这篇文章介绍了作者的开发心路 http://amasad.me/2014/01/06/building-an-in-browser-javascript-vm-and-debug ...
- 表单select相关
selectedIndex 属性可设置或返回下拉列表中被选选项的索引号. options[] 返回包含下拉列表中的所有选项的一个数组. add()向下拉列表添加一个选项. blur()从下拉列表移开焦 ...
- 如何将jsp页面的table报表转换到excel报表导出
假设这就是你的jsp页面: 我们会添加一个“导出到excel”的超链接,它会把页面内容导出到excel文件中.那么这个页面会变成这个样子 在此,强调一下搜索时关键词的重要性,这样一下子可以定位到文章, ...
- HackerRank savita-and-friends
Description 在一条边上求一个点,使得这个点到所有点的最长的最短距离 最短. \(n \leqslant 10^5\) Sol Dijkstra+扫描线+单调队列. 这个好像叫什么最小直径生 ...
- 前端之js的常用用法
js生成标签 // 将标签添加到i1里面 var tag = document.createElement('input'); tag.setAttribute('type', 'text'); ta ...
- django rest framework 的url标签的问题
如何在模板中引用一个在rest framework中的url? urls.py from django.conf.urls import patterns, url from .views impor ...
- iOS 深入理解UINavigationController 和 UIViewController 之间的关系
创建三个类 BasicViewController : UIViewController SecondViewController : UIViewController ThirdViewContro ...