osgTerrain.ValidDataOperator是OpenSceneGraph的一种操作器,用于将地形数据限制在合法范围内。
osgTerrain.ValidDataOperator是osgTerrain.TerrainOperator的派生类,用于操作osgTerrain.TerrainTile的数据。它的作用是将地形数据限制在合法范围内,去除不合法的数据。
osgTerrain.ValidDataOperator的使用非常简单,只需要创建一个对象并添加到osgTerrain.TerrainTile中即可。
#include <osgTerrain/ValidDataOperator>
osg::ref_ptr<osgTerrain::TerrainTile> terrainTile = new osgTerrain::TerrainTile();
osg::ref_ptr<osgTerrain::ValidDataOperator> validData = new osgTerrain::ValidDataOperator();
terrainTile->setTerrainOperator(validData);
上述代码创建了一个osgTerrain.TerrainTile对象和一个osgTerrain.ValidDataOperator对象,并将后者添加到前者中。这样,在地形数据被加载后,ValidDataOperator会自动将不合法的数据去除。
osgTerrain.ValidDataOperator可以通过一些参数来控制它的操作行为。以下是它的几个重要参数:
参数 | 描述 |
---|---|
float _minValidHeight |
最小合法高度 |
float _maxValidHeight |
最大合法高度 |
float _noDataValue |
无数据值,如果地形数据中出现这个值,会被认为是无效的 |
下面是一个使用osgTerrain.ValidDataOperator的示例程序:
#include <osgViewer/Viewer>
#include <osgTerrain/Terrain>
#include <osgTerrain/ValidDataOperator>
osg::ref_ptr<osgTerrain::TerrainTile> createTerrainTile()
{
osg::ref_ptr<osgTerrain::TerrainTile> terrainTile = new osgTerrain::TerrainTile();
osg::ref_ptr<osgTerrain::HeightField> heightField = new osgTerrain::HeightField();
heightField->allocate(32, 32);
heightField->setOrigin(osg::Vec3(0.0f, 0.0f, 0.0f));
heightField->setXInterval(4.0f);
heightField->setYInterval(4.0f);
heightField->setSkirtHeight(1.0f);
for (int r = 0; r < heightField->getNumRows(); ++r)
{
for (int c = 0; c < heightField->getNumColumns(); ++c)
{
float x = (float)c * 0.2f;
float y = (float)r * 0.2f;
float z = 10.0f * std::sin(c * 0.1f) * std::cos(r * 0.1f) + 20.0f;
heightField->setHeight(c, r, z);
}
}
terrainTile->setHeightField(heightField);
osg::ref_ptr<osgTerrain::ValidDataOperator> validData = new osgTerrain::ValidDataOperator();
validData->setMinValidHeight(0.0f);
validData->setMaxValidHeight(100.0f);
terrainTile->setTerrainOperator(validData);
return terrainTile;
}
int main(int argc, char** argv)
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osgTerrain::Terrain> terrain = new osgTerrain::Terrain();
terrain->addChild(createTerrainTile());
viewer->setSceneData(terrain);
return viewer->run();
}
这个程序创建了一个大小为32x32的高度场,将每个顶点随机分布在一个平面上,并根据一个简单的函数计算出高度值。然后,它创建了一个osgTerrain.ValidDataOperator对象,将最小合法高度设为0.0,最大合法高度设为100.0,使得高度超过这个范围的顶点被去除。最后它将高度场添加到osgTerrain.Terrain中进行显示。