osgSim.HeightAboveTerrain
是OpenSceneGraph的一个模拟节点,用于计算场景中每个处于地面上的物体和地面之间的高度差。它使用了一种简单的算法,即将物体沿着其法线方向向下移动,直到它与地面的交点。然后,它计算物体的高度差并将其储存在一个状态变量中。
创建一个osgSim.HeightAboveTerrain
节点并将其加入场景图中。然后,将需要计算高度差的物体作为HeightAboveTerrain
节点的子节点。在渲染场景时,节点会自动计算每个物体的高度差,并将其存储在一个用户数据中。
// 创建一个HeightAboveTerrain节点
osg::ref_ptr<osgSim::HeightAboveTerrain> hat = new osgSim::HeightAboveTerrain;
// 将需要计算高度差的物体加入节点中
hat->addChild(myNode);
// 渲染场景
viewer.setSceneData(hat.get());
在需要访问高度差数据时,使用getUserData()
方法获得osgSim::HeightAboveTerrain::TerrainData
对象。该对象包含了每个物体的高度差数据,您可以在需要时访问它。
// 获取高度差数据
osgSim::HeightAboveTerrain::TerrainData* data =
hat->getTerrainData().get();
// 访问高度差,此处假设要访问子节点0的高度差
float height = data->getHeightAboveTerrain(0);
osgSim.HeightAboveTerrain
节点有几个属性可供调整。
属性名称 | 默认值 | 描述 |
---|---|---|
FlightEnvelope |
{ 1.0f, 1.0f, FLT_MAX } |
控制物体向下移动的范围。 |
CollisionModel |
osgSim::HeightAboveTerrain::Ray |
用于计算交点的碰撞模型类型。该属性有两个可选值:osgSim::HeightAboveTerrain::Ray 和 osgSim::HeightAboveTerrain::Sphere 。 |
UseVertexNormals |
false |
是否使用顶点法线而非平面法线来计算物体与地面的交点。 |
UseVertexMask |
false |
是否使用顶点数据来遮蔽物体与地面的交点。 |
您可以使用相应的setter方法来设置这些属性。
osgSim.HeightAboveTerrain
节点只能对处于地面上的物体进行高度差计算。如果您需要计算用于飞行模拟等其他用途的高程数据,可使用其他OpenSceneGraph节点,如osgTerrain::HeightField
。