Diamond Square ile yaptığım çalışmalardan sonra Perlin Noise ile oynuyorum. Uygulamayı Hugo Elias tarafından takip ettim ; temel olarak, her koordinat değerini atmak için girdi olarak x, y ile bir dizi fonksiyon yapan.
PHP kodum burada :
İki sorum var:
Bir dizide bir yükseklik haritası oluşturmak için algoritmayı nasıl kullanırım? Onu tam olarak anlamadım ve PHP'ye sadece sahte kodu aktardım, ancak bir yerde okuduktan sonra son işlevi (map_perlined) yapıyorum, "sihirli bir şekilde" algoritmasının size verilen her x, y noktası (görünüşe göre, okumak zorunda kalmadan) size geçiş değerleri verdiği komşu değerler), bunu sadece rastgele işlev olarak kullanırken elde ederimmt_rand(-100,100)/100;
Ve bu kriptografik kullanılırken: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(BTW, PHP'de "olduğu gibi" uygulanabilir?):
Yani, özetle, üç soru:
- Kodum doğru mu?
- Rastgele işlev, kodda açıklandığı şekilde PHP'ye taşınabilir mi? Hata atmaz, ancak sonuç yoktur.
- Algoritmayı gerçekte nasıl kullanırım?
GÜNCELLEŞTİRME
Tamam, Gustavson gazetesinde gösterilen kodun bir PHP portunu yaptı ve diğer kodlayıcıların söylediği gibi sadece bir oktav üretti. Gürültü fonksiyonunu kontrol etmek için bunun çoklu oktav, genlik, frekans vb. Kavramları ile nasıl kullanılacağı hakkında başka yararlı bir site / kağıt / rehberiniz var mı? Gustavson'un makalesinde sadece algoritmanın gerçek uygulamasını değil, belki bir şeyleri özlüyorum, sonuçları gösteriyor?
GÜNCELLEME 2
@NATHAN
Gibi bir şey yaptım:
$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);
Ve değerleri 0,1 olarak normalleştirdikten sonra, aşağıdaki gibi oldukça donuk bir yükseklik haritası alıyorum:
Haritayı nasıl ekerim? Belki de uygulamam gereken şey, üçüncü değeri rastgele bir yüksekliğe sahip olan 3d versiyonudur. Ama eğer öyleyse, tam olarak yapmak istemediklerimi, elmas kare algoritması gibi bir şeyle sonlandırdığım komşu değerleri göz önünde bulundurmalıyım.
GÜNCELLEME 3
Daha fazla Perlin çalışması. Sonuçlarıma göre gürültüyü yönlendirecek bir yol bulamadım. Bu oktavları ve nihai sonucu kontrol edin:
Octave I ile IV
Özetlenmiş
Her oktav hemen hemen aynıdır. Kodu kontrol et:
$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);
Sonuçlar normalleştirildi. Gürültünün gelişiminde ne kullanırsınız? Genliği değiştirmenin yumuşak veya pürüzlü yüzeyler verdiği örnekleri görüyorum, ancak çok büyük bir genlik versem bile, çok az fark görüyorum.