osg::Viewer的一般创建情况

来源:互联网 发布:jdk 7u80 windows x64 编辑:程序博客网 时间:2024/05/14 16:42
#include <osgViewer/Viewer>#include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/Billboard>#include <osg/Texture2D>#include <osg/Image>#include <osg/PositionAttitudeTransform>#include <osg/MatrixTransform>#include <osgDB/ReadFile>#include <osgDB/WriteFile>#include <osgUtil/Optimizer>osg::ref_ptr<osg::Node> createBillboardTree(osg::ref_ptr<osg::Image> image){//创建四边形osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();v->push_back(osg::Vec3(-0.5f, 0.0f, -0.5f));v->push_back(osg::Vec3(0.5f, 0.0f, -0.5f));v->push_back(osg::Vec3(0.5f, 0.0f, 0.5f));v->push_back(osg::Vec3(-0.5f, 0.0f, 0.5f));geometry->setVertexArray(v.get());//设置法线数组osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array();normal->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)^osg::Vec3(0.0f, 0.0f, 1.0f));geometry->setNormalArray(normal.get());geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);//设置纹理坐标osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();vt->push_back(osg::Vec2(0.0f, 0.0f));vt->push_back(osg::Vec2(1.0f, 0.0f));vt->push_back(osg::Vec2(1.0f, 1.0f));vt->push_back(osg::Vec2(0.0f, 1.0f));geometry->setTexCoordArray(0, vt.get());//绘制四边形geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));if (image.get()){//状态属性对象osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();//创建一个Texture2D属性对象osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D();//关联imagetexture->setImage(image.get());//关联Texture2D纹理对象,第三个参数默认为ONstateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);//启用混合stateset->setMode(GL_BLEND, osg::StateAttribute::ON);//关闭光照stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);geometry->setStateSet(stateset.get());}osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard();billboard1->setMode(osg::Billboard::POINT_ROT_EYE);billboard1->addDrawable(geometry.get(), osg::Vec3(5.0f, 0.0f, 0.0f));osg::ref_ptr<osg::Billboard>billboard2 = new osg::Billboard();billboard2->setMode(osg::Billboard::AXIAL_ROT);billboard2->setAxis(osg::Vec3(0.0f, 0.0f, 1.0f));billboard2->addDrawable(geometry.get(), osg::Vec3(10.0f, 0.0f, 0.0f));osg::ref_ptr<osg::Group> billboard = new osg::Group();billboard->addChild(billboard1.get());billboard->addChild(billboard2.get());return billboard.get();}int main(){//创建Viewer对象,场景浏览器osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::Group> root = new osg::Group();//读取图像osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/tree0.rgba");//缩放,达到合适的大小osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform();pat->setScale(osg::Vec3(5.0f, 5.0f, 5.0f));pat->addChild(createBillboardTree(image.get()));root->addChild(pat.get());//添加到场景root->addChild(osgDB::readNodeFile("cow.osg"));//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());// set the scene to renderviewer->setSceneData(root.get());viewer->setUpViewInWindow(0, 0, 600, 800);//viewer->setUpViewOnSingleScreen(0);viewer->realize();viewer->run();return 0;}

0 0
原创粉丝点击