zoukankan      html  css  js  c++  java
  • OSG中的HUD

    OSG中的HUD

    所谓HUD节点,说白了就是无论三维场景中的内容怎么改变,它都能在屏幕上固定位置显示的节点。

    实现要点:
    • 关闭光照,不受场景光照影响,所有内容以同一亮度显示
    • 关闭深度测试
    • 调整渲染顺序,使它的内容最后绘制
    • 设定参考贴为绝对型:setReferenceFrame(osg::Transform:ABSOLUTE_RF)
    • 使其不受父节点变换的影响:setMatrix(osg::Matrix::identity())
    • 使用平行投影,设定虚拟投影窗口的大小,这个窗口的大小决定了后面绘制的图形和文字的尺度比例
    示例代码:
           // 创建 HUD 摄像机
           osg :: ref_ptr < osg :: Camera > camera = new osg :: Camera ;
           camera -> setProjectionMatrix ( osg :: Matrix :: ortho2D (0, 1000, 0, 1000)); // 表示摄像机里的平面世界有多大
           camera -> setReferenceFrame ( osg :: Transform :: ABSOLUTE_RF );
           camera -> setViewMatrix ( osg :: Matrix :: identity ());

           camera -> setClearMask ( GL_DEPTH_BUFFER_BIT );
           camera -> setAllowEventFocus ( false );
           camera -> setRenderOrder ( osg :: Camera :: POST_RENDER );

           // 创建提示对象
           m_prompt = new osgText :: Text ;

           QFont f ( " 宋体 " );
           osgText :: Font * font = new osgText :: Font ( new osgQt :: QFontImplementation ( f ));

           m_prompt -> setFont ( font );
           m_prompt -> setCharacterSize (16);
           m_prompt -> setPosition ( osg :: Vec3 (0.0f, 10.0f, 0.0f));
           m_prompt -> setColor ( osg :: Vec4 (1, 1, 1, 1));
           m_prompt -> setDataVariance ( osg :: Object :: DYNAMIC );
           m_prompt -> setText ( _conv ( " 坐标 " ), osgText :: String :: ENCODING_UTF8 );

           osg :: ref_ptr < osg :: Geode > geode = new osg :: Geode ;
           geode -> addDrawable ( m_prompt );

           osg :: ref_ptr < osg :: StateSet > stateSet = geode -> getOrCreateStateSet ();
           stateSet -> setMode ( GL_LIGHTING , osg :: StateAttribute :: OFF );
           stateSet -> setMode ( GL_DEPTH_TEST , osg :: StateAttribute :: OFF );
           stateSet -> setMode ( GL_BLEND , osg :: StateAttribute :: ON );

           camera -> addChild ( geode );
     
           // 添加到场景里
           viewer->getSceneData()->asGroup()->addChild(camera);
  • 相关阅读:
    触摸屏测试:Tslib
    Ubuntu:我不小心把/var/lock文件夹给删了
    驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统
    驱动开发学习笔记. 0.01 配置arm-linux-gcc 交叉编译器
    驱动开发学习笔记.0.00 从拿到一块开发板开始
    利用联合体通过串口收发浮点数
    stm32 MDK5软件仿真之查看io口输出
    ListView 类
    INotifyPropertyChanged 接口
    ItemsControl 类绑定数据库
  • 原文地址:https://www.cnblogs.com/chaoswong/p/3144608.html
Copyright © 2011-2022 走看看