查看: 1867|回复: 13

问下大家,我的hud相机里不能显示图像?

[复制链接]

该用户从未签到

发表于 2011-11-1 14:31:02 | 显示全部楼层 |阅读模式
问下大家,我的一个quad(已经贴图了)在场景里可以看到,然后addchild到hud相机里面,却看不到是啥原因呢,hud相机里已经画了文本osgText可以显示的。

该用户从未签到

 楼主| 发表于 2011-11-1 16:27:01 | 显示全部楼层
搜过array的相关回答,quad要求在xoy平面上,是吗,但是测试了也不行

该用户从未签到

发表于 2011-11-1 20:25:24 | 显示全部楼层
您提供的信息不足以帮助判断什么

该用户从未签到

 楼主| 发表于 2011-11-2 14:13:01 | 显示全部楼层
array大师,我把代码贴上来,您有空的话看一下?看是什么问题

int main( int argc, char* argv[])
{
        //创建Viewer对象,场景浏览器
        viewer = new osgViewer::CompositeViewer();
        //创建场景组节点
        root = new osg::Group();

        //设置图形环境特性
        m_Traits = new osg::GraphicsContext::Traits;
        m_Traits->x = 4;
        m_Traits->y = 30;
        m_Traits->width = 1024;//rect.right - rect.left;
        m_Traits->height = 768;//rect.bottom - rect.top;
        //此处省略n行代码

        //创建图形环境特性
        osg::ref_ptr<osg::GraphicsContext>gc=osg::GraphicsContext::createGraphicsContext(m_Traits.get());
        if (gc->valid())
        {
                osg::notify(osg::INFO)<<"GraphicsWindow创建成功。"<<std::endl;

                //清除窗口颜色及颜色和深度缓冲
                gc->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.6f, 1.0f));
                gc->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        }
        else
        {
                osg::notify(osg::NOTICE)<<"GraphicsWindow创建失败。"<<std::endl;
        }

该用户从未签到

 楼主| 发表于 2011-11-2 14:13:16 | 显示全部楼层
//视图一
        {
                //创建视图一
                osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
                viewer->addView(view.get());

                //设置视图场景数据
                osg::ref_ptr<osg::Group> UIRoot = new osg::Group();
                UIRoot->addChild(createHUD());
                //优化场景数据
                osgUtil::Optimizer optimizer ;
                optimizer.optimize(UIRoot);

                view->setSceneData(UIRoot);

                //设置相机视口及图形环境
                view->getCamera()->setViewport(new osg::Viewport(0, 0, m_Traits->width/2, m_Traits->height));
                view->getCamera()->setGraphicsContext(gc.get());
        }

        //视图二
        {
        //此处省略n行代码
        }

        //初始化并创建窗口
        viewer->realize();

        //开始渲染
        viewer->run();

        return 0;
}

该用户从未签到

 楼主| 发表于 2011-11-2 14:17:14 | 显示全部楼层
