查看: 5502|回复: 9

请教一个问题,关于利用hudCamera中显示图片

[复制链接]

该用户从未签到

发表于 2008-4-30 17:36:02 | 显示全部楼层 |阅读模式
想在窗口的右上角显示一个图片标志。我看到在例子osgpick中利用hudcamera显示文字,可以让文字一直处于最前端的屏幕上。
那么我要做的就是将文字替换成图片就可以。但是死活就是看不到图片。不知道这里面有什么需要注意的地方,谢谢。
另附我的代码如下:

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/Geode>
#include <osg/Texture2D>
#include <osgViewer/Viewer>
#include <osg/PositionAttitudeTransform>
#include <osgText/Text>

int main( int argc, char **argv )
{
    osgViewer::Viewer viewer;

    osg::ref_ptr<osg::Group> rootNode = new osg::Group();
    rootNode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    osg::Geode* geode = new osg::Geode;
    osg::Image* image = osgDB::readImageFile("Catch/a.png");
    if (image)
    {
            osg::Vec3 _origin= osg::Vec3(-1.0f,0.0f,0.0f);
            osg::Vec3 _width;
            osg::Vec3 _height;
            _width.set(2.56f,0.0f,0.0f);
                _height.set(0.0f,0.0f,2.56f);
        osg::Geometry* geometry = osg::createTexturedQuadGeometry(_origin,_width,_height);
        osg::StateSet* stateset = geometry->getOrCreateStateSet();
        stateset->setTextureAttributeAndModes(0,new osg::Texture2D(image),osg::StateAttribute::ON);
        stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
        stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
                stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);

        geode->addDrawable(geometry);
    }
        osg::Camera* hudCamera = new osg::Camera;
        hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        hudCamera->setProjectionMatrixAsOrtho2D(0,1280,0,1024);
        hudCamera->setViewMatrix(osg::Matrix::identity());
        hudCamera->setRenderOrder(osg::Camera:OST_RENDER);
        hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);

    osg::PositionAttitudeTransform* transform = new osg::PositionAttitudeTransform;
        transform->setPosition(osg::Vec3(0.0,-10.0,0.0));
        transform->addChild(geode);
       
        hudCamera->addChild(transform);
        rootNode->addChild(hudCamera);

        {//为了验证hudcamera有效,添加了文字,但是文字能显示,但图片没见到。
                std::string timesFont("fonts/times.ttf");
                // turn lighting off for the text and disable depth test to ensure its always ontop.
                osg::Vec3 position(50.0f,80.0f,0.0f);
                osg::Geode* geode = new osg::Geode();
                osg::StateSet* stateset = geode->getOrCreateStateSet();
                stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
                stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
                geode->setName("simple");
                hudCamera->addChild(geode);
                osgText::Text* text = new  osgText::Text;
                geode->addDrawable( text );
                text->setFont(timesFont);
                text->setText("icking in Head Up Displays is simple!");
                text->setPosition(position);
        }   
//        rootNode->addChild(transform);//如果加这句可以看到图片,说明图片调用正确。

    viewer.setSceneData(rootNode.get());

    viewer.realize();
    osg::Matrix matrix;
    matrix.makeLookAt(osg::Vec3(0.0f,1.0,0.0f),osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f));               
   viewer.getCamera()->setViewMatrix(matrix);
   
   while( !viewer.done() )
    {
       viewer.frame();
    }
   
    return 0;

//        return viewer.run();
}

该用户从未签到

发表于 2008-4-30 22:36:10 | 显示全部楼层
注意一下setProjectionMatrixAsOrtho2D起到的作用,也就是正交投影的定义.
它负责把三维空间的XY平面投射到屏幕上。但是您的图片几何体好像是平行于XZ平面放置的?那样的话显示的就只是一条直线了

该用户从未签到

 楼主| 发表于 2008-5-1 09:38:04 | 显示全部楼层
原帖由 array 于 2008-4-30 22:36 发表
注意一下setProjectionMatrixAsOrtho2D起到的作用,也就是正交投影的定义.
它负责把三维空间的XY平面投射到屏幕上。但是您的图片几何体好像是平行于XZ平面放置的?那样的话显示的就只是一条直线了


谢谢你的帮助(array总是那么热情:-))。

[ 本帖最后由 wontor 于 2008-5-1 10:11 编辑 ]

该用户从未签到

发表于 2010-6-18 10:31:37 | 显示全部楼层
3# wontor
您的问题解决了吗,我遇到了一样的问题,试过Array的建议,不过还是没看到图片啊

该用户从未签到

发表于 2010-6-18 11:46:30 | 显示全部楼层
2# array
请问在hudcamera中用文字和用图片有什么区别吗,为什么文字可以显示出来,图片就不行呢,我也基本按照楼主的方法实现的,您说的坐标的问题是改成这样吗:
_width.set(2.56f,0.0f,0.0f);
_height.set(0.0f,2.56f,0.0f);
osg::Geometry* geometry = osg::createTexturedQuadGeometry(_origin,_width,_height);

该用户从未签到

发表于 2010-6-18 16:06:08 | 显示全部楼层
您有正确设置自己的投影矩阵吗?请给出更多的信息

该用户从未签到

发表于 2010-6-18 17:45:50 | 显示全部楼层
6# array
问题解决了,汗啊,都不好意思说,那个width和height的尺寸设的太小了,生成的图像比米粒还小,之前一直都没看到...

该用户从未签到

发表于 2010-7-27 22:07:53 | 显示全部楼层
你好,你的这个例子,我编译了一下,好像一直没有看到图片啊!不知道你的width和height尺寸设置的是多少?

该用户从未签到

发表于 2013-12-6 10:20:40 | 显示全部楼层
为什么我按照您的代码,运行之后文字和图片都无法显示,只显示一片白色区域呢?
捕获.PNG

该用户从未签到

发表于 2013-12-6 16:59:46 | 显示全部楼层
这个问题查看cookbook中的指南针例子就可以,并且支持图片透明化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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