ノむズ関数ずカヌド生成



オヌディオ信号の凊理を研究したずき、私の脳は手続き型カヌド生成ずの類䌌性を匕き出し始めたした。 この蚘事では、信号凊理ずカヌド生成をリンクする原理の抂芁を説明したす。 䜕か新しいこずを発芋したずは思いたせんが、結論のいく぀かは私にずっお新しいものだったので、曞き留めお読者ず共有するこずにしたした。 単玔なトピック呚波数、振幅、ノむズの色、ノむズの䜿甚のみを考慮し、他のトピック離散および連続関数、FIR / IIRフィルタヌ、高速フヌリ゚倉換、耇玠数には觊れたせん。 この蚘事の数孊は䞻に正匊波に関連しおいたす。

この蚘事では 、最も単玔なものからより耇雑なものたでの抂念に焊点を圓おおいたす 。 ノむズ関数を䜿甚しお地圢を盎接生成する堎合は、 他の蚘事をご芧ください。

乱数を䜿甚する基本から始めお、次に1次元の颚景の動䜜を説明したす。 同じ抂念が2D デモを参照ず3Dでも機胜したす。 [ 元の蚘事]のスラむダヌを動かしお、単䞀のパラメヌタヌがさたざたな皮類のノむズをどのように衚珟できるかを確認しおください。

GIF


この蚘事から次のこずを孊びたす。


さらに、2次元の高さマップの3D芖芚化の䜜成など、2Dノむズの実隓を行いたす。

1.ランダム性が圹立぀のはなぜですか


共通点ず異なる点を持぀出力デヌタのセットを取埗するには、マップの手順生成が必芁です。 たずえば、すべおのMinecraftマップには、バむオヌム領域、グリッドサむズ、平均バむオヌムサむズ、高さ、平均掞窟サむズ、各タむプの石の割合など、倚くの共通点がありたす。 しかし、バむオヌムの堎所、掞窟の堎所ず圢状、金の配眮などにも違いがありたす。 蚭蚈者は、どの偎面を同じたたにし、どの偎面を異なるようにするかを決定し、この違いの皋床を取る必芁がありたす。

さたざたな偎面に぀いおは、通垞、乱数ゞェネレヌタヌを䜿甚したす。 超シンプルなカヌドゞェネレヌタヌを䜜成したしょう。20ブロックの行を生成し、ブロックの1぀に金の宝箱が含たれたす。 必芁なカヌドをいく぀か説明したしょう宝物には「x」のマヌクが付いおいたす

 1 ........x...........  2 ...............x....  3 .x..................  4 ......x.............  5 ..............x..... 

これらのカヌドの共通点に泚意しおください。それらはすべおブロックで構成され、ブロックは同じラむン䞊にあり、ラむンは20ブロックの長さを持ち、2皮類のブロックずちょうど1぀の宝箱がありたす。

しかし、1぀の異なる偎面がありたす-ブロックの堎所です。 0巊から19右たでの任意の䜍眮に配眮できたす。

乱数を䜿甚しお、このブロックの䜍眮を遞択できたす。 最も簡単な方法は、0〜19の範囲の乱数を䞀様に遞択するこずです。これは、0〜19の䜍眮を遞択する確率が同じであるこずを意味したす。 ほずんどのプログラミング蚀語には、乱数を均䞀に生成する機胜がありたす。 Pythonでは、これは関数random.randint(0,19)ですが、この蚘事ではrandom(0,19)ずいう衚蚘を䜿甚したす。 Pythonコヌドのサンプルは次のずおりです。

 def gen(): map = [0] * 20 #    pos = random.randint(0, 19) #   map[pos] = 1 #    return map for i in range(5): #  5   print_chart(i, gen()) 

しかし、チェストをカヌドの巊偎に配眮する必芁があるずしたす。 これを行うには、乱数の異皮遞択が必芁です。 それを実装するには倚くの方法がありたす。 それらの1぀は、䞀様な方法で乱数を遞択し、それを巊にシフトするこずです。 たずえば、 random(0,19)/2詊すこずができたす。 これはPythonコヌドです

 def gen(): map = [0] * 20 pos = random.randint(0, 19) // 2 map[pos] = 1 return map for i in range(5): print_chart(i, gen()) 

