osg第28讲(HUD相机基础)

  1. HUD相机原理
    在这里插入图片描述
    HUD相机实际上就是一个camera,通过前置渲染,来完成hud效果,我们需要保证他最后渲染,并且不接受鼠标焦点事件,我们需要前置渲染的内容再放置到此相机即可。
  2. 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);

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值