地形(Terrain)
高度图从本质而言,也是一张图片,但是图中的每一个像素的颜色值并不被当做颜色,而是被视为一个高度值。Terrain
对象通过高度图所给的高度信息,加以适当的缩放,构建出整个地形的网格结构。
如果说高度图确定了整个地形的几何形状,那么细节图则确定了地形的外观。通过将细节图贴在地形上,可以制造非常好的表现效果。最多可以使用四个纹理作为细节图。
Terrain
使用细节级别(Level Of Detail)策略,它根据摄像机离对象的远近,切换不同细节级别,达到一种近处的对象细节丰富,远处的对象细节简单,这样减少了整体需要渲染的三角形数量,提高了性能。
可以使用 Terrain::setLODDistance(float lod1, float lod2, float lod3
方法设置摄像机的距离。 具有不同细节级别的地形相邻块可能存在裂缝, 提供了两种方式(裙边法,补边法)避免这种情况的出现:
Terrain::CrackFixedType::INCREASE_LOWER 补边法:动态调整每个快的索引,使其无缝连接
下面代码演示了如何创建一个地形,并在上面放一个精灵
- 通过
Terrain::DetailMap
对象创建细节图:
- 构造
Terrain::TerrainData
对象,构造函数的第一个参数为高度图的路径,第二个参数为 Alpha 贴图的路径,接下来的四个参数为之前所构造的四个 DetailMap 结构体。
- 请注意,在地形对象被添加到节点或场景中(进行了
addChild()
操作)后,就不能再对地形对象使用转换,比如缩放大小。 否则,Terrain
的方法可能会造成难以预料的结果。
使用方法 Terrain::getHeight(float x, float z, Vec3 * normal= nullptr)
可以获取到地形的高度,当你想把一个节点对象放到地形表面的时候,这个方法会非常有用。