zoukankan      html  css  js  c++  java
  • osgb的顶点,纹理,索引,UV读取与存储

    virtual void apply(osg::Geode& node) 
        {
            for (int i = 0; i < node.getNumDrawables(); i++)
            {
                osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(node.getDrawable(i));
                if (geometry)
                {
                    //apply(*g);
                    //***********************************************
                    //解析顶点
                    osg::Array* vertexArray = geometry->getVertexArray();
                    if (vertexArray == NULL)
                        return;
    
                    //顶点数组
                    osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>(vertexArray);
                    long lVertNum = verts->size();
                    std::vector<osg::Vec3 >::iterator iter_ver = verts->begin();
    
                    //遍历顶点值
                    for (; iter_ver != verts->end(); iter_ver++)
                    {
                        double x = iter_ver->x();
                        double y = iter_ver->y();
                        double z = iter_ver->z();  
                    }
    
                    //纹理
                    osg::Texture2D* tex2D = dynamic_cast<osg::Texture2D*>(geometry->getStateSet()->getTextureAttribute(0, osg::StateAttribute::TEXTURE));
                    osg::Image* image = tex2D->getImage();
                    osgDB::writeImageFile(*image, "abc.jpg");
                    int width = image->s();
                    int height = image->t();
                    /*osg::Vec2 color;
                    osg::Vec4 c = image->getColor(color);*/
    
                    //UV
                    osg::Array* uvArry = geometry->getTexCoordArray(0);
                    osg::Vec2Array* vertsUV = dynamic_cast<osg::Vec2Array*>(uvArry);
                    std::vector<osg::Vec2 >::iterator iter_verUV = vertsUV->begin();
    
                    std::vector<int> greenPointIndices;
                    int i = 0;
                    for (; iter_verUV != vertsUV->end(); iter_verUV++)
                    {
                        double u = iter_verUV->x();
                        double v = iter_verUV->y();
                        osg::Vec2 color(u, v);
                        osg::Vec4 c = image->getColor(color);
                        float r = c.r() * 255;
                        float g = c.g() * 255;
                        float b = c.b() * 255;
                        if (r < 100 && g < 100 && b < 100 )
                            greenPointIndices.push_back(i);
                        i++;
                    }
    
                    //索引
                    int numP = geometry->getNumPrimitiveSets();
                    osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt = new osg::DrawElementsUInt(GL_TRIANGLES);
                    for (unsigned int ipr = 0; ipr < numP; ipr++)
                    {
                        osg::PrimitiveSet* prset = geometry->getPrimitiveSet(ipr);
                        unsigned int ncnt = prset->getNumIndices();
                        for (unsigned int ic = 0; ic * 3 < prset->getNumIndices(); ic++)
                        {
                            unsigned int iIndex0 = prset->index(ic * 3);
                            unsigned int iIndex1 = prset->index(ic * 3 + 1);
                            unsigned int iIndex2 = prset->index(ic * 3 + 2);
                            bool find = false;
                            for (int i = 0; i < greenPointIndices.size(); i++)
                            {
                                if (greenPointIndices[i] == iIndex0 || greenPointIndices[i] == iIndex1 || greenPointIndices[i] == iIndex2)
                                {
                                    find = true;
                                    break;
                                }
                            }
                            if (find)
                                continue;
                            else
                            {
                                drawElemUInt->push_back(prset->index(ic * 3));
                                drawElemUInt->push_back(prset->index(ic * 3 + 1));
                                drawElemUInt->push_back(prset->index(ic * 3 + 2));
                            }
                        }
                    }
    
                    osg::ref_ptr<osg::Geometry> geometry_new = new osg::Geometry();
                    geometry_new->setVertexArray(verts);
                    geometry_new->getOrCreateStateSet()->setTextureAttributeAndModes(0, tex2D, osg::StateAttribute::ON);
                    geometry_new->setTexCoordArray(0, uvArry);
                    geometry_new->addPrimitiveSet(drawElemUInt);
    
                    osg::Geode* pGeode_new = new osg::Geode;
                    pGeode_new->removeDrawables(0, pGeode_new->getNumDrawables());
                    pGeode_new->addDrawable(geometry_new);
                    osgDB::writeNodeFile(*pGeode_new, "test.osgb", new osgDB::Options("WriteImageHint=IncludeData Compressor=zlib"));
    
                    //***********************************************
                }
            }
        }

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

  • 相关阅读:
    C语言volatile解析
    使用中断开关实现全局变量互斥访问
    CentOS7下gogs安装总结
    iOS Xcode: linker command failed with exit code 1 (use -v to see invocation) 处理方法
    C# 10进制与62进制互转 数据大无压力 10进制与72,96进制任意转换
    Web网站的性能测试工具
    NetCore跨平台桌面框架Avalonia的OSX程序打包
    C# 类中静态变量静态构造函数执行顺序
    mac osx下虚拟主机配置
    React+ES6+Webpack深入浅出
  • 原文地址:https://www.cnblogs.com/ningmouming/p/12098724.html
Copyright © 2011-2022 走看看