查看: 2596|回复: 8

用ImageSequence实现管道流动效果

[复制链接]

该用户从未签到

发表于 2013-5-18 10:19:35 | 显示全部楼层 |阅读模式
大家可能都看到过led灯效,
应该是几张图片切换,看到箭头一直向前跑的样子。
我现在要实现个管道流动的效果,就想到用这种方法实现。
然后就用到ImageSequence给管道贴图,然后play();
确实能够实现流动的效果,但是不知道有没有更新的方法,
请教一下各位朋友。

该用户从未签到

发表于 2013-5-20 23:48:48 | 显示全部楼层
用什么imagesquence,直接写个回调改纹理坐标不得了,纹理属性设成repeat。

该用户从未签到

 楼主| 发表于 2013-5-18 10:20:02 | 显示全部楼层
有没有更好的方法。

该用户从未签到

 楼主| 发表于 2013-5-18 10:21:28 | 显示全部楼层
  1. #include <osg/ImageSequence>
  2. #include <osg/Texture2D>
  3. #include <osg/Geometry>
  4. #include <osg/Geode>
  5. #include <osgDB/ReadFile>
  6. #include <osgViewer/Viewer>

  7. void createTexture2D(osg::StateSet& ss,osg::Image* image)
  8. {
  9.     osg::ref_ptr<osg::Texture2D> texture=new osg::Texture2D;
  10.     texture->setImage(image);
  11.     texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
  12.     texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
  13.     texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_BORDER);
  14.     texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_BORDER);

  15.     ss.setTextureAttributeAndModes(0,texture.get());

  16. }
  17. int main()
  18. {
  19.     osg::ref_ptr<osg::ImageSequence> imageSquence=new osg::ImageSequence;
  20.     char buffer[2]="";
  21.     for (int i=0;i<10;i++)
  22.     {
  23.         _itoa_s(i,buffer,2,10);
  24.         std::string file=buffer;
  25.         imageSquence->addImage(osgDB::readImageFile("D:\\Projects\\OSG\\imagesquence\\Debug\"+file+".jpg"));
  26.     }
  27.     osg::ref_ptr<osg::Geode> geode=new osg::Geode;
  28.     geode->addDrawable(osg::createTexturedQuadGeometry(osg::Vec3(0.0,0.0,0.0),osg::Vec3(1.0,0.0,0.0),osg::Vec3(0.0,0.0,1.0),1.0,1.0));
  29.     createTexture2D(*(geode->getOrCreateStateSet()),imageSquence.get());

  30.     imageSquence->setLength(10.0);
  31.     imageSquence->setTimeMultiplier(2);
  32.     imageSquence->play();

  33.     osgViewer::Viewer viewer;
  34.     viewer.setSceneData(geode.get());
  35.     return viewer.run();
  36. }
复制代码
大家可以参考这个。

该用户从未签到

发表于 2013-5-18 13:16:47 | 显示全部楼层
更新什么?为什么要更新?
是图片,还是模型
是控制播放还是换图片,还是换管道,还是管道变形?
其实他跟其他2D贴图模型一样,只是加载的图片原来是静态的地址,现在被一个动态指针替换了而已(我的理解)!

如果更新,就只是考虑模型而已,把它当静态贴图作用考虑
模型顶点更新,只要顶点贴图坐标正确(注意绑定贴图坐标设置于模型贴图顶点的对应),不会有什么问题吧!

该用户从未签到

发表于 2013-5-18 13:28:16 | 显示全部楼层
1.
如果是直线型的,还可通过另外加载模型的定向比例放大实现,管道流动!(要有模型更新)
2.
或者重建同轨迹的内接平行管道(每次建立模型的顶点数量是逐渐增加)!(要有模型更新)

该用户从未签到

 楼主| 发表于 2013-5-18 22:37:43 | 显示全部楼层
VR_user_happy 发表于 2013-5-18 13:28
1.
如果是直线型的,还可通过另外加载模型的定向比例放大实现,管道流动!(要有模型更新)
2.

太专业,呵呵,等水平到了好好想想你说的。

该用户从未签到

发表于 2013-5-18 23:15:53 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-5-18 23:27 编辑

说白一点:
   就是新建一个内接的拉伸模型(拉伸橡皮筋一样,模拟管道内的流动),头部还可加一个修饰性的跟随移动的模型(如同子弹头),模型可以是半透明的材质,或是贴图都可以的!
    ( 要有更新回调)

该用户从未签到

 楼主| 发表于 2013-5-21 20:04:17 | 显示全部楼层
素商 发表于 2013-5-20 23:48
用什么imagesquence,直接写个回调改纹理坐标不得了,纹理属性设成repeat。

对头。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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