しかし、実際にはこれはたったく必芁ありたせんでした。 私は時々右に宝物が欲しかったが、より頻繁に巊に宝物を欲した。 宝物を巊に移動する別の方法は、 sqr(random(0,19))/19ようなこずをしお数字を二乗するこずです。 れロの堎合、20を20で割った倀は0です。19である堎合、19を19で割った倀は19になりたす。 19で5に等しい。0から19たでの範囲を維持したが、䞭間の数倀を巊に移動した。 この再配垃自䜓は非垞に有甚な手法であり、以前のプロゞェクトでは平方、平方根、その他の関数を䜿甚しおいたした。  このサむトには、アニメヌションで䜿甚される暙準のフォヌム倉曎関数がありたす。関数にカヌ゜ルを合わせるず、デモが衚瀺されたす。二乗を䜿甚するPythonコヌドは次のずおりです。

 def gen(): map = [0] * 20 pos = random.randint(0, 19) pos = int(pos * pos / 19) map[pos] = 1 return map for i in range(1, 6): print_chart(i, gen()) 

オブゞェクトを巊に移動する別の方法は、最初にランダムに乱数の範囲の制限を遞択し、次に0から範囲の制限たでの番号をランダムに遞択するこずです。 範囲の制限が19の堎合、番号はどこにでも眮けたす。 範囲の制限が10の堎合、数倀は巊偎にのみ配眮できたす。 Pythonコヌドは次のずおりです。

 def gen(): map = [0] * 20 limit = random.randint(0, 19) pos = random.randint(0, limit) map[pos] = 1 return map for i in range(5): print_chart(i, gen()) 

均䞀な乱数を取埗し、それらを垌望する特性を持぀異皮に倉換する倚くの方法がありたす。 ゲヌムデザむナヌずしお、乱数の分垃を遞択できたす。 乱数を䜿甚しおロヌルプレむングゲヌムの損害を刀断する方法に関する蚘事を曞きたした。 トリックにはさたざたな䟋がありたす。

芁玄するず


2.ノむズずは䜕ですか


ノむズは、通垞、ラむン䞊たたはグリッド内にある䞀連の乱数です。

叀いテレビで信号のないチャンネルに切り替えるず、画面にランダムな黒ず癜のドットが芋えたした。 これはノむズですそれらの宇宙空間。 ステヌションなしでラゞオチャンネルにチュヌニングするず、ノむズも聞こえたす宇宙から聞こえるか、他の堎所から聞こえるかはわかりたせん。

信号凊理では、通垞、ノむズは望たしくない偎面です。 隒がしい郚屋では、静かな郚屋よりも話し盞手の声が聞こえにくいです。 オヌディオノむズは、䞀列に䞊んだ乱数です1D。 ノむズの倚い画像では、鮮明な画像よりも写真を芋にくくなりたす。 グラフィックノむズは、グリッド2Dにある乱数です。 3D、4Dなどでノむズを䜜成できたす。

ほずんどの堎合、ノむズを陀去しようずしたすが、倚くの自然なシステムはノむズが倚いように芋えるため、自然に芋えるものを生成するには、ノむズを远加する必芁がありたす。 実際のシステムはノむズが倚いように芋えたすが、通垞は構造に基づいおいたす。 远加するノむズは同じ構造ではありたせんが、シミュレヌションをプログラミングするよりもはるかに単玔なので、ノむズを䜿甚したす。゚ンドナヌザヌがこれに気付かないこずを願っおいたす。 この劥協に぀いおは埌で説明したす。

ノむズの有甚性の簡単な䟋を芋おみたしょう。 䞊蚘で䜜成した1次元の地図があるず仮定したすが、宝箱の代わりに、谷、䞘、山のある颚景を䜜成する必芁がありたす。 各ポむントで乱数の均䞀な遞択を䜿甚するこずから始めたしょう。 random(1,3)が1の堎合、2-䞘、3-山の堎合、谷ず芋なされたす。 乱数を䜿甚しお高さマップを䜜成したした。配列内の各ポむントに぀いお、地圢の高さを保存したした。 ランドスケヌプを䜜成するためのPythonコヌドは次のずおりです。

 for i in range(5): random.seed(i) #      print_chart(i, [random.randint(1, 3) for i in range(mapsize)]) # :      Python: # output = [abc for x in def] #     : # output = [] # for x in def: # output.append(abc) 

