osg入门系列10-以索引方式的几何体绘制

来源:互联网 发布:泰拉瑞亚作弊软件 编辑:程序博客网 时间:2024/05/01 01:58
#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>


#include <iostream>
using namespace std;


osg::ref_ptr<osg::Node> createQuad()
{
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();

    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();

    osg::ref_ptr<osg::Vec3Array> v= new osg::Vec3Array();

    v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
    v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
    v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));
    v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    v->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));

    geom->setVertexArray(v.get());

    osg::ref_ptr<osg::DrawElementsUInt> quad =
            new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);

    quad->push_back(0);
    quad->push_back(1);
    quad->push_back(2);
    quad->push_back(3);

    geom->addPrimitiveSet(quad.get());

    osg::ref_ptr<osg::DrawElementsUInt> triangle =
            new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);

    triangle->push_back(4);
    triangle->push_back(0);
    triangle->push_back(3);

    geom->addPrimitiveSet(triangle.get());

    osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();

    vc->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
    vc->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
    vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
    vc->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));

    osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType, 4, 4>* colorIndex =
            new osg::TemplateIndexArray<unsigned int , osg::Array::UIntArrayType, 4, 4>();

    colorIndex->push_back(0);
    colorIndex->push_back(1);
    colorIndex->push_back(2);
    colorIndex->push_back(3);
    colorIndex->push_back(2);

    geom->setColorArray(vc.get());

    geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

    osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();

    nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));

    geom->setNormalArray(nc.get());
    geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

    geode->addDrawable(geom.get());

    return geode.get();
}

int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    osg::ref_ptr<osg::Group> root = new osg::Group();
    root->addChild(createQuad());
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());

    viewer->setSceneData(root.get());

    viewer->realize();

    viewer->run();

    return 0;
}

---



0 0
原创粉丝点击