直接上代码:
osg::ref_ptr<osg::Node> createSimple() {
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::Geometry> geo = new osg::Geometry;
//申请一些顶点
osg::ref_ptr<osg::Vec3Array> vers = new osg::Vec3Array;
geo->setVertexArray(vers.get());
#if 1
geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, 4));//创建一个线圈
#else
geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));//创建一个正方形
#endif
//设置顶点
vers->push_back(osg::Vec3(-1.5, 0.0, -1.5));
vers->push_back(osg::Vec3(1.5, 0.0, -1.5));
vers->push_back(osg::Vec3(1.5, 0.0, 1.5));
vers->push_back(osg::Vec3(-1.5, 0.0, 1.5));
//申请颜色
osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array();
color->push_back(osg::Vec4(1.0, 0.0, 0.0, 0.5));
color->push_back(osg::Vec4(0.0, 1.0, 0.0, 0.5));
color->push_back(osg::Vec4(0.0, 0.0, 1.0, 0.5));
color->push_back(osg::Vec4(1.0, 1.0, 0.0, 0.5));
//设置颜色
geo->setColorArray(color.get());
geo->setColorBinding(osg::Geometry::AttributeBinding::BIND_PER_VERTEX);//设置颜色绑定
//设置法线,正对屏幕的时候最亮
osg::ref_ptr<osg::Vec3Array> norm = new osg::Vec3Array;
geo->setNormalArray(norm);
geo->setNormalBinding(osg::Geometry::AttributeBinding::BIND_OVERALL);
norm->push_back(osg::Vec3(0.0, -1.0, 0.0));
//打开透明度
geo->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
//设置线宽
osg::ref_ptr<osg::LineWidth> w = new osg::LineWidth;
w->setWidth(5.0);
geo->getOrCreateStateSet()->setAttributeAndModes(w.get(), osg::StateAttribute::ON);
geode->addDrawable(geo.get());
return geode;
}
int main(int argc, char** argv) {
for (int i = 0; i < argc; i++) {
printf(argv[i]);
printf("\n");
}
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->addEventHandler(new osgViewer::StatsHandler);
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(osgDB::readNodeFile("xyz.osgt"));
root->addChild(createSimple());
viewer->setSceneData(root);
viewer->realize();
viewer->run();
return 0;
}
运行效果: