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并获取顶点、法向量等数据的更多相关文章

  1. NodeVisitor的使用-遍历Geode节点并在它与父节点之间添加一个LOD节点

    #include <osg\NodeVisitor>#include <osg\MatrixTransform>#include <osg\PagedLOD>#in ...

  2. PHP遍历文件夹下的文件和获取到input name的值

    <?php$dir = dirname(__FILE__); //要遍历的目录名字 ->当前文件所在的文件夹//$dir='D:\PHP\wamp\www\admin\hosts\admi ...

  3. Extjs4.x Ext.tree.Panel 遍历当前节点下的所有子节点

    Ext.define('WMS.controller.Org', { extend: 'Ext.app.Controller', stores: ['OrgUser', 'OrgTree'], mod ...

  4. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  5. VBS获取Ini配置文件一个节点下的所有字段的值

    ''* 功能:使用VBS读取ini文件中指定节点下的所有值'* 输入参数:inipath :ini文件的地址'*           initypes :ini文件中包含在"["和 ...

  6. 遍历树节点(多层)的方法(java)

    前序遍历,后序遍历,广度遍历,深度遍历,遍历一级节点.以及按钮如何响应点击事件. import java.awt.*; import java.awt.event.*; import java.uti ...

  7. asp.net 遍历文件夹下全部子文件夹并绑定到gridview上

    遍历文件夹下所有子文件夹,并且遍历配置文件某一节点中所有key,value并且绑定到GridView上 Helper app_Helper = new Helper(); DataSet ds = n ...

  8. 记录JS如何使用广度遍历找到节点的所有父节点

    我们在实际的工作业务场景中经常遇到这样的场景,求取树数据中某个节点的父亲节点以及所有的父亲节点,这样的场景下不建议使用深度遍历,使用广度遍历可以更快找到. 1.案例解说 比如树的长相是这样的: 树的数 ...

  9. C#遍历文件夹下所有文件

    FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...

随机推荐

  1. 【开源一个小工具】一键将网页内容推送到Kindle

    最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zh ...

  2. CAN总线 SJA1000中断

    背景: 最近一直在使用C8051F340 + SJA1000来实现CAN通信,就SJA1000部分做个记录. 正文: 整个系统结构拓扑图如下: 两路CAN,C8051F340作为CPU,处理CAN与U ...

  3. 微信电脑版真的要来了 微信Windows版客户端1.0 Alpha推出

    微信电脑版的搜索量一直很大,但只有网页版,之前也写了微信网页版APP - 网页微信客户端电脑版体验,在键盘上打字的感觉就是快.现在微信Windows版客户端1.0 Alpha推出了,来一睹芳容吧(20 ...

  4. oracle查询单表占用空间的大小

    oracle查询单表占用空间的大小 SELECT segment_name AS TABLENAME, BYTES B, BYTES KB, BYTES MB FROM user_segments w ...

  5. 游戏BUFF设计

    游戏中的BUFF/DEBUFF我们见过很多,我见到的玩得比较泛滥的就属WAR3.魔兽世界.九阴真经.仿DOTA类的如LOL. 总体上来说,BUFF/DEBUFF都属于“临时的技能效果”,因此它们可以沿 ...

  6. Mac Pro 安装 Adobe Photoshop CC for mac V2014 破解版

    一.下载 Photoshop CC for mac V2014 原版(.dmg 文件): 百度网盘下载1 百度网盘下载2 百度网盘下载3 百度网盘下载4 百度网盘下载5 百度网盘下载6 百度网盘下载7 ...

  7. js表单元素checked、radio被选中的几种方式-遁地龙卷风

    0.环境 <input type="checkbox"  value="lol"/>lol var lol = document.getElemen ...

  8. javascript中对象学习

    第一篇文章: javascript中this关键字的详细解析:   http://blog.csdn.net/wyj880220/article/details/7305952 Javascript ...

  9. iOS开发——UI基础-按钮的创建和设置

    @interface ViewController () - (IBAction)customBtnClick; @end @implementation ViewController - (void ...

  10. ios 异常捕获

    @try { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate c ...