画中画,osg三维场景叠加渲染二维纹理HUD相机实现(一)
环境说明
代码使用osg3.6版本。不同版本的API会有变化,可能编译不过或没有效果。如果要运行代码,请确定使用osg3.6版本。
本文以Qt作为渲染窗口载体,osgqt的编译实现不在介绍范围内,默认已经编译通过。
目的
以一个完整的三维场景中,窗口右上方叠加渲染视频流的例子,介绍osg画中画的实现。
连载说明
考虑到完整的画中画实现,涉及到HUD相机,动态构建能缩放的矩形几何节点和opencv控制视频流三个部分,所以用连载方式一步步说明,并给出代码。
HUD相机
在OSG(OpenSceneGraph)中,HUD(Head Up Display,平视显示器)相机是一种特殊的相机,用于在三维场景之上固定显示二维信息(如文字、图标、状态面板等),且这些信息不会随着主场景的视角变换而改变位置。
要创建一个标准的HUD相机,通常需要遵循以下核心步骤和配置:
创建新相机:首先需要创建一个独立的 osg::Camera 对象。
设置参考帧为绝对型:调用 setReferenceFrame(osg::Transform::ABSOLUTE_RF)。这能确保HUD不受父节点或场景中其他图形变换的影响3。
设置视图矩阵为单位矩阵:调用 setViewMatrix(osg::Matrix::identity()),进一步保证节点不随场景视点变化而变化3。
设置正交投影矩阵:HUD通常是二维平面显示,因此需要使用正交投影(Orthographic Projection)。通常通过 setProjectionMatrix(osg::Matrix::ortho2D(...)) 设定虚拟投影窗口的大小,这决定了后续绘制的图形和文字的尺度比例
