查看: 1351|回复: 6

DEM 匹配纹理(遥感影像),怎样计算纹理坐标?

[复制链接]

该用户从未签到

发表于 2014-7-15 17:37:29 | 显示全部楼层 |阅读模式
本帖最后由 jihuitian11 于 2014-7-15 17:38 编辑

我想用一块dem数据,读取高程数据之后,在匹配上纹理,这里主要指遥感影像,请问纹理,坐标如何计算和匹配,我自己做的显示不出来啊?!
废话不多,给出我的程序,求论坛的大神,王锐,freesouth等人指导:
   
  1.   #pragma region       

  2.                    osg::ref_ptr<osg::Vec3Array> vc = new osg::Vec3Array();  
  3.                         osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();
  4.                                  short int*z_value=(short int*)ZValue;
  5.                                  //i,行,j列
  6.                                  for (int i=0;i<width-1;i++)
  7.                                  {  
  8.                                          for (int j=0;j<heigth-1;j++)
  9.                                          {
  10.                                                
  11.                                                  float x0=rasterio->adfGeoTransform[0] + i* rasterio->adfGeoTransform[1] + j* rasterio->adfGeoTransform[2];
  12.                                                  float y0=rasterio->adfGeoTransform[3] + i* rasterio->adfGeoTransform[4] + j* rasterio->adfGeoTransform[5];
  13.                                                  float z0=(float)z_value[i*width+j];

  14.                                                  if (z0<=NoDataValue)
  15.                                                  {
  16.                                                          z0=0;
  17.                                                  }

  18.                                                 float x1=rasterio->adfGeoTransform[0] + i* rasterio->adfGeoTransform[1] + (j+1)* rasterio->adfGeoTransform[2];
  19.                                                  float y1=rasterio->adfGeoTransform[3] + i* rasterio->adfGeoTransform[4] + (j+1)* rasterio->adfGeoTransform[5]
  20.                                                  float z1=(float)z_value[i*width+j+1];

  21.                                                  if (z1<=NoDataValue)
  22.                                                  {
  23.                                                          z1=0;
  24.                                                  }

  25.                                          float x2=rasterio->adfGeoTransform[0] + (i+1)* rasterio->adfGeoTransform[1] + (j+1)* rasterio->adfGeoTransform[2];
  26.                                          float y2=rasterio->adfGeoTransform[3] + (i+1)* rasterio->adfGeoTransform[4] + (j+1)* rasterio->adfGeoTransform[5];
  27.                                          float z2=(float)z_value[(i+1)*width+j+1];

  28.                                                  if (z2<=NoDataValue)
  29.                                                  {
  30.                                                          z2=0;
  31.                                                  }

  32.                                                  float x3=rasterio->adfGeoTransform[0] + (i+1)* rasterio->adfGeoTransform[1]+j*rasterio->adfGeoTransform[2];
  33.                                                  float y3=rasterio->adfGeoTransform[3] + (i+1)* rasterio->adfGeoTransform[4]+j*rasterio->adfGeoTransform[5];
  34.                                                  float z3=(float)z_value[(i+1)*width+j];

  35.                                                  if (z3<=NoDataValue)
  36.                                                  {
  37.                                                          z3=0;
  38.                                                  }

  39.                                                  osg::Vec3 vec0(x0,y0,z0);
  40.                                                  osg::Vec3 vec1(x1,y1,z1);
  41.                                                  osg::Vec3 vec2(x2,y2,z2);
  42.                                                  osg::Vec3 vec3(x3,y3,z3);

  43.                                                  vc->push_back(vec0);
  44.                                                  vc->push_back(vec1);
  45.                                                  vc->push_back(vec2);
  46.                                                  vc->push_back(vec3);


  47.                                                  float tx0=(float)((vec0.y()-uly)/heigth);
  48.                                                  float ty0=(float)((vec0.x()-ulx)/width);


  49.                                                  float tx1=(float)((vec1.y()-uly)/heigth);
  50.                                                  float ty1=(float)((vec1.x()-ulx)/width);


  51.                                                  float tx2=(float)((vec2.y()-uly)/heigth);
  52.                                                  float ty2=(float)((vec2.x()-ulx)/width);

  53.                                                  float tx3=(float)((vec3.y()-uly)/heigth);
  54.                                                  float ty3=(float)((vec3.x()-ulx)/width);


  55.                                                 float tx1=(float)((vec1.x()-ulx)/width);
  56.                                                  float ty1=(float)((vec1.y()-uly)/heigth);

  57.                                                  float tx2=(float)((vec2.x()-ulx)/width);
  58.                                                  float ty2=(float)((vec2.y()-uly)/heigth);

  59.                                                  float tx3=(float)((vec3.x()-ulx)/width);
  60.                                                  float ty3=(float)((vec3.y()-uly)/heigth);

  61.                                                  vt->push_back(osg::Vec2(tx0,ty0));
  62.                                                  vt->push_back(osg::Vec2(tx1,ty1));
  63.                                                  vt->push_back(osg::Vec2(tx2,ty2));
  64.                                                  vt->push_back(osg::Vec2(tx3,ty3));

  65.                                          }
  66.                                  }
