osg::HeightField
类表示一个高度场,它由一个二维网格和与之关联的高度信息组成。其实现基于OpenSceneGraph的场景图所提供的OpenGL接口,可以被用来实现地形渲染、水面模拟等许多场景。
osg::HeightField
可以通过以下方式进行创建:
osg::ref_ptr<osg::HeightField> heightField = new osg::HeightField;
如果希望对高度场进行更多的属性设置,需要根据需求进行参数配置:
int numCols = 100;
int numRows = 100;
float xInterval = 1.0f;
float yInterval = 1.0f;
float minHeight = 0.0f;
float maxHeight = 10.0f;
osg::Vec3 center = osg::Vec3(0.0f, 0.0f, 0.0f);
osg::ref_ptr<osg::HeightField> heightField = new osg::HeightField;
具体来说,numCols
和 numRows
设定了网格的大小;xInterval
和 yInterval
是用来控制网格间间隔的参数;minHeight
和 maxHeight
分别代表高度字段的最小值和最大值;center
是一个三维向量,用来设定高度场的中心点。
创建好高度场对象之后,我们就可以通过操作其成员变量来获取或者修改其属性,例如:
// 获取高度场所有的高度值
osg::FloatArray* heightValues = heightField->getHeightList();
// 获取某个点的高度值
float height = heightField->getHeight(2, 3);
另外,高度场还可以根据不同的需求进行平滑、粗糙、陡峭等等形态的修改:
// 平滑操作
osgUtil::SmoothingVisitor sv;
heightField->accept(sv);
// 处理边缘
heightField->setSkirtHeight(2.0f);
// 感觉顶多是个延伸到山脚下的平场
osg::HeightField* flatTerrainedHF = dynamic_cast<osg::HeightField*>(heightField->clone(osg::CopyOp::DEEP_COPY_ALL));
flatTerrainedHF->flattenTop(0.1f);
osg::HeightField
类是OpenSceneGraph中一个强大而实用的类,他可以用来表示地形场景,水面模拟等很多场景,在实际应用中功不可没。在开发过程中,我们应当熟练掌握其 API 的使用和属性配置,方能更加高效地实现手中的项目。