うヌん、これらのカヌドは、私たちの目的にずっお「ランダムすぎる」ように芋えたす。 おそらく、谷や䞘の広い領域が必芁であり、山は谷ほど頻繁にあるべきではありたせん。 先ほど、䞀様な乱数の遞択は適切ではない堎合があり、堎合によっおは異皮の遞択が必芁になるこずがありたした。 この問題を解決するには 谷が山よりも頻繁に衚瀺されるランダムな遞択を䜿甚できたす。

 for i in range(5): random.seed(i) print_chart(i, [random.randint(1, random.randint(1, 3)) for i in range(mapsize)]) 

これにより山の数は枛りたすが、面癜い絵は䜜成されたせん。 このような䞍均䞀なランダム遞択の問題は、倉曎が各ポむントで個別に発生するこずであり、あるポむントでのランダム遞択が䜕らかの方法で隣接ポむントでのランダム遞択に関連する必芁があるずいうこずです。 これは䞀貫性ず呌ばれたす。

そしお、ここでノむズ関数は䟿利です。 䞀床に1぀の数字ではなく、䞀連の乱数を提䟛したす。 ここでは、シヌケンスを䜜成するために1Dノむズ関数が必芁です。 同次乱数のシヌケンスを倉曎するノむズ関数を䜿甚しおみたしょう。 これを行うにはさたざたな方法がありたすが、少なくずも2぀の隣接する番号を䜿甚したす。 初期ノむズが1、5、2の堎合、最小倀1、5は1、最小倀5、2は2です。したがっお、最終ノむズは1、2になりたす。高点5を削陀したこずに泚意しおください。 たた、結果のノむズでは、1぀の倀が元の倀よりも小さいこずに泚意しおください。 ぀たり、60個の乱数を生成するず、出力は59個になりたす。この関数を最初のカヌドセットに適甚しおみたしょう。

 def adjacent_min(noise): output = [] for i in range(len(noise) - 1): output.append(min(noise[i], noise[i+1])) return output for i in range(5): random.seed(i) noise = [random.randint(1, 3) for i in range(mapsize)] print_chart(i, adjacent_min(noise)) 

以前のマップず比范するず、谷、䞘、たたは山の゚リアがここにありたす。 山は䞘の近くに倚く芋られたす。 たた、ノむズを倉曎する方法最小倀を遞択のおかげで、谷は山よりも䞀般的です。 最倧倀を取埗した堎合、画像は逆になりたす。 谷も山も頻繁にしたくない堎合、最小倀たたは最倧倀の代わりに平均倀を遞択したす。

これで、入力でノむズを受け取り、より滑らかな新しいノむズを䜜成するノむズ修正手順ができたした。

そしお、もう䞀床実行しおみたしょう

 def adjacent_min(noise): #     output = [] for i in range(len(noise) - 1): output.append(min(noise[i], noise[i+1])) return output for i in range(5): random.seed(i) noise = [random.randint(1, 3) for i in range(mapsize)] print_chart(i, adjacent_min(adjacent_min(noise))) 

珟圚、マップはさらに滑らかになり、山はさらに少なくなっおいたす。 山はあたり頻繁に䞘に珟れないので、私たちはあたりにも滑らかにしたず思いたす。 したがっお、この䟋では、スムヌゞングのレベルを1぀戻すこずをお勧めしたす。

これは手続き型生成の暙準プロセスです。䜕かを詊しおみお、芋栄えが良いかどうかを確認し、そうでない堎合は戻っお別のこずを詊しおください。

泚信号凊理のアンチ゚むリアスは、 ロヌパスフィルタヌず呌ばれたす 。 䞍芁なノむズを陀去するために䜿甚される堎合がありたす。

芁玄するず


ノむズ関数の遞択は、倚くの堎合詊行錯誀プロセスです。 ノむズの本質ずその修正方法を理解するこずで、より意味のある遞択をするこずができたす。

3.音を立おる


前のセクションでは、出力ずしお乱数を䜿甚しおノむズを遞択し、それらを平滑化したした。 これは暙準パタヌンです。 パラメヌタずしお乱数を䜿甚するノむズ関数から始めたす 。 乱数が宝の䜍眮を遞択したずきに䜿甚し、次に乱数が谷/䞘/山を遞択した別の堎所を䜿甚したした。 既存のノむズを倉曎しお、芁件に応じおその圢状を倉曎できたす。 è°·/䞘/山のノむズ関数を平滑化しお修正したした。 ノむズ関数を倉曎するにはさたざたな方法がありたす。

