OSG中的HUD實時顯示視點座標

/*OSG中的HUD實時顯示視點座標*/

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

#include <osg/Geode>

#include <osg/Depth>

#include <osg/CameraNode>

#include <osgText/Text>

#include <osgGA/TrackballManipulator>

 

#include <sstream>

 

#pragma comment( lib, "osgd.lib"); //.在Debug版本下的庫名都加d,如"osgd.lib"

#pragma comment( lib, "osgDBd.lib")

#pragma comment( lib, "osgViewerd.lib");

#pragma comment( lib, "osgTextd.lib");

#pragma comment( lib, "osgGAd.lib");

 

using namespace std;

 

//事件類

class CHUD_viewPoint: public osgGA::GUIEventHandler  

{

public:  

 

    /**構造函數*/

      CHUD_viewPoint(osgText::Text* updateText):

      m_text(updateText) {}

 

      ~CHUD_viewPoint(){}

 

      virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);

      void UpdateText(osgViewer::Viewer* viewer,const osgGA::GUIEventAdapter&);

 

      /**LABEL*/

      void setLabel(const std::string& name)

      {

         if ( m_text.get())

         {

             m_text->setText(name); 

         }

      }

 

protected

    osg::Vec3 m_vPosEye;//視點座標

 

    osg::ref_ptr<osgText::Text>  m_text;//視點信息,會動態改變

};

 

bool CHUD_viewPoint::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)

{

    switch(ea.getEventType())

    {

    case(osgGA::GUIEventAdapter::FRAME):

       {

           osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

 

           if (viewer)

           {

              osg::Vec3 vCenter, vUp;

              viewer->getCamera()->getViewMatrixAsLookAt( m_vPosEye, vCenter, vUp);//獲取視點信息

              UpdateText( viewer, ea);//更新文字信息       

 

           }

 

           return true

       }        

    default:     

       return false

 

    }

}

 

void CHUD_viewPoint::UpdateText(osgViewer::Viewer* viewer,const osgGA::GUIEventAdapter&)

{

    std::string gdlist=""

 

    std::ostringstream os;

    os<<"Eye( X: "<< m_vPosEye[ 0]<<"     Y: "<<m_vPosEye[ 1]<<"      Z: "<<m_vPosEye[ 2]<<")";

   

    gdlist = os.str(); 

 

    setLabel(gdlist); 

}

 

osg::Node* createHUD_viewPoint( osgText::Text* text)

{

    //文字

    //osgText::Text* text = new osgText::Text;   

 

    //設置字體

    std::string caiyun("fonts /STCAIYUN.TTF");//此處設置的是漢字字體

    text->setFont(caiyun); 

    //設置文字顯示的位置

    osg::Vec3 position(100.0f,100.0f,0.0f);

    text->setPosition(position);   

    text->setColor( osg::Vec4( 1, 1, 0, 1));

    text->setText(L"");//設置顯示的文字

    text->setCharacterSize(15);

    text->setDataVariance(osg::Object::DYNAMIC);//一定要設置字體爲動態,否則程序會卡住,死在那裏。(參照osgcatch

 

    //幾何體節點

    osg::Geode* geode = new osg::Geode();

    geode->addDrawable( text );//將文字Text作這drawable加入到Geode節點中

    //設置狀態

    osg::StateSet* stateset = geode->getOrCreateStateSet(); 

    stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);//關閉燈光

    stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);//關閉深度測試

    //打開GL_BLEND混合模式(以保證Alpha紋理正確)

    stateset->setMode(GL_BLEND,osg::StateAttribute::ON);

 

 

    //相機

    osg::Camera* camera = new osg::Camera;

    //設置透視矩陣

    camera->setProjectionMatrix(osg::Matrix::ortho2D(0,600,0,600));//正交投影   

    //設置絕對參考座標系,確保視圖矩陣不會被上級節點的變換矩陣影響

    camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

    //視圖矩陣爲默認的

    camera->setViewMatrix(osg::Matrix::identity());

 

    //設置背景爲透明,否則的話可以設置ClearColor 

    camera->setClearMask(GL_DEPTH_BUFFER_BIT);

    camera->setAllowEventFocus( false);//不響應事件,始終得不到焦點

 

    //設置渲染順序,必須在最後渲染

    camera->setRenderOrder(osg::CameraNode::POST_RENDER); 

 

    camera->addChild(geode);//將要顯示的Geode節點加入到相機

 

    return camera; 

};

 

 

int main( int argc, char **argv )

{

    osgViewer::Viewer viewer; 

 

    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("fountain.osg");

 

    osg::ref_ptr<osg::Group> root= new osg::Group; 

    root->addChild( model.get());//加入某個模型

 

 

    osgText::Text* text = new osgText::Text;

    osg::ref_ptr< CHUD_viewPoint> pHUD= new CHUD_viewPoint( text);

    root->addChild( createHUD_viewPoint( text));//加入HUD文字

   

    viewer.addEventHandler( pHUD.get());

 

    viewer.setSceneData( root.get());

    viewer.realize();

    viewer.run() ;  

   

    return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章