查看: 1682|回复: 8

请教2D材质的问题

[复制链接]

该用户从未签到

发表于 2011-2-24 16:56:32 | 显示全部楼层 |阅读模式
本帖最后由 sakiel 于 2011-2-24 17:12 编辑

请教各位高人,我想将视频帧作为2D材质充满整个Viewer的窗口,这个材质随着视频的播放而不断更新的,请问该如何实现啊?
不用考虑如何获取视频帧,每一帧都是可以获得的,放在一个内存缓冲区中,不断更新,只要告诉我怎么贴图就行了。
我是一个新人,刚开始学习osg,看了一些教程,但还是不太明白,请各位不吝赐教,谢谢!

该用户从未签到

发表于 2011-2-24 17:36:38 | 显示全部楼层
好像是把视频当纹理设置给一个平面就行了~~
平面大小位置什么的自己调整就行了

该用户从未签到

 楼主| 发表于 2011-2-24 18:50:32 | 显示全部楼层
本帖最后由 sakiel 于 2011-2-25 17:23 编辑

谢谢,我大致也知道是这个思路,可是我绘制了一个平面,怎么老是无法吻合我的窗口大小啊
代码在下面

该用户从未签到

发表于 2011-2-25 08:14:01 | 显示全部楼层
最简单的做法莫过于构建一个HUD相机,在其中绘制一个四边形并使其完全覆盖窗口,在四边形上贴图

该用户从未签到

 楼主| 发表于 2011-2-25 10:40:00 | 显示全部楼层
本帖最后由 sakiel 于 2011-2-25 17:23 编辑

如何能够绘制一个正好覆盖窗口的矩形啊?我对场景里的坐标单位一直比较糊涂 。。。
我现在的目的是将摄像头采集的每一帧作为场景的背景显示,要求正好能够吻合Viewer的大小(不大不小),之后绘制虚拟于场景之中,其实就是增强现实啦。

该用户从未签到

发表于 2011-2-25 14:56:55 | 显示全部楼层
设置合适的正交投影矩阵就可以了

该用户从未签到

 楼主| 发表于 2011-2-25 17:22:14 | 显示全部楼层
本帖最后由 sakiel 于 2011-2-25 17:24 编辑

我把我的代码重新贴一下吧,请各位大侠给指点一下。
按照array说的去实现了一下:
  1. // screen size
  2.         unsigned int w = 960;
  3.         unsigned int h = 640;
  4.        
  5.         // camera
  6.         osg::ref_ptr<osg::Camera> hudCamera = new osg::Camera;
  7.         hudCamera->setProjectionMatrix(osg::Matrix::ortho2D(0,w,0,h));
  8.         hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  9.         hudCamera->setViewMatrix(osg::Matrix::identity());
  10.         hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
  11.         hudCamera->setRenderOrder(osg::Camera::POST_RENDER);
  12.        
  13.         // texture <<============================

  14.         osg::Geometry * rectBG = new osg::Geometry;       
  15.         osg::Vec3Array* vertices = new osg::Vec3Array(4);
  16.         (*vertices)[0].set(0.f, 0.f, (float)h);
  17.     (*vertices)[1].set(0.f, 0.f, 0.f);
  18.     (*vertices)[2].set((float)w, 0.f, 0.f);
  19.     (*vertices)[3].set((float)w, 0.f, (float)h);
  20.     rectBG->setVertexArray(vertices);
  21.    
  22.     osg::Vec2Array* texcoords = new osg::Vec2Array(4);
  23.     (*texcoords)[0].set(0.0f, 1.0f);
  24.     (*texcoords)[1].set(0.0f, 0.0f);
  25.     (*texcoords)[2].set(1.0f, 0.0f);
  26.     (*texcoords)[3].set(1.0f, 1.0f);
  27.     rectBG->setTexCoordArray(0,texcoords);
  28.        
  29.     osg::Vec3Array* normals = new osg::Vec3Array(1);
  30.     (*normals)[0].set(0.0f,1.0f,0.0f);
  31.     rectBG->setNormalArray(normals);
  32.     rectBG->setNormalBinding(osg::Geometry::BIND_OVERALL);
  33.         rectBG->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4));
  34.         osg::Geode* BG_geode = new osg::Geode;
  35.     BG_geode->addDrawable(rectBG);
  36.        
  37.         // set up the texture state.   
  38.     osg::ref_ptr<osg::Texture2D> BG_texture = new osg::Texture2D;
  39.     BG_texture->setDataVariance(osg::Object::DYNAMIC); // protect from being optimized away as static state.
  40.     BG_texture->setImage(osgDB::readImageFile("curVideoFrame.png"));
  41.     osg::StateSet* stateset = rectBG->getOrCreateStateSet();
  42.     stateset->setTextureAttributeAndModes(0,BG_texture,osg::StateAttribute::ON);
  43.        
  44.         // ====================================>>

  45.         // root
  46.         osg::ref_ptr<osg::Group> MARRoot = new osg::Group;
  47.        
  48.         // turn off lighting
  49.     MARRoot->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  50.        
  51.         hudCamera->addChild(BG_geode);
  52.         MARRoot->addChild(hudCamera);
  53.        
  54.         // viewer
  55.         osg::ref_ptr<osgViewer::Viewer> MARViewer = new osgViewer::Viewer();
  56.         MARViewer->setSceneData(MARRoot.get());
  57.         MARViewer->setCameraManipulator(new osgGA::MultiTouchTrackballManipulator);
  58.         MARViewer->realize();
复制代码
很郁闷,这么一写,Viewer里面竟然什么都没有了。
请看看这么做有问题么?材质部分的代码能保证图像填充整个viewer么?

该用户从未签到

发表于 2011-2-28 08:20:46 | 显示全部楼层
  1. (*vertices)[0].set(0.f, 0.f, (float)h);
  2.     (*vertices)[1].set(0.f, 0.f, 0.f);
  3.     (*vertices)[2].set((float)w, 0.f, 0.f);
  4.     (*vertices)[3].set((float)w, 0.f, (float)h);
复制代码
别的地方我没有细看,不过四边形的顶点至少应该在XOY平面内,因为HUD相机使用了单位阵作为观察矩阵,也就是说lookAt位于OpenGL默认的Z-方向
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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