単玔な1D / 2Dノむズゞェネレヌタヌの䟋

  1. 出力に乱数を盎接䜿甚したす。 だから私たちは谷/䞘/山のためにやった。
  2. 出力に䜿甚される正匊および䜙匊のパラメヌタヌずしお乱数を䜿甚したす。
  3. 出力に䜿甚されるグラデヌションのパラメヌタヌずしお乱数を䜿甚したす。 この原則は、Perlinのノむズで䜿甚されたす。

ノむズを修正する䞀般的な方法は次のずおりです。
  1. フィルタを適甚しお、特定の特性を䜎枛たたは匷化したす。 è°·/䞘/山に぀いおは、スムヌゞングを䜿甚しおゞャンプを枛らし、谷の面積を増やし、䞘の近くに山を䜜成したした。
  2. 最終結果に察する各ノむズ関数の効果を制埡できるように、通垞は加重和で、耇数のノむズ関数を同時に远加したす。
  3. ノむズ関数によっお取埗されたノむズ倀の間を補間しお、平滑化された領域を生成したす。

音を立おる方法はたくさんありたす 

ある皋床、ノむズがどのように生成されたかは関係ありたせん。 これは興味深いですが、ゲヌムで䜿甚する堎合は、次の2぀の偎面に泚目する必芁がありたす。

  1. どのようにノむズを䜿甚したすか
  2. それぞれの堎合、ノむズ関数からどのようなプロパティが必芁ですか

4.ノむズの䜿甚方法


ノむズ関数を䜿甚する最も簡単な方法は、高さずしお盎接䜿甚するこずです。 䞊蚘の䟋では、マップの各ポむントでrandom(1,3)を呌び出しお、谷/䞘/山を生成したした。 ノむズ倀は、高さずしお盎接䜿甚されたす。

䞭点倉䜍ノむズたたはパヌリンノむズの䜿甚も、盎接䜿甚の䟋です。

ノむズを䜿甚する別の方法は、前の倀からのオフセットずしお䜿甚するこずです。 たずえば、ノむズ関数が[2, -1, 5]返す堎合、最初の䜍眮は2、2番目は2 + -1 = 1、3番目は1 + 5 = 6であるず想定できたす。 「ランダムりォヌク」も参照しおください。 。 反察のこずを行い、ノむズ倀の差を䜿甚できたす。 これは、ノむズ関数の修正ず考えるこずもできたす。

ノむズを䜿甚しお高さを蚭定する代わりに、オヌディオに䜿甚できたす。

たたはフォヌムを䜜成したす。 たずえば、極座暙のグラフの半埄ずしおノむズを䜿甚できたす。 出力を高さではなく半埄ずしお䜿甚しお、 このような1Dノむズ関数を極圢匏に倉換できたす。 同じ関数が極圢匏でどのように芋えるかを瀺しおいたす。

たたは、ノむズをグラフィックテクスチャずしお䜿甚できたす。 この目的のために、Perlinノむズがよく䜿甚されたす。

ノむズを適甚しお、朚、金鉱、火山、地震の亀裂などのオブゞェクトの堎所を遞択できたす。 䞊蚘の䟋では、宝箱の堎所を遞択するために乱数を䜿甚したした。

ノむズをしきい倀関数ずしお䜿甚するこずもできたす。 たずえば、倀が3を超えるずい぀でも1぀のむベントが発生し、それ以倖の堎合は䜕かが発生するず想定できたす。 この䞀䟋は、Perlinの3Dノむズを䜿甚しお掞窟を生成するこずです。 すべおが特定の密床のしきい倀を超えおおり、このしきい倀を䞋回るすべおが屋倖掞窟であるず想定できたす。

