4-5 噪声采样缩放

  在上一章中,我们增强了扰动强度,使每个顶点的位移更大,最终地图整体的变化效果就更加明显了。但是当我们改变一个地图单元高度的时候,我们发现矩形阶梯连接区域的视觉效果变得非常奇怪。阶梯中的各个顶点向不懂的方向偏移,造成了三角面片的扭曲,视觉效果看起来很混乱。但是使用柏林噪声不应该会发生这种情况。
  造成这个现象的原因是因为我们直接用世界坐标进行噪声采样,使得彩色噪点图平铺在每个地图单元上,但是每个地图单元的尺寸比彩色噪点图本身要大得多,实际上彩色噪点图是在任意位置被采样,这破坏了其连贯性。如下图所示,其中每个蓝色的方块表示一张彩色噪点图。

  为了解决这个问题,我们要对噪声采样进行缩放,这样彩色噪点图就能覆盖更大的区域。我们在HexMetrics.cs中添加这个缩放并设置其为0.003,然后把采样坐标与这个数值相乘。代码如下:

HexMetrics.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class HexMetrics
{


//采样缩放
//这个参数的实际作用,就是将时间空间内坐标缩小一定倍率
//实际上是变相扩大了一张噪点图的覆盖范围,使得进行采样时更加连续
public const float noiseScale = 0.003f;

public static Vector4 SampleNoise(Vector3 position)
{
//实际世界空间坐标乘以缩放系数,使得采样控制在一个比较小的范围内,这样就会比较连续
return noiseSource.GetPixelBilinear(
position.x * noiseScale,
position.z * noiseScale
);
}
}

  这样,采样数据的范围就是原来的 $333 \frac 33$ 倍,最终运行后的诗句效果也变得更加平滑了。即使再次改变地图单元的高度,也不会出现那种很奇怪的阶梯状三角面片了。

  加入了采样缩放之后,噪声在平铺之前有个过渡过程。实际上因为单元格的内径是 $10 \sqrt 3 $,所以没有办法精确的以X轴的尺寸平铺。但是因为噪声纹理自身的连贯性,即使细节不吻合,任然能在大范围内发现重复的样式,大约是每20个地图单元之间。这只在地图没有其他编辑形状的功能时才比较明显。
  至此,我们修复了采样中的连续性问题,但是在还存在一个问题,就是每个地图单元的正六边形部分,并不是平整的,这一点从对UI的坐标点遮挡就可以看出来。我们想达到的效果是,六边形边缘部分的顶点会产生扰动,但是六边形自身还保持平整。这个问题将会在下一章解决。

Github代码