1.简介
下面例举所有可绘制的几何图元:POINTS[点],LINES[线],LINE_STRIP[线带],LINE_LOOP[闭合线段],TRIANGLES[三
角形],TRIANGLE_STRIP[三角带],TRIANGLE_FAN[三角扇],QUADS[四方块],QUAD_STRIP[四方块带],POLYGON[多边
形],在这里我们要以封闭的直线为例来说明如何设置线宽属性。所有的图元可能都有它的特殊性,但是大 OpenSceneGraph 程序设计
www.osgChina.org 第四章:基本几何图元 76 都与此种设置方法类似。 在 OSG 中设置直线线宽的专门有一个函数来管理,叫做
LineWidth,它本身属于状态与属性类别中的类。事 实上也是从那里派生而来。所有设置状态的操作都与此类似。
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/LineWidth>
#include <osgViewer/ViewerEventHandlers>
osg::ref_ptr<osg::Node> CreateLine();
int main()
{
osgViewer::Viewer viewer;
osg::Group* root = new osg::Group();
root->addChild(CreateLine().get());
viewer.setSceneData(root);
// 窗口大小变化事件 F
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.realize();
return viewer.run();
}
osg::ref_ptr<osg::Node> CreateLine()
{
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::ref_ptr<osg::LineWidth> lineSize = new osg::LineWidth;
lineSize->setWidth(10);
geometry->getOrCreateStateSet()->setAttributeAndModes(lineSize.get(), osg::StateAttribute::ON);
//首先定义四个点
osg::ref_ptr<osg::Vec3Array> vertex = new osg::Vec3Array;
geometry->setVertexArray(vertex.get());
vertex->push_back(osg::Vec3(-1.f, 0.f, -1.f));
vertex->push_back(osg::Vec3(1.f, 0.f, -1.f));
vertex->push_back(osg::Vec3(1.f, 0.f, 1.f));
vertex->push_back(osg::Vec3(-1.f, 0.f, 1.f));
//定义颜色数组
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
geometry->setColorArray(c.get());
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
c->push_back(osg::Vec4(1.f, 0.f, 0.f, 1.f));
c->push_back(osg::Vec4(0.f, 1.f, 0.f, 1.f));
c->push_back(osg::Vec4(0.f, 0.f, 1.f, 1.f));
c->push_back(osg::Vec4(1.f, 1.f, 1.f, 1.f));
//定义法线
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
geometry->setNormalArray(n.get());
geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
n->push_back(osg::Vec3(0.f, -1.f, 0.f));
//设置顶点关联方式
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, 4));
//几何组结点
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(geometry.get());
return geode.get();
}
2.运行结果
正面
背面