|
本帖最后由 CWorld 于 2011-5-17 12:02 编辑
问题描述: 我的地形很小,不想用vpb生成lod的地形,于是我使用直接读取高度图的方法。但是想像Global_mapper那样根据海拔产生颜色,用Geometry时,不知道为什么地形发生了形变。
希望达到的效果,类似于我们使用Global_mapper查看的影子。
但是在OSG里,如果直接读取高度图,即
osgDB::Registry::instance()->getReaderWriterForExtension("gdal");
osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile("topo.asc");
则渲染的地形没有颜色,具体见附件二。
应对方法,我参考osgTerrain的Example, 像转换为Geometry,然后根据每个点的高度来设置颜色,但是地形的形状就发生了变化,具体见附件三。
这次有图也有代码实现,请大家帮我分析分析,这是什么原因?
code:
osgDB::Registry::instance()->getReaderWriterForExtension("gdal");
osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile("topo.asc");
unsigned int numColumns ;
unsigned int numRows ;
osg::Geometry* geometry = new osg::Geometry;
numColumns=hf->getNumColumns();
numRows=hf->getNumRows();
osg::Vec3Array& v = *(new osg::Vec3Array(numColumns*numRows));
osg::Vec4ubArray& color = *(new osg::Vec4ubArray(1));
unsigned int r;
unsigned int c;
//设置颜色与高度的关系
color[0].set(255,255,255,255);
osg::Vec3 pos = origin2;
int vi=0;
for(r=0;r<numRows;++r)
{
for(c=0;c<numColumns;++c)
{
v[vi]=hf->getVertex(c,r);
++vi;
}
}
geometry->setVertexArray(&v);
geometry->setColorArray(&color);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
for(r=0;r<numRows-1;++r)
{
osg:rawElementsUShort& drawElements = *(new osg::DrawElementsUShort(GL_QUAD_STRIP,2*numColumns));
geometry->addPrimitiveSet(&drawElements);
int ei=0;
for(c=0;c<numColumns;++c)
{
drawElements[ei++] = (r+1)*numColumns+c;
drawElements[ei++] = (r)*numColumns+c;
}
}
geode->addDrawable(geometry);
osgUtil::SmoothingVisitor sv;
sv.smooth(*geometry); |
|