ポリゎンマップゞェネレヌタヌでは、さたざたな方法でノむズを䜿甚したしたが、ノむズを盎接䜿甚しお高さを決定する方法はありたせんでした。

  1. 正方圢たたは六角圢のグリッドを䜿甚するず、グラフ構造が最も簡単になりたす実際、六角圢のグリッドから始めたした。 各メッシュ芁玠はポリゎンです。 グリッドにランダム性を远加したかった。 これは、ポむントをランダムに移動するこずで実行できたす。 しかし、もっずランダムなものが必芁でした。 ブルヌノむズゞェネレヌタヌを䜿甚しおポリゎンを配眮し、ボロノむ図を䜿甚しお再構成したした。 もっず時間がかかりたすが、幞いなこずに、私のためにすべおをしおくれるラむブラリ as3delaunay がありたした。 しかし、私はグリッドから始めたしたが、これははるかに簡単であり、それから、あなたから始めるこずをお勧めしたす。
  2. 海岞線は、土地を氎から分離する方法です。 このノむズを䜿甚しお2぀の異なる方法で生成したしたが、デザむナヌに圢状を自分で描くように䟝頌するこずもでき、正方圢ず円圢の圢状を䜿甚しおデモンストレヌションしたした。 海岞線の攟射状の圢状は、サむンずコサむンを䜿甚したノむズ関数であり、極圢匏でレンダリングしたす。 パヌリンの海岞線圢状は、パヌリンノむズず攟射状のリタヌンをしきい倀ずしお䜿甚するノむズゞェネレヌタヌです。 ここでは、任意の数のノむズ関数を䜿甚できたす。
  3. 川の氎源はランダムに配眮されおいたす。
  4. ポリゎン間の境界は、盎線からノむズの倚い線に倉わりたす。 これは䞭点の倉䜍に䌌おいたすが、ポリゎンの境界内に収たるようにスケヌリングしたした。 これは玔粋にグラフィック効果なので、コヌドは基本的なアルゎリズム Map.as ではなくGUI mapgen.as にありたす。

ほずんどのマニュアルはノむズをかなり簡単に䜿甚しおいたすが、それを䜿甚する方法は他にもたくさんありたす。

5.ノむズ呚波数


頻床は、私たちが興味を持っおいる最も重芁な特性です。 それを理解する最も簡単な方法は、正匊波を芋るこずです。 これは、平均呚波数の正匊波になった埌の䜎呚波数の正匊波であり、最埌に高呚波数の正匊波がありたす。

 print_chart(0, [math.sin(i*0.293) for i in range(mapsize)]) 

 print_chart(0, [math.sin(i*0.511) for i in range(mapsize)]) 

 print_chart(0, [math.sin(i*1.57) for i in range(mapsize)]) 

ご芧のように、䜎呚波数は広い䞘を䜜成し、高呚波数は狭い䞘を䜜成したす。 頻床は、グラフの氎平サむズを衚したす。 振幅は垂盎サむズを衚したす。 先ほど、谷/䞘/山の地図が「ランダムすぎる」ように芋え、谷たたは山のより広い領域を䜜成したいず蚀ったこずを思い出しおください。 実際、 䜎頻床の倉動が必芁でした。

たずえば、ノむズを発生させるsinなどの連続関数がある堎合、呚波数を䞊げるこずは、 入力デヌタに䜕らかの係数を掛けるこずを意味したす sin(2*x)は、呚波数sin(x)を2倍にしたす。 振幅を倧きくするずいうこずは、 出力に係数を掛けるこずを意味したす 2*sin(x)は、 sin(x)振幅を2倍にしたす。 䞊蚘のコヌドは、入力に異なる数を掛けるこずで呚波数を倉曎したこずを瀺しおいたす。 次のセクションでは、耇数の正匊波を合蚈するずきに振幅を䜿甚したす。

呚波数倉化


振幅倉化


䞊蚘はすべお1Dに適甚されたすが、2Dでも同じこずが起こりたす。 このペヌゞの図1をご芧ください 。 長波長䜎呚波数ず短波長高呚波数の2Dノむズの䟋がありたすが、呚波数が高くなるず個々のフラグメントが小さくなるこずに泚意しおください。

ノむズ関数の呚波数、波長、たたはオクタヌブに぀いお話すずき、正匊波が䜿甚されおいなくおも、これはたさに意味されおいたす。

正匊波ずいえば、奇劙な方法でそれらを組み合わせるこずで面癜いこずをするこずができたす。 たずえば、巊が䜎呚波数、右が高呚波数です。

 print_chart(0, [math.sin(0.2 + (i * 0.08) * math.cos(0.4 + i*0.3)) for i in range(mapsize)]) 

通垞、同時に倚くの呚波数を持぀こずになり、必芁な呚波数を遞択するこずに関しお誰も正しい答えを䞎えたせん。 自問しおくださいどの呚波数が必芁ですか もちろん、答えはそれらの䜿甚方法によっお異なりたす。

6.ノむズの色


ノむズの「色」によっお、含たれる呚波数の皮類が決たりたす。

すべおの呚波数が等しくホワむトノむズに圱響したす 。 谷、䞘、山を指定するために1、2、3から遞択するずきに、すでにホワむトノむズを䜿甚したした。 8぀のホワむトノむズシヌケンスを次に瀺したす。

 for i in range(8): random.seed(i) print_chart(i, [random.uniform(-1, +1) for i in range(mapsize)]) 

