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文件输出

posted @ 2019-12-25 20:24  Mouming_Ning  阅读(3583)  评论(3编辑  收藏  举报