ValidRange
类用于指定地形数据有效范围,通常用于剪裁和调整地形片块的大小。 ValidRange
包含四个浮点数值,表示范围的最小和最大经度、最小和最大纬度。
class ValidRange : public CompoundLayer
{
public:
typedef CompoundLayer inherited;
ValidRange();
ValidRange(const ValidRange& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
META_Node(osgTerrain, ValidRange);
virtual void populateTextureCoordinates(osg::Vec2Array* texcoords) const;
virtual osg::BoundingBox computeBound() const;
virtual osg::Object* cloneType() const { return new ValidRange(); }
virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new ValidRange(*this,copyop); }
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const ValidRange*>(obj)!=NULL; }
virtual const char* libraryName() const { return "osgTerrain"; }
virtual const char* className() const { return "ValidRange"; }
virtual bool addChild(osg::Node *child);
virtual bool addChild(osg::Node *child, const osg::Vec3& offset);
osgTerrain::Locator* getLocator() { return _locator.get(); }
const osgTerrain::Locator* getLocator() const { return _locator.get(); }
protected:
virtual ~ValidRange();
osg::ref_ptr<osgTerrain::Locator> _locator;
osgTerrain::FloatArray* _validData;
};
构造函数 | 描述 |
---|---|
ValidRange() |
默认构造函数,创建一个 ValidRange 对象。 |
ValidRange(const ValidRange& copy, const osg::CopyOp& copyop) |
复制构造函数,创建一个 copy 对象的副本,并按照 copyop 操作进行深拷贝或浅拷贝。 |
方法 | 描述 |
---|---|
void populateTextureCoordinates(osg::Vec2Array* texcoords) const |
填充顶点数组 texcoords ,指定 ValidRange 的地形贴图纹理坐标。 |
osg::BoundingBox computeBound() const |
计算 ValidRange 的包围盒并返回。 |
virtual osg::Object* cloneType() const |
返回 ValidRange 的克隆类型。 |
virtual osg::Object* clone(const osg::CopyOp& copyop) const |
按照 copyop 操作返回当前 ValidRange 对象的克隆副本。 |
virtual bool isSameKindAs(const osg::Object* obj) const |
判断 obj 是否是 ValidRange 的同种类型。 |
virtual const char* libraryName() const |
返回当前 ValidRange 的库名称。 |
virtual const char* className() const |
返回当前 ValidRange 的类名称。 |
virtual bool addChild(osg::Node *child) |
向当前 ValidRange 添加子节点 child ,返回成功或失败。 |
virtual bool addChild(osg::Node *child, const osg::Vec3& offset) |
向当前 ValidRange 添加位于偏移 offset 的子节点 child ,返回成功或失败。 |
osgTerrain::Locator* getLocator() |
返回当前 ValidRange 的定位器 Locator 对象。 |
const osgTerrain::Locator* getLocator() const |
返回当前 ValidRange 的定位器 Locator 对象的常量引用。 |
成员变量 | 描述 |
---|---|
osg::ref_ptr<osgTerrain::Locator> |
定位器指针,指向 ValidRange 对应的位置定位器。 |
osgTerrain::FloatArray* _validData; |
存储地形数据的浮点型数组。 |
使用 ValidRange
对象创建一个名为 terrain
的地形片块:
osg::ref_ptr<osgTerrain::TerrainTile> terrain = new osgTerrain::TerrainTile;
double lat_min = 30.0, lat_max = 40.0, lon_min = 100.0, lon_max = 110.0;
terrain->setValidData(new osgTerrain::FloatArray(4));
terrain->getValidData()->at(0) = lon_min;
terrain->getValidData()->at(1) = lat_min;
terrain->getValidData()->at(2) = lon_max;
terrain->getValidData()->at(3) = lat_max;
在 terrain
上添加地形数据,并使用 ValidRange
对象进行剪裁操作:
osg::ref_ptr<osgTerrain::HeightFieldLayer> layer = new osgTerrain::HeightFieldLayer;
layer->setLocator(new osgTerrain::Locator);
layer->getLocator()->setCoordinateSystemType(osgTerrain::Locator::GEOCENTRIC);
layer->getLocator()->setTransformAsExtents(osg::Vec3d(terrain->getBound().xMin(), terrain->getBound().yMin(), minZ), osg::Vec3d(terrain->getBound().xMax(), terrain->getBound().yMax(), maxZ));
terrain->addChild(layer);
terrain->setLayerUpdateCallback(new osgTerrain::ValidDataMinMaxHeight(terrain->getBound().xMin(), terrain->getBound().yMin(), terrain->getBound().xMax(), terrain->getBound().yMax(), -1.0f, 1.0f));
terrain->setValidData(new osgTerrain::FloatArray(4));
terrain->getValidData()->at(0) = lon_min;
terrain->getValidData()->at(1) = lat_min;
terrain->getValidData()->at(2) = lon_max;
terrain->getValidData()->at(3) = lat_max;