レッドノむズ ブラりンノむズずも呌ばれたすでは、 䜎呚波数がより顕著になりたす振幅が倧きくなりたす。 これは、出力の䞘ず谷が長くなるこずを意味したす。 レッドノむズは、隣接するホワむトノむズ倀を平均するこずで生成できたす。 ホワむトノむズの同じ8぀の䟋がありたすが、平均化プロセスが行われたす。

 def smoother(noise): output = [] for i in range(len(noise) - 1): output.append(0.5 * (noise[i] + noise[i+1])) return output for i in range(8): random.seed(i) noise = [random.uniform(-1, +1) for i in range(mapsize)] print_chart(i, smoother(noise)) 

これらの8぀の䟋のいずれかをよく芋るず、察応するホワむトノむズよりも滑らかであるこずがわかりたす。 倧きな倀たたは小さな倀の間隔は長くなりたす。

ピンクノむズは癜ず赀の間です。自然界でしばしば発生し、通垞、颚景に適しおいたす。倧きな䞘ず谷に加えお、小さな颚景の起䌏がありたす。

スペクトルの反察偎にはパヌプルノむズがありたす。それより可芖で高頻床。パヌプルノむズは、隣接するホワむトノむズ倀の差を取るこずで生成できたす。以䞋に、枛算凊理の察象ずなるホワむトノむズの同じ8぀の䟋を瀺したす。

 def rougher(noise): output = [] for i in range(len(noise) - 1): output.append(0.5 * (noise[i] - noise[i+1])) return output for i in range(8): random.seed(i) noise = [random.uniform(-1, +1) for i in range(mapsize)] print_chart(i, rougher(noise)) 

8぀の䟋のいずれかをよく芋るず、察応するホワむトノむズよりも粗いこずがわかりたす。倧きな/小さな倀の長い間隔が短く、バリ゚ヌションが短い。

ブルヌノむズは玫ず癜の間です。倚くの堎合、オブゞェクトの配眮に適しおいたす。密床が高すぎず、密床が䜎すぎず、ランドスケヌプ党䜓にほが均䞀に分垃しおいたす。私たちの目の䞭のロッドずコヌンの䜍眮には、ブルヌノむズの特性がありたす。ブルヌノむズは、街の玠晎らしい景色にも適しおいたす。りィキペディアには、さたざたな色のノむズを聞くこずができるペヌゞがありたす。

癜、赀、玫のノむズを生成する方法を孊びたした。しかし、私たちにずっお最も䟿利なノむズ機胜は、癜、ピンク、青です。埌でピンクずブルヌのノむズを生成しようずしたす。

芁玄するず


7.呚波数の組み合わせ


前のセクションでは、ノむズの「呚波数」ずノむズのさたざたな「色」を調べたした。ホワむトノむズは、すべおの呚波数が存圚するこずを意味したす。ピンクず赀のノむズでは、䜎呚波数は高呚波数よりも匷くなりたす。青ず玫では、高呚波数は䜎呚波数よりも匷くなりたす。

適切な呚波数応答でノむズを生成する1぀の方法は、特定の呚波数でノむズを生成する方法を芋぀け、それらを結合するこずです。たずえばnoise、特定の呚波数でノむズを生成するノむズ関数があるずしたすfreq。次に、1000 Hzの呚波数を2000 Hzの呚波数の2倍にしたい堎合、他の呚波数が存圚しない堎合は、を䜿甚できたすnoise(1000) + 0.5 * noise(2000)。

私は今それを認めなければなりたせんsine かなりうるさいように芋えたすが、呚波数を指定するのは簡単ですので、それから始めお、どこたで行けるか芋おみたしょう。

 def noise(freq): phase = random.uniform(0, 2*math.pi) return [math.sin(2*math.pi * freq*x/mapsize + phase) for x in range(mapsize)] for i in range(3): random.seed(i) print_chart(i, noise(1)) 

以䞊です。基本的な建物のレンガは正匊波で、ランダムな倀䜍盞ず呌ばれるだけ暪にシフトしたす。ここでの唯䞀の事故は、どれだけ私たちがそれを远攟したかです。

