查看: 1144|回复: 4

需要给一个弧面实时贴图 如何实现?

[复制链接]

该用户从未签到

发表于 2013-11-8 17:09:41 | 显示全部楼层 |阅读模式

原ive自带图
贴图(原).jpg
贴图后的效果
贴图.jpg

如何改 才能让图片正常拉伸贴满整个弧面呢?

代码如下

  1.               osg::ref_ptr<osg::Image> image = osgDB::readImageFile(EncodeToUTF8(gif_filepath.c_str()));
  2.         osg::ref_ptr<osg::ImageStream> gif_stream = dynamic_cast<osg::ImageStream *>(image.get());
  3.         osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;

  4.         gif_stream->play();

  5.         texture->setImage( gif_stream.get() );
  6.         texture->setResizeNonPowerOfTwoHint( false );       

  7.         osg::ref_ptr<osg::Drawable> quad = osg::createTexturedQuadGeometry(
  8.                 osg::Vec3(), osg::Vec3f(280.0f, 0.0f, 0.0f), osg::Vec3f(0.0f, 217.0f, 0.0f), 0.0f, 1.0f, 1.0f, 0.0f );
  9.         quad->getOrCreateStateSet()->setTextureAttributeAndModes( 0, texture.get() );

  10.         //设置自动生成坐标
  11.         osg::ref_ptr<osg::TexGen> texgen=new osg::TexGen;
  12.         texgen->setMode(osg::TexGen::SPHERE_MAP);       

  13.         //设置纹理环境
  14.         osg::ref_ptr<osg::TexEnv> texenv=new osg::TexEnv;
  15.         texenv->setMode(osg::TexEnv::REPLACE);//替换物体贴图

  16.         //设置blend操作颜色
  17.         texenv->setColor(osg::Vec4(0.6,0.6,0.6,0.0));

  18.         //启用单元一自动生成纹理坐标,并使用纹理
  19.         osg::ref_ptr<osg::StateSet> stateset=new osg::StateSet;
  20.         stateset->setTextureAttributeAndModes(1,texture.get(),osg::StateAttribute::ON);
  21.         stateset->setTextureAttributeAndModes(1,texgen.get(),osg::StateAttribute::ON);

  22.         //设置纹理环境
  23.         stateset->setTextureAttribute(1,texenv.get());

  24.         //设置物体状态
  25.         Camberbedsurfacenode->setStateSet(stateset.get());
复制代码

该用户从未签到

发表于 2013-11-18 11:24:33 | 显示全部楼层
您为什么不直接设置纹理坐标来贴图呢

该用户从未签到

 楼主| 发表于 2013-11-19 09:55:21 | 显示全部楼层
哦,怎么个设置法?

该用户从未签到

发表于 2013-11-30 22:33:50 | 显示全部楼层
xhm2010 发表于 2013-11-19 09:55
哦,怎么个设置法?

曲面是你自己画的吧,那里面有个
//设置纹理坐标
        osg::ref_ptr<osg::Vec2Array>texCoorArr=new osg::Vec2Array;
        texCoorArr->push_back(osg::Vec2(0,0));
        texCoorArr->push_back(osg::Vec2(1,0));
        texCoorArr->push_back(osg::Vec2(1,1));
        texCoorArr->push_back(osg::Vec2(0,1));
        texCoorArr->setBinding(osg::Array::BIND_PER_VERTEX);
        geometry->setTexCoordArray(0,texCoorArr.get());
我的是OSG3.2的,之前的版本方法稍微有些不同,因为之前的版本的有些方法函数在3.2中被废弃了。

该用户从未签到

 楼主| 发表于 2013-12-4 10:08:48 | 显示全部楼层
JacaYang 发表于 2013-11-30 22:33
曲面是你自己画的吧,那里面有个
//设置纹理坐标
        osg::ref_ptrtexCoorArr=new osg::Vec2Array;

曲面不是画的,是一个ive模型
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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