在三维场景中我们经常遇到需要小地图的时候,由于小地图是一直显示在最前端的,所以可以考虑使用HUD相机的方式绘制一个小地图,甚至我们还可以在小地图上标示出当前的视点(或者模型)以及它的移动。
实现功能目标:
- 实现小地图;
- 在小地图上实时的标示出视点位置。
1、HUD相机创建代码如下:
m_pHUDCamera = new osg::Camera;
// 设置投影矩阵
m_pHUDCamera->setProjectionMatrixAsOrtho2D(m_iX, m_iWidth, m_iY, m_iHeight);
// 设置视口矩阵
m_pHUDCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
m_pHUDCamera->setViewMatrix(osg::Matrix::identity());
// 只清除深度缓冲区
m_pHUDCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
// 设置HUD相机在主相机之后渲染
m_pHUDCamera->setRenderOrder(osg::Camera::POST_RENDER);
// HUD相机不获取Event的焦点
m_pHUDCamera->setAllowEventFocus(false);
m_pHUDCamera->setViewport(m_iX, m_iY, m_iWidth, m_iHeight);
2、完成HUD相机的创建后,我们就可以在HUD相机上贴小地图的纹理了,代码如下:
// 增加HUD相机的渲染内容,即map
osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
// 创建纹理
osg::ref_ptr<osg::Geometry> pGeometry = new osg::Geometry;
{
// 顶点
osg::ref_ptr<osg::Vec3Array> verArray = new osg::Vec3Array;
verArray->push_back(osg::Vec3(0, 0, -1));
verArray->push_back(osg::Vec3(m_iWidth, 0, -1));
verArray->push_back(osg::Vec3(m_iWidth, m_iHeight, -1));
verArray-></