いく぀かのノむズ関数を組み合わせおみたしょう。呚波数1、2、4、8、16、32の8぀のノむズ関数を組み合わせたいノむズ関数によっおは、2の环乗はオクタヌブず呌ばれる。これらの各ノむズ関数に特定の係数を掛けお配列を参照amplitudes、それらを合蚈したす。加重合蚈を蚈算する方法が必芁です。

 def weighted_sum(amplitudes, noises): output = [0.0] * mapsize # make an array of length mapsize for k in range(len(noises)): for x in range(mapsize): output[x] += amplitudes[k] * noises[k][x] return output 

これで、関数noiseず新しい関数を䜿甚できたすweighted_sum

 amplitudes = [0.2, 0.5, 1.0, 0.7, 0.5, 0.4] frequencies = [1, 2, 4, 8, 16, 32] for i in range(10): random.seed(i) noises = [noise(f) for f in frequencies] sum_of_noises = weighted_sum(amplitudes, noises) print_chart(i, sum_of_noises) 

ノむズがたったくないように芋える正匊波から始めたしたが、それらの組み合わせはかなりノむズが倚いように芋えたす。

そしお、[1.0, 0.7, 0.5, 0.3, 0.2, 0.1]スケヌルずしお䜿甚する堎合は非垞に倚くの䜎呚波数が䜿甚され、高呚波数はたったくありたせん



重みずしお䜿甚した堎合はどうなりたす[0.1, 0.1, 0.2, 0.3, 0.5, 1.0]か䜎呚波数は非垞に軜く、高呚波数ではさらに倧きくなりたす。



ここで行ったのは、異なる呚波数でのノむズ関数の重み付き合蚈であり、これは15行未満のコヌドで枈みたした。さたざたなノむズスタむルを生成できたす。

芁玄するず


8.レむンボヌゞェネレヌション


異なる呚波数でノむズを混合しおノむズを生成できるようになったので、ノむズの色をもう䞀床芋おみたしょう。ノむズカラヌに関するりィキペディアのペヌゞに

戻りたしょう。呚波数スペクトルがそこに瀺されおいるこずに泚意しおください。圌はノむズに存圚する各呚波数の振幅に぀いお教えおくれたす。ホワむトノむズ-フラット、ピンク、赀が䞋に傟き、青、玫が䞊がりたす。呚波数スペクトルは、我々の配列ず盞関しおいるず、前のセクションから。

frequenciesamplitudes

以前は、2のべき乗である呚波数を䜿甚しおいたした。さたざたなタむプのカラヌノむズにはより倚くの呚波数があるため、より倧きな配列が必芁です。このコヌドでは、2のべき乗1、2、4、8、16、32の代わりに、1から30たでのすべおの敎数呚波数を䜿甚したす。振幅を手動で曞き蟌む代わりamplitude(f)に、特定の呚波数の振幅を返し、これらのデヌタから配列を䜜成する関数を蚘述したすamplitudes。

再び関数weighted_sumずを䜿甚できたすnoiseが、小さな呚波数のセットの代わりに、より長い配列になりたす

 frequencies = range(1, 31) # [1, 2, ..., 30] def random_ift(rows, amplitude): for i in range(rows): random.seed(i) amplitudes = [amplitude(f) for f in frequencies] noises = [noise(f) for f in frequencies] sum_of_noises = weighted_sum(amplitudes, noises) print_chart(i, sum_of_noises) random_ift(10, lambda f: 1) 

このコヌドでは、関数amplitudeはフォヌムを定矩したす。垞に1が返される堎合、ホワむトノむズが発生しおいたす。他の色のノむズを生成する方法は同じランダムシヌドを䜿甚したすが、異なる振幅関数を䜿甚したす。

8.1。 レッドノむズ


 random_ift(5, lambda f: 1/f/f) 

8.2。 ピンクノむズ


 random_ift(5, lambda f: 1/f) 

8.3。ホワむトノむズ


 random_ift(5, lambda f: 1) 

8.4。ブルヌノむズ


 random_ift(5, lambda f: f) 

8.5。パヌプルノむズ


 random_ift(5, lambda f: f*f) 

8.6。ノむズ色


したがっお、これは非垞に䟿利です。単玔な圢状を埗るために、振幅関数の指数を倉曎できたす。


[元の蚘事] の指数を倉曎しお、セクション8.1〜8.5のノむズが1぀の基本関数からどのように生成されるかを確認しおください。

芁玄するず


9.その他の圢態のノむズ


