现在的位置: 首页 > 综合 > 正文

每日一练(三) pointSprite(点精灵)

2018年01月29日 ⁄ 综合 ⁄ 共 3282字 ⁄ 字号 评论关闭

点精灵实现:

1、创建点集合

osg::Node* PointSpriteImpl::MakeGalaxy(int nVertices)
{
    osg::Geode* geode = new osg::Geode();
    osg::Geometry* galaxy = new osg::Geometry();

    osg::Vec3Array* vertices = new osg::Vec3Array();
    osg::Vec4Array* clors = new osg::Vec4Array();
    osg::Vec4 ini(1,1,0,1);
    osg::Vec4 fin(0,0,1,1);

    // 生成两个漩涡
    for(int i = 0; i < nVertices/2; ++i)
    {  
        // 等分圆的角度  2/nvertices 份
        float val = (i*2/(float)nVertices * 2* osg::PI);
        float modx1 = rand() / (float)RAND_MAX*2;
        float mody1 = rand() / (float)RAND_MAX*2;
        float modx2 = rand() / (float)RAND_MAX*2;
        float mody2 = rand() / (float)RAND_MAX*2;
        float modz1 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);
        float modz2 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);

        vertices->push_back(osg::Vec3(cos(val)* val + modx1,sin(val) * val + mody1,modz1));
        vertices->push_back(osg::Vec3(-cos(val)* val + modx2,-sin(val) * val + mody2,modz2));

        clors->push_back(ini + (fin - ini)*(i*2/(float)nVertices));
        clors->push_back(ini+  (fin - ini)*(i*2/(float)nVertices));

                                                                                    
    }
    galaxy->setVertexArray(vertices);
    galaxy->setColorArray(clors);
    galaxy->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
    galaxy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS,0,nVertices));
    geode->addDrawable(galaxy);
    return geode;
}osg::Node* PointSpriteImpl::MakeGalaxy(int nVertices)
{
    osg::Geode* geode = new osg::Geode();
    osg::Geometry* galaxy = new osg::Geometry();

    osg::Vec3Array* vertices = new osg::Vec3Array();
    osg::Vec4Array* clors = new osg::Vec4Array();
    osg::Vec4 ini(1,1,0,1);
    osg::Vec4 fin(0,0,1,1);

    // 生成两个漩涡
    for(int i = 0; i < nVertices/2; ++i)
    {  
        // 等分圆的角度  2/nvertices 份
        float val = (i*2/(float)nVertices * 2* osg::PI);
        float modx1 = rand() / (float)RAND_MAX*2;
        float mody1 = rand() / (float)RAND_MAX*2;
        float modx2 = rand() / (float)RAND_MAX*2;
        float mody2 = rand() / (float)RAND_MAX*2;
        float modz1 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);
        float modz2 = ((rand() - RAND_MAX/2) / (float)(RAND_MAX))*3/(val+1);

        vertices->push_back(osg::Vec3(cos(val)* val + modx1,sin(val) * val + mody1,modz1));
        vertices->push_back(osg::Vec3(-cos(val)* val + modx2,-sin(val) * val + mody2,modz2));

        clors->push_back(ini + (fin - ini)*(i*2/(float)nVertices));
        clors->push_back(ini+  (fin - ini)*(i*2/(float)nVertices));

                                                                                    
    }
    galaxy->setVertexArray(vertices);
    galaxy->setColorArray(clors);
    galaxy->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
    galaxy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS,0,nVertices));
    geode->addDrawable(galaxy);
    return geode;
}

2、设置stateset属性

osg::StateSet* PointSpriteImpl::MakeStateSet(int nSize)
{
    osg::StateSet* stateSet = new osg::StateSet();  

    // set cool blending 
    stateSet->setMode(GL_BLEND,osg::StateAttribute::ON);
    osg::BlendFunc* fn = new osg::BlendFunc();
    fn->setFunction(osg::BlendFunc::SRC_ALPHA,osg::BlendFunc::DST_ALPHA);
    stateSet->setAttributeAndModes(fn,osg::StateAttribute::ON);           

    // setup point sprit
    osg::PointSprite* pointsprite = new osg::PointSprite();
    stateSet->setTextureAttributeAndModes(0,pointsprite,osg::StateAttribute::ON);


    // give some size to the points
    osg::Point* point = new osg::Point();               
    point->setSize(nSize);                          
    stateSet->setAttribute(point);

    // Disable depth test to avoid sort problems and Lighting
    stateSet->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
    stateSet->setMode(GL_LIGHTING,osg::StateAttribute::OFF);

     /// The texture for the sprites
    osg::Texture2D* tex = new osg::Texture2D();
    tex->setImage(osgDB::readImageFile("Images/particle.rgb"));
    stateSet->setTextureAttributeAndModes(0,tex,osg::StateAttribute::ON);

    return stateSet;

}

3、绘制结果:

(1) 未设置stateset

(2)设置stateset后:

4、总结:

5、扩展:

抱歉!评论已关闭.