一开始不知道什么事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();
}