osg解析系列-[osgSim::LightPointNode]光点的应用示例(如:模拟街边的一排路灯)

osgSim是仿真计算库,osgSim::LightPointNode可用来模拟街边的一排路灯。代码如下:

// M23.12.W9.osgSim.LightPoint.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

//osg
#include <osg/Texture2D>
#include <osg/ShapeDrawable>
#include <osg/MatrixTransform>
#include <osg/Geometry>
#include <osg/Material>
#include <osg/PolygonMode>
#include <osg/PolygonOffset>
#include <osg/OccluderNode>
#include <osg/LineWidth>
#include <osg/io_utils>
#include <osg/CullFace>
#include <osg/Stencil>

#include <osg/PositionAttitudeTransform>
#include <osg/MatrixTransform>
#include <osg/CoordinateSystemNode>

// osgviewer
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
// osgDB
#include <osgDB/FileUtils>
#include <osgDB/fstream>
#include <osgDB/ReadFile>

// osgGA
#include <osgGA/NodeTrackerManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>


//osgUtil
#include <osgUtil/Optimizer>

//osgManipulator
#include <osgManipulator/TabBoxDragger>
#include <osgManipulator/TabBoxTrackballDragger>
#include <osgManipulator/TabPlaneDragger>
#include <osgManipulator/TabPlaneTrackballDragger>
#include <osgManipulator/Scale1DDragger>
#include <osgManipulator/Scale2DDragger>
#include <osgManipulator/TrackballDragger>
#include <osgManipulator/Translate1DDragger>
#include <osgManipulator/Translate2DDragger>
#include <osgManipulator/TranslateAxisDragger>
#include <osgManipulator/TranslatePlaneDragger>
#include <osgManipulator/RotateCylinderDragger>
#include <osgManipulator/AntiSquish>

//osgsim
#include <osgSim/OverlayNode>
#include <osgSim/SphereSegment>
#include <osgSim/Impostor>
#include <osgSim/InsertImpostorsVisitor>
#include <osgSim/LightPointNode>

//osglib
#ifdef _DEBUG
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgFXd.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgTextd.lib")
#pragma comment(lib,"osgViewerd.lib")

#pragma comment(lib,"osgShadowd.lib")
#pragma comment(lib,"osgManipulatord.lib")
#pragma comment(lib,"osgParticled.lib")
#pragma comment(lib,"osgSimd.lib")
#else
#pragma comment(lib,"OpenThreads.lib")
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"osgFX.lib")
#pragma comment(lib,"osgGA.lib")
#pragma comment(lib,"osgUtil.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osgShadow.lib")
#pragma comment(lib,"osgManipulator.lib")
#pragma comment(lib,"osgSim.lib")
#endif // DEBUG

int main(int argc, char** argv)
{
	// use a ArgumentParser object to manage the program arguments
	osg::ArgumentParser Parser(&argc, argv);

	//construct the viewer
	osgViewer::Viewer viewer(Parser);

	//rootnode of the scene 
	osg::ref_ptr<osg::Group> rootnode = new osg::Group;

	auto CreateBlinkSequenceLightNode = []()->osg::Node*
	{
		osgSim::LightPointNode*      lightPointNode = new osgSim::LightPointNode;;

		osgSim::LightPointNode::LightPointList       lpList;

		osg::ref_ptr<osgSim::SequenceGroup>   seq_0;
		seq_0 = new osgSim::SequenceGroup;
		seq_0->_baseTime = 0.0;

		osg::ref_ptr<osgSim::SequenceGroup>   seq_1;
		seq_1 = new osgSim::SequenceGroup;
		seq_1->_baseTime = 0.5;

		const int max_points = 32;
		for (int i = 0; i < max_points; ++i)
		{
			osgSim::LightPoint   lp;
			double x = cos((2.0*osg::PI*i) / max_points);
			double z = sin((2.0*osg::PI*i) / max_points);
			lp._position.set(x, 0.0f, z + 30.0f);
			lp._blinkSequence = new osgSim::BlinkSequence;
			for (int j = 10; j > 0; --j)
			{
				float  intensity = j / 10.0f;
				lp._blinkSequence->addPulse(1.0 / max_points,
					osg::Vec4(intensity, intensity, intensity, intensity));
			}
			if (max_points > 10)
			{
				lp._blinkSequence->addPulse(1.0 - 10.0 / max_points,
					osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f));
			}

			if (i & 1)
			{
				lp._blinkSequence->setSequenceGroup(seq_1.get());
			}
			else
			{
				lp._blinkSequence->setSequenceGroup(seq_0.get());
			}
			lp._blinkSequence->setPhaseShift(i / (static_cast<double>(max_points)));
			lpList.push_back(lp);
		}

		lightPointNode->setLightPointList(lpList);

		return lightPointNode;
	};

	//create lightpoint
	rootnode->addChild(CreateBlinkSequenceLightNode());

	viewer.setSceneData(rootnode);
	//optimize the scene graph,remove redundant node and state etc.
	osgUtil::Optimizer	optimizer;
	optimizer.optimize(rootnode);

	viewer.run();

    return 0;
}


运行效果:
在这里插入图片描述

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值