osg-04-基本几何图元-线宽

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.运行结果

正面
在这里插入图片描述
背面
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值