OSG学习记录三
在上一节,我们实现了在Qt中添加OSG功能,这样基本的osg的框架也就可以搭好了,所以接下来我们只需往代码中添加OSG模型代码即可。
OSG中添加HUD(Heads Up Display)
在建立三维场景时,往往需要添加一些文字信息或者游戏中的小地图,而这些文字或者小地图不会跟随漫游器移动或翻转操作,始终显示在场景中,即抬头显示功能。
先贴代码,后面慢慢说明
osg::Camera* OSGQtDemo::CreateHUD(const std::string& hud_text, const unsigned int& width, const unsigned int& height)
{
osg::ref_ptr<osg::Camera> hud_camera = new osg::Camera;
hud_camera->setName("hud_camera");
hud_camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width, 0 , height));
hud_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
hud_camera->setViewMatrix(osg::Matrix::identity());
hud_camera->setClearMask(GL_DEPTH_BUFFER_BIT);
hud_camera->setRenderOrder(osg::Camera::POST_RENDER);
hud_camera->setAllowEventFocus(false);
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
std::string font("fonts/arial.ttf");
// turn lighting off for the text and disable depth test to ensure it's always ontop.
osg::StateSet* stateset = geode->getOrCreateStateSet();
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
osg::Vec3 position(15.0f, 5.0f, 0.0f);
{
osgText::Text* text = new osgText::Text;
text->setCharacterSizeMode(osgText::TextBase::SCREEN_COORDS);
text->setName("hud_geode");
geode->addDrawable( text );
text->setColor(osg::Vec4(1.0, 0.5,0.5, 1.0));
text->setFont(font);
text->setPosition(position);
text->setText(hud_text);
}
hud_camera->addChild(geode);
}
return hud_camera.release();
}
(1). 首先要创建一个Camera, 设置Camera为二维正交投影坐标系,这样保证放大缩小,文字或图片都是同样大小;
(2). 设置Camera的参考帧为绝对坐标系,设为绝对坐标系参考帧后,Camera中的结点都是相对于屏幕左下角(0,0)点移动;
(3). 设置Camera的选择顺序为POST_RENDER,这样可以保证后面添加的图像或图形不会覆盖该hud,也就是说保证该Camera最后绘制;
(4). 设置Camera不允许获取到焦点;
(5). 添加Geode;
(6). 创建一个osgText::Text;
(7). 设置Text字体模式为SCREEN_COORDS,这样就保证文字字体大小只是相对于屏幕调整大小;
(8). 设置Text文字字体,并设置Text文字内容;
(9). 将Text添加到Geode中
(10). 设置Text字体颜色、大小、位置等;
(11). 将Geode添加到Camera中;
如果是要创建小地图,方法和上面是一样的。