11

高さマップ生成アルゴリズムでPerlinNoiseを使用していますが、連続しているように見えるようにエッジをラップアラウンドさせたいと思います。これを行う簡単な方法やトリックはありますか?水平方向にも垂直方向にも回り込むように、球形のノイズのようなものが必要だと思います。ラッピング軸が1つだけでもいいのですが、2つが良いでしょう。

今のところ、追加するオクターブ数を設定できる古典的なアルゴリズムを使用しています。これは、連続するすべてのオクターブ間で波の振幅と周波数を変更するために使用される乗数です。

前もって感謝します!

4

1 に答える 1

8

パーリンノイズは、波形の合計として取得されます。波形はランダムな値を補間することによって得られ、オクターブの高い波形はスケーリング係数が小さくなりますが、補間されたランダムな値は互いに近くなります。このラップアラウンドを行うには、通常のトロイダル方式でy軸とx軸を適切に補間する必要があります。つまり、X軸がx_minからx_maxにまたがり、左端のランダムポイント(補間されている)がx0およびx1の右端(x_min <x0 <x1 <x_max)で、x1からx0まで(エッジをラップ)補間することにより、x1からx1までおよびx0から左に補間されたピクセルの値が取得されます。

ここでは、線形補間を使用してオクターブの1つを擬似コードします。これは、パーリンノイズグリッドサイズが2ピクセルの累乗である256x256マトリックスを想定しています...読みやすくするためです。たとえば、size==16を想像してみてください。

 wrappable_perlin_octave(grid, size):
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       grid[x][y] = random()
   for (x=0;x<256;x+=size):
     for (y=0;y<256;y+=size):
       if (x % size != 0 || y % size != 0): # interpolate
         ax = x - x % size
         bx = (ax + size) % 256 # wrap-around
         ay = y - y % size
         by = (ay + size) % 256 # wrap-around
         h = (x % size) / size # horizontal balance, floating-point calculation
         v = (y % size) / size # vertical balance, floating-point calculation
         grid[x][y] = grid[ax][ay] * (1-h) * (1-v) +
                      grid[bx][ay] * h * (1-v) +
                      grid[ax][by] * (1-h) * v +
                      grid[bx][by] * h * v
于 2011-04-07T21:39:15.593 に答える