osg.LineStipple 是 OpenSceneGraph 中用于绘制带有虚线样式的线条的类。它采用两个参数:设置虚线样式的位模式和设置虚线之间的间距的重复因子。
osg::Vec3Array* vertices = new osg::Vec3Array(2);
(*vertices)[0] = osg::Vec3(-1.f, -1.f, 0.f);
(*vertices)[1] = osg::Vec3(1.f, 1.f, 0.f);
osg::Geometry* geometry = new osg::Geometry();
geometry->setVertexArray(vertices);
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2));
osg::Geode* geode = new osg::Geode();
geode->addDrawable(geometry);
osg::StateSet* stateSet = geode->getOrCreateStateSet();
osg::LineStipple* lineStipple = new osg::LineStipple();
lineStipple->setFactor(1);
lineStipple->setPattern(0x00FF);
stateSet->setAttributeAndModes(lineStipple, osg::StateAttribute::ON);
osgViewer::Viewer viewer;
viewer.setSceneData(geode);
return viewer.run();
假设我们想绘制8个像素的虚线,其中每个像素的宽度为1/4,线的宽度为1像素。我们可以设定一个位模式,如下:
X - 空白 O - 线
0000111100001111
这个模式将绘制8个像素,其中相邻的2个像素组成一个连续的线条。
如果我们需要绘制更长的虚线,可以通过增加重复因子来实现。重复因子指定了相邻虚线之间的距离。
用$n$表示重复因子,则绘制出来的虚线图形为以下样式。
(n * O) = 实线,(n * X) = 虚线
00001111......11110000......000
即,每隔$n$个像素,我们会绘制一个实线的段。在上一个例子中,我们设置了重复因子为1,所以相邻的每个虚线之间的距离都是1像素。