OSGHUD...
OSG-HUD
如何创建HUD ?
本质上说,HUD就是一个相机(
在OSG中可以作为节点),只是不响应鼠标的操作。只需要设置好相关的参数,添加到场景的根节点就行
实现要点,如下:
- 关闭节点的光照,保证整个视口显示的场景的亮度是一样的。
 
- 关闭深度测试
 
- 调整渲染的顺序为最后渲染,让
HUD显示在整个场景的最前方 
- 设置参考帧为绝对参考帧
 
- 设置变换矩阵,不受父节点的影响
 
- 设置投影矩阵(平行投影或者透视),设置视口的大小。
 
Create HUD
1、创建相机节点
1 2
   | osg::ref_ptr<osg::Camera> hud_camera = new osg::Camera;    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;      
   | 
 
2、设置投影矩阵
1
   | hud_camera->setProjectionMatrixAsOrtho2D(-3, 4, -3, 4, -1.0, 100);  
   | 
 
3、设置视口大小(ViewPort)
1 2 3
   | 
  hud_camera->setviewport();  
 
  | 
 
4、设置渲染的顺序
1
   | hud_camera->setRenderOrder(osg::Camera::POST_RENDER);
   | 
 
5、设置参考帧
1
   | hud_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
   | 
 
6、设置不受父节点的影响
1
   | hud_camera->setViewMatrix(osg::Matrix::identity());
   | 
 
7、设置不获取焦点
1
   | hud_camera->setAllowEventFocus(false);
   | 
 
8、设置节点的更新回调
1 2 3 4 5
   | 
 
 
  hud_camera->setUpdateCallback();
 
  | 
 
挂载节点
1、将前面创建的几何节点挂载到
相机上
1 2 3
   | osg::ref_ptr<osg::Geode> node = new osg::Geode; node->addChild(geom.get()); hud_camera->addChild(node.get());
   | 
 
2、设置节点的属性
1 2 3 4
   | auto states = node->getOrCreateStateSet(); states->setMode(GL_LIGHTING, osg::StateAttribute::ON);    states->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); states->setMode(GL_BLEND, osg::StateAttribute::ON);  
   |