osg::ref_ptr<osg::Camera> createHUD()
{
        osg::ref_ptr<osg::Camera> camera = new osg::Camera();

        //设置投影矩阵
        camera->setProjectionMatrix(osg::Matrix:rtho2D(0, m_Traits->width/2, 0, m_Traits->height));
        //设置视图矩阵,同时确保不被场景中其他图形位置变换影响,使用绝对帧引用
        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera->setViewMatrix(osg::Matrix::identity());
        //清除深度缓存
        camera->setClearMask(GL_DEPTH_BUFFER_BIT);

该用户从未签到

 楼主| 发表于 2011-11-2 14:34:56 | 显示全部楼层
奇怪,上传代码为什么这么费劲

该用户从未签到

 楼主| 发表于 2011-11-2 14:55:13 | 显示全部楼层
真奇怪

该用户从未签到

发表于 2011-11-2 15:27:25 | 显示全部楼层

  1. //设置渲染顺序为POST
  2.         camera->setRenderOrder(osg::Camera::POST_RENDER);

  3.         //设置为不接收事件,始终不得到焦点
  4.         camera->setAllowEventFocus(false);

  5.         osg::ref_ptr<osg::Geode> geode = new osg::Geode();
  6.         osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet();

  7.         //关闭光照
  8.         stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
  9.         //关闭深度测试
  10.         stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);

  11.         //设置文字
  12.         osg::ref_ptr<osgText::Text> text = new osgText::Text();
  13.         osg::ref_ptr<osgText::Font> font = new osgText::Font();
  14.         font = osgText::readFontFile("simhei.ttf");

  15.         text->setFont(font.get());
  16.         text->setText(L"测试文字");
  17.         text->setPosition(osg::Vec3(0.0f, 0.0f, 0.0f));
  18.         text->setCharacterSize(24.0f);
  19.         text->setColor(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
  20.         //text->setDrawMode(osgText::Text::TEXT|osgText::Text::BOUNDINGBOX);
  21.         text->setDrawMode(osgText::Text::TEXT);

  22.         geode->addDrawable(text.get());

  23.         camera->addChild(geode.get());

  24.         //设置图像
  25.         char UIPictPath[255];
  26.     int StringLen = strlen(ExePath);       
  27.         memset(UIPictPath, 0, StringLen+1);//在styncpy之前,进行初始化
  28.     strncpy(UIPictPath, ExePath, StringLen);
  29.         strcat(UIPictPath, " \\UI\\bak.jpg");
  30.         std::cout<<UIPictPath<<std::endl;

  31.         osg::ref_ptr<osg::Image> image = osgDB::readImageFile( UIPictPath );
  32.         ////设置变换矩阵
  33.         //osg::ref_ptr<osg::MatrixTransform> mt_UIBak = new osg::MatrixTransform;
  34.         //mt_UIBak->setMatrix(osg::Matrix::scale(osg::Vec3(1.0,1.0,1.0))*osg::Matrix::translate(osg::Vec3(0,0,0)));
  35.         //mt_UIBak->addChild( createPlane(1.0, 1.0, image.get()) );
  36.         //camera->addChild(mt_UIBak);
  37.         camera->addChild( createPlane(1.0, 1.0, image.get()) );

  38.         return camera.get();
  39. }

  40. osg::ref_ptr<osg::Node> createPlane( float length, float width, osg::Image* image )
  41. {
  42.         // Vertices, normal and texture coordinates of the reference plane
  43.         osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
  44.         vec->resize( 4 );
  45.         (*vec)[0] = osg::Vec3f(  length, 0, width )*0.5;
  46.         (*vec)[1] = osg::Vec3f( -length, 0, width )*0.5;
  47.         (*vec)[2] = osg::Vec3f( -length, 0,-width )*0.5;
  48.         (*vec)[3] = osg::Vec3f(  length, 0,-width )*0.5;
  49.         osg::ref_ptr<osg::Vec3Array> nor = new osg::Vec3Array;
  50.         nor->push_back( osg::Vec3f( 0.0, -1.0, 0.0 ) );

  51.         //此处省略n行代码

  52.         return geode.get();
  53. }
复制代码
以上代码是帮liushui发的,他说他发不上来

该用户从未签到

 楼主| 发表于 2011-11-2 15:28:12 | 显示全部楼层
多谢你了,

该用户从未签到

 楼主| 发表于 2011-11-2 15:28:31 | 显示全部楼层
我只能发这几个字,多了发不出

该用户从未签到

发表于 2011-11-2 18:10:42 | 显示全部楼层
hud里的quad要与投影矩阵的设置相匹配才能看到,请注意投影矩阵的设置与quad

该用户从未签到

 楼主| 发表于 2011-11-3 09:17:29 | 显示全部楼层
明白了,quad尺寸太小了,看不到,
现在尺寸放大了就显示成功了,多谢各位了

该用户从未签到

 楼主| 发表于 2011-11-3 09:18:20 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表