OSG
HUD...
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);
|