- HUD相机原理
HUD相机实际上就是一个camera,通过前置渲染,来完成hud效果,我们需要保证他最后渲染,并且不接受鼠标焦点事件,我们需要前置渲染的内容再放置到此相机即可。 - HUD相机实现
osg::Camera* createCameraHud()
{
osg::ref_ptr<osg::Camera>camera = new osg::Camera;
camera->setViewMatrix(osg::Matrix::identity());//相机设置为单位矩阵
camera->setRenderOrder(osg::Camera::POST_RENDER);
camera->setClearMask(GL_DEPTH_BUFFER_BIT);//清除深度缓存
camera->setAllowEventFocus(false);//不接受焦点
camera->setViewport(600,600, 600, 600);
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);//设置为绝对帧,防止拣选
camera->setProjectionMatrixAsOrtho2D(0,600,0,600);//正视投影的大小
//添加文字
osg::ref_ptr<osg::Geode>geo = new osg::Geode;
geo->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
osg::ref_ptr<osgText::Text> text = new osgText::Text;
geo->addDrawable(text);
text->setFont("fonts/ZhanKuWenYiTi-2.ttf");
text->setCharacterSize(50);//字体大小
text->setText(L"测试");
text->setPosition(osg::Vec3d(0,0,0));
camera->addChild(geo);
//添加纹理
osg::Geometry*gm = new osg::Geometry;
//设置顶点坐标
osg::Vec3Array*vertex = new osg::Vec3Array;
vertex->push_back(osg::Vec3d(0, 0, -1.0));
vertex->push_back(osg::Vec3d(100, 0, -1.0));
vertex->push_back(osg::Vec3d(100,100, -1.0));
vertex->push_back(osg::Vec3d(0, 100, -1.0));
gm->setVertexArray(vertex);
//设置法线
osg::Vec3dArray*norm = new osg::Vec3dArray;
norm->push_back(osg::Vec3(0.0,0.0,1.0));
gm->setNormalArray(norm);
gm->setNormalBinding(osg::Geometry::BIND_OVERALL);
//设置纹理坐标
osg::Vec2dArray*coord = new osg::Vec2dArray;
coord->push_back(osg::Vec2d(0.0,0.0));
coord->push_back(osg::Vec2d(1.0, 0.0));
coord->push_back(osg::Vec2d(1.0, 1.0));
coord->push_back(osg::Vec2d(0.0, 1.0));
gm->setTexCoordArray(0, coord);
gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
//贴纹理
osg::Image*image = osgDB::readImageFile("Cubemap_axis/posz.png");
osg::Texture2D *tex = new osg::Texture2D;
tex->setImage(image);
gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, tex,osg::StateAttribute::ON);
geo->addDrawable(gm);
return camera.release();
}
注意最好使用正视投影防止变形,camera->setProjectionMatrixAsOrtho2D(0,600,0,600);正视投影的值为屏幕坐标和投影宽高,此宽高与窗口宽高相同即可,设置绝对帧来防止拣选camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);