私は、Diamond Squareでの仕事の後、Perlin Noiseをいじっています。基本的に、各座標値をスローするための入力としてx、yを使用して一連の関数を作成するHugo Eliasの実装に従いました。
私のPHPコードはこちらです:
2つの質問があります。
アルゴリズムを使用して、配列に高さマップを生成するにはどうすればよいですか?私はそれを完全には理解せず、PHPに擬似コードを移植しましたが、アルゴリズムが「魔法のように」与えられたx、yポイントごとに遷移した値を与えることを読んだ後、最後の関数(map_perlined)を実行します(明らかに、隣接する値)、ランダム関数として使用するときにこれを取得しますmt_rand(-100,100)/100;
そして、これは暗号を使用する場合:(1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
ところで、これはPHPに「そのまま」実装できますか?):
要約すると、3つの質問:
- 私のコードは正しいですか?
- ランダム関数は、コードで説明されているようにPHPに移植できますか?エラーはスローされませんが、結果はそこにありません。
- アルゴリズムを実際に使用するにはどうすればよいですか?
更新
OK、Gustavsonの論文に示されているコードのPHPポートを作成しました。他のコーダーが言ったように、1オクターブを生成するだけです。複数のオクターブ、振幅、周波数などの概念でこれを使用してノイズ機能を制御する方法について、他の有用なサイト/ペーパー/ガイドがありますか?Gustavsonの論文では、アルゴリズムの実際の実装ではなく、結果のみを示していますが、おそらく何かが欠けていますか?
更新2
@NATHAN
私は次のようなものを作りました:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
そして、値を0..1に正規化した後、次のようなやや鈍い高さマップを取得します。
マップをシードするにはどうすればよいですか?おそらく私が実装する必要があるのは、3番目の値がランダムな高さの3Dバージョンですか?しかし、もしそうなら、私は隣人の値を考慮するために見つけなければなりません、それは私がしたくないことを正確にダイアモンドスクエアアルゴリズムのようなもので終わるでしょう。
更新3
より多くのPerlinの仕事。結果にノイズを導く方法をまだ見つけていません。これらのオクターブと最終結果を確認してください。
オクターブIからIV
要約する
各オクターブはほぼ同じです。コードを確認してください:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
結果は正規化されます。ノイズの発生に強い影響を与えるものは何ですか?振幅を変更すると、ソフトまたは粗い表面が得られる例がありますが、大きな振幅を与えても、ほとんど違いはありません。