#include <osgViewer/Viewer> #include <osg/PositionAttitudeTransform> #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osg/Image> #include <osg/Geometry> #include <osg/Vec3> #include <osg/Vec2> #include <osg/Billboard> #include <osg/Texture2D> 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; osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; //关联image texture->setImage(image.get()); //关联Texture2D纹理对象,第三个参数默认为ON stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON); //启用混合 stateset->setMode(GL_BLEND, osg::StateAttribute::ON); //关闭光照 stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); geometry->setStateSet(stateset.get()); } //创建Billboard对象 osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard; //设置旋转模式为绕视点 billboard1->setMode(osg::Billboard::POINT_ROT_EYE); //添加Drawable,并设置其位置,默认位置为osg::Vec3(5.0f, 0.0f, 0.0f) billboard1->addDrawable(geometry.get(), osg::Vec3(5.0f, 0.0f, 0.0f)); return billboard1.get(); } int main(int argc, char *argv[]) { /*QApplication a(argc, argv); MyTest w; w.show(); return a.exec();*/ osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; osg::ref_ptr<osg::Group> group = 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())); group->addChild(pat.get()); osg::Node* cow = osgDB::readNodeFile("cow.osg"); group->addChild(cow); viewer->setSceneData(group.get()); viewer->realize(); return viewer->run(); }