查看: 2949|回复: 16

shape 文件着色问题

[复制链接]

该用户从未签到

发表于 2008-9-23 21:55:14 | 显示全部楼层 |阅读模式
我有一个 北京shape 地图矢量数据,我怎么把数据中各个区县(15个)按照不同颜色 渲染上,我怎么 谁能给点代码 这里谢谢了

该用户从未签到

发表于 2008-9-23 22:10:07 | 显示全部楼层
有点抽象啊,不太清楚您这个矢量数据的数据格式。

比如您的数据文件中,每个区县都各自用一个Geometry对象(或者一个Primitive对象)来处理的话,那么很简单地设置一个setColorArray就可以了,注意绑定方式BIND_ALL(或者BIND_PER_PRIMITIVE)

该用户从未签到

 楼主| 发表于 2008-9-23 22:20:31 | 显示全部楼层
是啊 我是把 没个区县看做是 一个geometry 对象 但 我渲染 怎么就一个颜色啊
  pyGeometry->setColorArray(colors);
   pGeometry->setColorIndices(colorIndexArray);
   pGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

  是 这样吗

该用户从未签到

发表于 2008-9-23 22:45:03 | 显示全部楼层
假设第n个区县是pGeometry_n的话,那么它的颜色数组只有一个元素就可以了,这样整个几何体都会被绘制成同一个颜色

colorArray->push_back( osg::Vec4(xn,yn,zn,1.) );
pGeometry_n->setColorArray( colorArray );
pGeometry_n->setColorBinding( osg::Geometry::BIND_OVERALL );

每个区县都要做一次这样的设置,而且颜色都不同

该用户从未签到

发表于 2008-9-24 08:56:38 | 显示全部楼层
建议采用多重纹理混合 将遥感影像和行政地理边界Alpha混合效果可能好些

该用户从未签到

发表于 2008-9-24 15:53:36 | 显示全部楼层
原帖由 klch0623 于 2008-9-24 15:00 发表
楼上是指利用AlphaFunc来解决吗?能具体说说吗?谢谢!


我想这里用osgFX::MultiTextureControl就可以了

该用户从未签到

 楼主| 发表于 2008-9-25 22:19:20 | 显示全部楼层
array  能说的具体点吗 用 osgFX::MultiTextureControl  怎么实现的 在给点代码好吗

该用户从未签到

发表于 2008-9-25 22:26:20 | 显示全部楼层
您要实现纹理混合吗?可以直接设置各个纹理单元使用不同的纹理图片,这时候各个纹理单元的权重是相同的。
用MultiTextureControl的话,需要把您想要实现多重纹理混合的节点设置为它的子节点,并使用setTextureWeight设置各个纹理单元的权重。这些设置会影响所有子节点的所有纹理设置

该用户从未签到

 楼主| 发表于 2008-9-26 19:17:12 | 显示全部楼层
我现在要把一个区县也就一个geometry 渲染一个颜色其他区县不渲染,但我现在一渲染 就把其他几个区县也都渲染成一起了(所有北京都渲染成一个颜色) 请问版主这是怎么回事 能给点代码 最好了 谢谢了

该用户从未签到

发表于 2008-9-26 20:01:30 | 显示全部楼层
应该不会有这种情况,不知道是不是您的程序有逻辑问题。这时候还是您提供些代码更合适些,呵呵

该用户从未签到

 楼主| 发表于 2008-9-26 20:35:21 | 显示全部楼层
Geometry *geometry   =   geode->getdrawable(0);//要渲染的区县
  osg::Vec4Array* colors = new osg::Vec4Array;
   colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) );
  geometry   ->setColorArray(colors);
   geometry   ->setColorBinding(osg::Geometry::BIND_OVERALL);
  
  对吗 版主

该用户从未签到

发表于 2008-9-26 21:28:52 | 显示全部楼层
对于单个的几何体,我想是可以的。

该用户从未签到

 楼主| 发表于 2008-9-26 21:34:27 | 显示全部楼层
我上边的代码逻辑对吗 版主

该用户从未签到

发表于 2008-9-26 21:52:19 | 显示全部楼层
原帖由 hljzh 于 2008-9-26 21:34 发表
我上边的代码逻辑对吗 版主


没什么问题,我想这样就可以:
for ( int i=0; i<maxSize; ++i )
{
   osg::Vec4Array* colors = new osg::Vec4Array;
   Geometry *geometry = geode->getDrawable(i);
   colors->push_back(osg::Vec4(xxx, xxx, xxx, 1.0f) );

   geometry->setColorArray(colors);
   geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
}
注意每次都要定义新的colors数组才行,绝不能用同一个的!

[ 本帖最后由 array 于 2008-9-26 21:54 编辑 ]

该用户从未签到

 楼主| 发表于 2008-9-26 22:24:08 | 显示全部楼层
这是对所有区县渲染着色啊 这个我知道 没问题 但是我 对但个一个区县geometry 渲染颜色 就不行了 就把其它区县也渲染成一样的颜色了 着急啊 :'( :'( :'( :'( :'(

该用户从未签到

发表于 2008-9-26 22:47:50 | 显示全部楼层
原帖由 hljzh 于 2008-9-26 22:24 发表
这是对所有区县渲染着色啊 这个我知道 没问题 但是我 对但个一个区县geometry 渲染颜色 就不行了 就把其它区县也渲染成一样的颜色了 着急啊 :'( :'( :'( :'( :'(


我的代码是对每个区域分别着色,把那个push_back(osg::Vec4(xxx, xxx, xxx, 1.0f) )改成不同的就可以了。

您的代码中肯定有逻辑问题,而且这个问题估计比较简单。我猜想是Vec4Array* colors使用不当(例如所有的几何体都用了一个colors数组,这样就会产生您说的结果)。但是从您提供给我的信息中我看不出来。

[ 本帖最后由 array 于 2008-9-26 22:48 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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