osg中实现文字显示和HUD

一开始不知道什么事HUD,云里雾里,后来看了孤独钓客的博客才明白,后来自己就仿照做了一个。

/*	
*Add text to a scene - both HUD style text and text as part of the scene. 
*By smells2 
*At Lab 2012-02-22 
*smells2@sina.com
*/

#ifdef _DEBUG
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgTextd.lib")
#endif

#include <osgDB/readfile>
#include <osgViewer//Viewer>	
#include <osg/Group>
#include <osg/Node>

#include <osg/PositionAttitudeTransform>
#include <osg/Projection>
#include <osg/MatrixTransform>
#include <osg/Geode>
#include <osgText/Text>
#include <osgText//Font>


#include <iostream>

osg::ref_ptr<osg::Geode> createPanel()
{
	

	//beging
	//画一个矩形模拟HUD面板
	osg::ref_ptr<osg::Geometry> panelGeom = new osg::Geometry;
	osg::ref_ptr<osg::Geode> panelGeode = new osg::Geode;
	osg::ref_ptr<osg::Vec3Array> vertexArray = new osg::Vec3Array;
	vertexArray->push_back(osg::Vec3(0,0,-1));
	vertexArray->push_back(osg::Vec3(1366,0,-1));
	vertexArray->push_back(osg::Vec3(1366,200,-1));
	vertexArray->push_back(osg::Vec3(0,200,-1));

	osg::ref_ptr<osg::Vec4Array> colorArray = new osg::Vec4Array;
	colorArray->push_back(osg::Vec4(0.1f, 0.2f, 0.4f, 0.8f));

	osg::ref_ptr<osg::DrawElementsUInt> panelUnit = new osg::DrawElementsUInt(osg::PrimitiveSet::POLYGON,0);
	panelUnit->push_back(0);
	panelUnit->push_back(1);
	panelUnit->push_back(2);
	panelUnit->push_back(3);

	osg::ref_ptr<osg::Vec3Array> normalArray = new osg::Vec3Array;
	normalArray->push_back(osg::Vec3(0.0f,0.0f,1.0f));

	osg::ref_ptr<osg::Vec2Array> textrueIndex = new osg::Vec2Array;
	textrueIndex->push_back(osg::Vec2(0.0f,0.0f));
	textrueIndex->push_back(osg::Vec2(1.0f,0.0f));
	textrueIndex->push_back(osg::Vec2(1.0f,1.0f));
	textrueIndex->push_back(osg::Vec2(0.0f,1.0f));

	panelGeom->setVertexArray(vertexArray.get());
	panelGeom->setNormalArray(normalArray.get());
	panelGeom->setNormalBinding(osg::Geometry::BIND_OVERALL);
	panelGeom->setColorArray(colorArray.get());
	panelGeom->setColorBinding(osg::Geometry::BIND_OVERALL);
	panelGeom->setTexCoordArray(0,textrueIndex.get());
	panelGeom->addPrimitiveSet(panelUnit.get());

	panelGeode->addDrawable(panelGeom.get());
	//end

	//begin
	//载入纹理
	osg::ref_ptr<osg::Texture2D> HUDTexture = new osg::Texture2D;
	HUDTexture->setDataVariance(osg::Object::DYNAMIC);
	osg::ref_ptr<osg::Image> HUDImage = osgDB::readImageFile("D:\\OSG\\osg2.9\\OpenSceneGraph2.9.5\\data\\Images\\skymap.jpg");
	HUDTexture->setImage(HUDImage.get());
	osg::ref_ptr<osg::StateSet> HUDStateSet = new osg::StateSet;
	HUDStateSet->setTextureAttributeAndModes(0,HUDTexture.get());
	HUDStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
	HUDStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
	HUDStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
	HUDStateSet->setRenderBinDetails(11, "RenderBin");
	panelGeode->setStateSet(HUDStateSet.get());
	//end
	return panelGeode;
}



int main()
{
	//begin
	//this block is used to load tankNode and landNode from file.If loading failed ,program will return value of "-1"
	osg::ref_ptr<osg::Group> root = new osg::Group;
	osg::ref_ptr<osg::Geode> panelGeode = createPanel();
	osg::ref_ptr<osg::Node> tankNode = osgDB::readNodeFile("D:\\OSG\\osg2.9\\OpenSceneGraph2.9.5\\data\\T72-tank\\t72-tank_des.flt");
	if (!tankNode.get())
	{
		std::cout<<"\"tank\" file load error!"<<std::endl;
		return -1;
	}
	osg::ref_ptr<osg::Node> landTankNode = osgDB::readNodeFile("D:\\OSG\\osg2.9\\OpenSceneGraph2.9.5\\data\\T72-tank\\JoeDirt.flt");
	if (!landTankNode.get())
	{
		std::cout<<"\"land_tank\" file load error!"<<std::endl;
		return -1;
	}
	//end

	//begin
	//this block is used to take the tankNode upword the landNode.It need osg::PositionAttributeTransform
	osg::ref_ptr<osg::PositionAttitudeTransform> tankXForm = new osg::PositionAttitudeTransform;
	tankXForm->setPosition(osg::Vec3(5,5,8));
	tankXForm->addChild(tankNode.get());
	//end

	//begin
	//this block intend to create a label with text "tank #1" and displayed in the scene
	osg::ref_ptr<osgText::Text> tankLabel = new osgText::Text();
	osg::ref_ptr<osg::Geode> textGeode = new osg::Geode;
	
	tankLabel->setCharacterSize(2);
	tankLabel->setFont("D:\\OSG\\osg2.9\\OpenSceneGraph2.9.5\\data\\fonts\\times.ttf");
	tankLabel->setText("tank #1");
	tankLabel->setAxisAlignment(osgText::Text::SCREEN);
	tankLabel->setDrawMode(osgText::Text::TEXT);
	
	tankLabel->setAlignment(osgText::Text::CENTER_CENTER);
	tankLabel->setPosition( osg::Vec3(0,0,4) );
	tankLabel->setColor( osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) );
	textGeode->addDrawable(tankLabel.get());
	tankXForm->addChild(textGeode.get());
	//end

	//begin
	//裁剪一个矩形,用来承装文字,并且不随场景的变化而变化
	osg::ref_ptr<osg::Projection> HUDProjection = new osg::Projection;
	HUDProjection->setMatrix(osg::Matrix::ortho2D(0,1366,0,768));
	osg::ref_ptr<osg::MatrixTransform> HUDViewMatrix = new osg::MatrixTransform;
	HUDViewMatrix->setMatrix(osg::Matrix::identity());
	HUDViewMatrix->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
	HUDProjection->addChild(HUDViewMatrix.get());
	HUDViewMatrix->addChild(panelGeode.get());
	//end

	//begin
	osg::ref_ptr<osgText::Text> text = new osgText::Text;
	text->setCharacterSize(50);
	text->setFont("D:\\OSG\\osg2.9\\OpenSceneGraph2.9.5\\data\\fonts\\STXINGKA.TTF");
	text->setText(L"战车恰恰");
	text->setAlignment(osgText::Text::CENTER_CENTER);
	text->setAxisAlignment(osgText::Text::SCREEN);
	text->setPosition(osg::Vec3(360,165,-1.5));
	text->setColor(osg::Vec4(199, 77, 15, 1));
	panelGeode->addDrawable(text.get());
	//end
	

	

	root->addChild(HUDProjection.get());
	root->addChild(tankXForm.get());
	root->addChild(landTankNode.get());
	
	osgViewer::Viewer myViewer;
	myViewer.setSceneData(root.get());
	//myViewer.realize();
	myViewer.run();
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值