复制代码

1、这一步是读取dem数据,并计算气纹理坐标,由于我用的是new osg:rawArrays(osg:rimitiveSet:UADS,0,4),所以,vc 里面,我按照逆时针存了一个正方形  ,同样纹理的坐标我也相应的存了4个点的坐标,我知道这样做浪费内存,以后在优化吧,现在主要为了能显示;
2、

  1.    osg::ref_ptr<osg::Image>image=osgDB::readImageFile("D:\\osgproject\\data\\ps_texture_1k.png");
  2.    
复制代码

读遥感影像,
  1.          
  2.             geometry->setVertexArray(vc.get());//设置顶点数组
  3.             geometry->setTexCoordArray(0,vt.get());//设置纹理坐标
  4.             osg::ref_ptr<osg::StateSet>stateset=new osg::StateSet();//创建状态集
  5.                        
  6.                          if(image.get())
  7.                          {
  8.                                   osg::ref_ptr<osg::Texture2D>texture=new osg::Texture2D;//创建二维纹理对象
  9.                                   texture->setDataVariance(osg::Object::DYNAMIC);
  10.                                  texture->setImage(image.get());//设置贴图
  11.                                  stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON);
  12.                          }

  13.                          geometry->setTexCoordArray(0,vt.get());//设置纹理坐标

  14.                          //geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);//设置纹理坐标的绑定方式是单个顶点
  15.                        
  16.                          geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
  17.                        
  18.                          geode->setStateSet(stateset.get());

  19.                          geode->addDrawable(geometry);
复制代码

匹配遥感影像作为纹理,结果显示的很奇葩,不在给图片了;
请论坛里的大神们指教!!收费可以私聊。

该用户从未签到

 楼主| 发表于 2014-7-16 12:42:47 | 显示全部楼层
   来个大神,求帮忙,卡了好几天了

该用户从未签到

发表于 2014-9-10 17:28:30 | 显示全部楼层
你是要这种样子吗?黄色的那个
QQ图片20140910172945.jpg

该用户从未签到

发表于 2015-6-5 16:08:37 | 显示全部楼层
你好,问题解决了吗,能不能留个联系方式,请教下你这方面的问题,我的qq357853147

该用户从未签到

发表于 2015-6-7 15:39:37 | 显示全部楼层
大神无条件帮忙的时代已经过去了。

该用户从未签到

发表于 2015-9-2 10:15:25 | 显示全部楼层
我也遇到类似的问题。即不规则物体 如何计算纹理坐标。
貌似opengl有自动计算纹理坐标的方式,不知这个是否有用。
还在思考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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