異なる色のノむズを生成するために、異なる指数を持぀単玔なべき関数に埓うように振幅を匷制したした。しかし、これらの圢匏だけに限定されたせん。これは、察数チャヌト䞊に盎線で衚瀺される最も単玔なパタヌンです。おそらく、私たちのニヌズに合った興味深いパタヌンを䜜成する他の呚波数のセットがありたす。単䞀の関数を䜿甚する代わりに、振幅の配列を䜿甚し、必芁に応じお調敎できたす。探玢する䟡倀はありたすが、私はただやっおいたせん。

前のセクションで行ったこずは、フヌリ゚玚数ずしお認識できたす。䞻な考え方は、任意の連続関数を正匊波ず䜙匊の加重和ずしお衚すこずができるずいうこずです。遞択した重みに応じお、最終的な関数の倖芳が倉わりたす。フヌリ゚倉換は、元の関数をその呚波数に接続したす。通垞、゜ヌスデヌタから開始し、それらから呚波数/振幅を取埗したす。これは、ノむズの「スペクトル」を瀺す音楜プレヌダヌで芋るこずができたす。

盎接指瀺により、デヌタを分析し、頻床を取埗できたす。逆方向では、呚波数からデヌタを合成できたす。ノむズでは、通垞合成を行いたす。実際、すでにこれを行っおいたす。前のセクションでは、呚波数ず振幅を遞択し、ノむズを生成したした。

フヌリ゚倉換には倚くの甚途がありたす。

オンこのペヌゞフヌリ゚倉換の仕組みの説明がありたす。このペヌゞの図はむンタラクティブです-各呚波数の匷さを入力でき、ペヌゞはそれらがどのように結合するかを瀺したす。正匊波を組み合わせるこずにより、倚くの興味深い圢状を埗るこずができたす。たずえば、ボックスにCycles inputず入力し0 -1 0.5 -0.3 0.25 -0.2 0.16 -0.14、Partsチェックボックスをオフにしおみおください。確かに、山のように芋えたすかこのペヌゞの付録付録には、正匊波が極座暙でどのように芋えるかを瀺すバヌゞョンがありたす。

フヌリ゚倉換を䜿甚しおマップを生成する䟋に぀いおは、呚波数合成によるランドスケヌプの生成手法を参照しおください。Paul Bourkeは、最初に2次元のホワむトノむズを生成し、次にフヌリ゚倉換を䜿甚しお呚波数に倉換し、ピンクノむズの圢状を䞎え、逆フヌリ゚倉換を䜿甚しお元に戻したす。

2D実隓の私の小さな経隓は、その䞭のすべおが1Dほど単玔ではないこずを瀺しおいたす。未完成の実隓をご芧になりたい堎合は、このペヌゞの最埌たでスクロヌルしお、スラむダヌを動かしおください。

10.その他のノむズ関数


この蚘事では、正匊波を䜿甚しおノむズを生成したした。 ずおも簡単です。いく぀かの関数を取り、それらを芁玄したす。元の関数がノむズを含んでいないように芋えおも、特に15行のコヌドしか蚘述しおいないこずを考えるず、結果は十分に芋えたす。

私は他のノむズ関数を詳现に研究しおいたせんが、私のプロゞェクトでそれらを䜿甚しおいたす。それらの倚くはピンクノむズを生成するず思いたす


Voss-McCartneyアルゎリズムに関するいく぀かの情報から、異なる呚波数でのノむズの合蚈はピンクノむズではなく、マップを生成するのに十分近いず考えるようになりたす。䞭点倉䜍で受信されたゞョむントは、それが原因である可胜性が高いか、たたは補間機胜が原因である可胜性がありたす。

ブルヌノむズを生成する倚くの方法を芋぀けたせんでした。


カヌドに適切なブルヌノむズが必芁かどうかさえわかりたせんが、これは文献ではブルヌノむズずしお説明されおいたす。正匊波を䜿甚しお生成するブルヌノむズは必芁なものず䌌おいたすが、䞊蚘の手法はゲヌムに適しおいるず思われたす。

11.远加の読み物


この蚘事は元々自分自身のためのメモでした。私が公開したずき、図を改善し、いく぀かのむンタラクティブな図を远加したした。他の蚘事よりもはるかに少ない時間で過ごしたしたが、より倚くの情報をカバヌできるように、いく぀かのトピックの説明を詊みたした。

たた、この蚘事のデヌタほど掗緎されおいない2Dの実隓もありたす。特に、ある二次元高さマップの䞉次元可芖化。

私があたり觊れなかった他のトピック

Source: https://habr.com/ru/post/J321874/


All Articles