osgSim.ElevationSlice是OpenSceneGraph的一个类,它可以用于将地形切片并将其表示为纹理图像。
class osgSim::ElevationSlice : public osg::Image
继承自osg::Image类。
ElevationSlice(double minX, double minY, double maxX, double maxY, int width, int height, double minZ, double maxZ);
参数:
minX,minY,maxX,maxY
:切片区域边界,单位是经纬度。width,height
:图像的宽度和高度,单位是像素。minZ,maxZ
:切片高度范围。void setMatrix(const osg::Matrix& matrix);
设置用于转换纹理坐标的矩阵。
参数:
matrix
:用于转换纹理坐标的矩阵。void setElevationLayer(osgTerrain::HeightFieldLayer* elevation);
设置用于切片的高度场层。
参数:
elevation
:高度场层。void setVerticalScale(double scale);
设置高度场与切片之间的垂直比例。
参数:
scale
:高度场与切片之间的垂直比例。void setUseMask(bool useMask);
设置是否使用覆盖层遮罩。
参数:
useMask
:是否使用覆盖层遮罩。void setMaskLayer(osgTerrain::AbstractHeightFieldLayer* mask);
设置用于覆盖层遮罩的层。
参数:
mask
:用于覆盖层遮罩的层。void setFillNoDataRegion(bool enable);
设置是否在没有数据的区域填充颜色。
参数:
enable
:是否在没有数据的区域填充颜色。void setNoDataFillColor(const osg::Vec4& color);
设置在没有数据的区域填充的颜色。
参数:
color
:要在没有数据的区域填充的颜色。void setLODScale(float scale);
设置切片的LOD比例。
参数:
scale
:切片的LOD比例。void setLODOffset(float lodOffset);
设置LOD偏移量。
参数:
lodOffset
:LOD偏移量。void setLODResolution(float resolution);
设置LOD分辨率。
参数:
resolution
:LOD分辨率。void setPixelSize(int pixelSize);
设置像素大小。
参数:
pixelSize
:像素大小。void setUseIntensityMode(bool useIntensityMode);
设置是否使用强度模式。
参数:
useIntensityMode
:是否使用强度模式。void setIntensityLayer(osgTerrain::AbstractHeightFieldLayer* intensity);
设置用于强度的层。
参数:
intensity
:用于强度的层。void setIntensityScale(double scale);
设置强度比例。
参数:
scale
:强度比例。void setIntensityPreset(osgEarth::Util::ElevationSlicePreset preset);
设置强度预设。
参数:
preset
:强度预设。void setClamping(bool clamping);
设置是否使用裁剪模式。
参数:
clamping
:是否使用裁剪模式。void setClampingLayer(osgTerrain::AbstractLayer* layer);
设置用于裁剪的层。
参数:
layer
:用于裁剪的层。void setClampingAutoScale(bool clampingAutoScale);
设置是否使用自动缩放。
参数:
clampingAutoScale
:是否使用自动缩放。void setDepthWrite(bool enable);
设置图像的深度写入。
参数:
enable
:图像的深度写入。OpenSceneGraph提供了osgSim::ElevationSlice的源代码,其中有一些额外的注释和更详细的描述。
class ElevationSlice : public Image
{
public:
ElevationSlice(double minX, double minY, double maxX, double maxY, int width, int height, double minZ, double maxZ);
META_Image(osgSim, ElevationSlice);
void setMatrix(const osg::Matrix& matrix) { _matrix = matrix; }
const osg::Matrix& getMatrix() const { return _matrix; }
void setElevationLayer(osgTerrain::HeightFieldLayer* elevation) { _elevation = elevation; }
osgTerrain::HeightFieldLayer* getElevationLayer() const { return _elevation; }
void setVerticalScale(double scale) { _verticalScale = scale; }
double getVerticalScale() const { return _verticalScale; }
void setUseMask(bool useMask) { _useMask = useMask; }
bool getUseMask() const { return _useMask; }
void setMaskLayer(osgTerrain::AbstractHeightFieldLayer* mask) { _mask = mask; }
osgTerrain::AbstractHeightFieldLayer* getMaskLayer() const { return _mask; }
void setFillNoDataRegion(bool enable) { _fillNoDataRegion = enable; }
bool getFillNoDataRegion() const { return _fillNoDataRegion; }
void setNoDataFillColor(const osg::Vec4& color) { _noDataFillColor = color; }
const osg::Vec4& getNoDataFillColor() const { return _noDataFillColor; }
void setLODScale(float scale) { _lodScale = scale; }
float getLODScale() const { return _lodScale; }
void setLODOffset(float lodOffset) { _lodOffset = lodOffset; }
float getLODOffset() const { return _lodOffset; }
void setLODResolution(float resolution) { _lodResolution = resolution; }
float getLODResolution() const { return _lodResolution; }
void setPixelSize(int pixelSize) { _pixelSize = pixelSize; }
int getPixelSize() const { return _pixelSize; }
void setUseIntensityMode(bool useIntensityMode) { _useIntensityMode = useIntensityMode; }
bool getUseIntensityMode() const { return _useIntensityMode; }
void setIntensityLayer(osgTerrain::AbstractHeightFieldLayer* intensity) { _intensity = intensity; }
osgTerrain::AbstractHeightFieldLayer* getIntensityLayer() const { return _intensity; }
void setIntensityScale(double scale) { _intensityScale = scale; }
double getIntensityScale() const { return _intensityScale; }
void setIntensityPreset(osgEarth::Util::ElevationSlicePreset preset) { _intensityPreset = preset; }
osgEarth::Util::ElevationSlicePreset getIntensityPreset() const { return _intensityPreset; }
void setClamping(bool clamping) { _clamping = clamping; }
bool getClamping() const { return _clamping; }
void setClampingLayer(osgTerrain::AbstractLayer* layer) { _clampingLayer = layer; }
osgTerrain::AbstractLayer* getClampingLayer() const { return _clampingLayer; }
void setClampingAutoScale(bool clampingAutoScale) { _clampingAutoScale = clampingAutoScale; }
bool getClampingAutoScale() const { return _clampingAutoScale; }
void setDepthWrite(bool enable) { _depthWrite = enable; }
bool getDepthWrite() const { return _depthWrite; }
protected:
virtual ~ElevationSlice() {}
bool createSurfaceGeometry(const osg::BoundingBox& bbox, const osg::Vec3Array* verts, osg::Image* outImage, osg::Image* outAlphaImage);
osg::Vec4f getPixel(int x, int y) const;
void generateImage(osg::Image* image, int width, int height, const osg::Vec3Array* verts, const osg::Vec4Array* colors, bool* mask);
osgTerrain::HeightFieldLayer* _elevation;
osgTerrain::AbstractHeightFieldLayer* _mask;
osgTerrain::AbstractHeightFieldLayer* _intensity;
osgTerrain::AbstractLayer* _clampingLayer;
osg::Matrix _matrix;
osg::Vec2d _minCoord;
osg::Vec2d _maxCoord;
double _verticalScale;
bool _useMask;
bool _fillNoDataRegion;
bool _useIntensityMode;
bool _clamping;
bool _clampingAutoScale;
bool _depthWrite;
osg::Vec4 _noDataFillColor;
float _lodScale;
float _lodOffset;
float _lodResolution;
int _pixelSize;
double _intensityScale;
osgEarth::Util::ElevationSlicePreset _intensityPreset;
osg::ref_ptr<osg::StateSet> _stateset;
osg::ref_ptr<osg::Geode> _geode;
osg::ref_ptr<osg::Image> _colorImage;
};
一个简单的osgSim.ElevationSlice示例,它将地形切片并将其渲染为纹理,将地形网格上色并使用遮罩图像来裁剪细节:
osg::ref_ptr<osgSim::ElevationSlice> slice = new osgSim::ElevationSlice(10.0, 20.0, 50.0, 60.0, 512, 512, 0.0, 400.0);
// 设置高度和遮罩层
osg::ref_ptr<osgTerrain::HeightFieldLayer> heightFieldLayer = new osgTerrain::HeightFieldLayer();
heightFieldLayer->setHeightField(heightField);
osg::ref_ptr<osgTerrain::ImageLayer> imageLayer = new osgTerrain::ImageLayer();
imageLayer->setImage(image);
slice->setElevationLayer(heightFieldLayer);
slice->setUseMask(true);
slice->setMaskLayer(imageLayer);
// 将高度网格与地形颜色一起存储
osg::ref_ptr<osg::Group> terrainGroup = new osg::Group();
terrainGroup->addChild(heightFieldDrawable);
terrainGroup->addChild(colorDrawable);
slice->setClampingLayer(terrainGroup);
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
geode->addDrawable(slice);
// 在场景图中添加视图器
viewer.setSceneData(geode);