Harita üretimi için rastgele tohum işlevi?


28

Harita değişiminin görsel sınırları olarak (haritadan geçerek) rastgele karo tabanlı bir harita oluşturma işlevini arıyorum. Haritanın sonsuz büyük olmasını ve labirent benzeri bir yapıya sahip olmasını istiyorum.

Bununla birlikte, eğer dünya sonsuzsa, bir oyuncunun daha önce bulundukları yere geri dönmek bir problem yaratır. Oyun, oradaki her şeyin gerçekte nasıl göründüğünü hatırlamalıdır.

Yani, “Minecraft bu sorunu nasıl çözer?” Diye düşünüyordum. kendime bir tohum ile bir tür rasgele sayı işlevini kullanmaları gerektiğini, hem ileriye hem de geriye doğru gidebileceklerini ve bu şekilde eski karoları aynen olduğu gibi, ancak yeni durumlarda yeniden üreteceklerini düşündüm.

Bu konudaki düşünceleriniz neler?


Cevabım +5'te, soru sadece +2'de mi? Bu şu anda ön sayfadaki en iyi sorulardan biri.

2
Minecraft basitçe değil saklamak önce ziyaret / modifiye parçalar?
FxIII

@ FxIII: Minecraft gerekir çünkü manzarayı değiştirebilirsiniz. Bunu yapamazsanız, topakları saklamak muhtemelen bir israf veya en azından bir aşırı komplikasyondur.

@Joe Wreschnig: Tamam, Tamam ... Gerçekten büyük bir şeyi kaçırdığımdan korktum!
FxIII

Yanıtlar:


20

Fark ettiğiniz şey, rasgele sayı üreteci ile gürültü işlevi arasındaki farktır . Rasgele bir sayı üreteci, onu her aradığınızda farklı bir sayı yayar. Gürültü işlevi bazı argümanlar alır - örneğin, bir harita x ve y - ve rasgele benzeri istatistiksel özelliklere sahip sayılar yayar , ancak her seferinde aynı argümanlar için aynı değer , yani uygun bir matematiksel işlevdir.

İkisi birbiriyle çok yakından ilgilidir. Bir gürültü işlevi, her seferinde farklı bir değere geçerek, örneğin noise(1), noise(2)vb. Ve dev bir masaya bırakılan rastgele bir sayı üreteci, bir gürültü işlevi olarak işlev görebilir. Her iki durumda da, iş için yanlış aracı kullanıyorsunuz.

Minecraft özellikle kullanımlar Perlin parazit , ucuz bilgi işlem için ve olmak istenen bir özelliğe sahip bir gürültü tipi sürekli ihtiyaç olarak çok boyutlu olarak - Eğer grafiğini f(x)için f(x + 1), herhangi bir ani sıçramalar olmayacaktır. Bu, doku modülasyonu, hacimsel bulutlar ve gazlar ve arazi üretimi gibi birçok şey için çok faydalıdır.

Oynamaya başlamak için bir uygulama arıyorsanız, Ken Perlin'in geliştirilmiş Perlin ses üreteci en basit uygulamalardan biridir.


3
Birçok rastgele sayı üreticisinin bir tohum kullandığını ve aynı tohum için verilen aynı sayı kümesini üreteceğini unutmayın.
thedaian

3
@thedaian: Bu sayı, özellikle her sayıyı yeniden düzenlemek istemediğiniz sürece faydalı değildir; Gürültü işlevi, bundan önce 499 oluşturmak zorunda kalmadan 500. sayıyı elde etmenizi sağlar.

Verilen Perlin Gürültü algoritması, kalibre etmek mümkün mü? Algoritmanın bir paket duvar karosu ve daha sonra bir de yer karosu paketi oluşturması daha muhtemel olsun.
Mathias Lykkegaard Lorenzen

3
Altı dakika içinde verdiğim bağlantıları okumadın ve anlamadın.


3

Minecraft'ın neslini denetleme şekli, oyun için tüm rasgele sayı neslini tohumlamak için kullanılan düz bir tohum oluşturmaktır. İstenildiğinde diskte bir yığın bulunmuyorsa , seviyenin tohumuna göre Notch'in oluşturma işlevi kullanılarak oluşturulur ; daha sonra diske kaydedildi .

Benzer bir davranış sergilemek istiyor gibi görünüyorsun, bu yüzden gitmek için güvenli bir yol.


2

Joe'nun işaret ettiği gibi, bir karma işlevi arıyorsunuz. Genel olarak, rastgele işlevler sadece son döndürülen numarayla birlikte ekilmiş hash işlevleridir. Böylece Random()geri döndü Hash(seed)=1234, ikinci bir çağrı , böyle devam Random()ederdi Hash(1234).

Sözde rasgele sayılar için basit bir karma işlevi arıyorsanız, MurMurHash'a bakın . C # ile uyguladım ve ilgileniyorsanız bir yere gönderebilirim. Böyle bir karma işlevi kullanan Perlin Gürültüsünün daha ayrıntılı bilgisini burada bulabilirsiniz ve bunun C # dilinde uygulanması burada .

Tüm bu bilgiler bir yıl önce burada Stack Overflow'ta sorduğum bir sorudan geldi . Baktığınız şeye prosedürel içerik oluşturma denir, bu nedenle daha fazla bilgiye ihtiyacınız olursa, bunun için bir arama yapın. Mutlu arazi oluşturma!


-1. Perlin gürültüsünün kargaşası, MMH'de veya diğer şifreleme karma rutinlerinde kullanılan tekniklerle benzerlik göstermiyor; bu C # kodunun rastgele değerler arasında sadece doğrusal enterpolasyon yapıyor gibi görünen çöp olduğunu; uygun Perlin gürültüsünden çok daha fazla bellek gerektiriyor ve muhtemelen daha yavaş çalışıyor.

1
@Joe - Perlin Gürültüsünü uyguladığınız için çok üzüldüğünüz için üzgünüm. Perlin Noise, bir karma fonksiyonunu sürekli bir gürültü fonksiyonuna çevirme kavramıdır. MurMurHash ile çok etkili bir şekilde Perlin Gürültüsü üretiyorum. C # koduna gelince, 2D Perlin Gürültüsünde tek bir noktanın değerini programlı olarak nasıl belirleyeceğinize bir örnek. Üretimde asla kullanmazdım, ama bence, girdiğiniz koddan daha fazla gezinmek daha kolay.
dlras2

1
OP'nin gürültü ya da karmaşası hakkında hiçbir bilgisi yoktu, bu yüzden ne yapmaları gerekiyorsa onu nasıl uygulayacaklarını kendi başlarına inceleyecekleri ve karar verecekleri umuduyla referanslar vermeye çalıştım.
dlras2

"Perlin Gürültüsü, bir karma fonksiyonunu sürekli bir gürültü fonksiyonuna çevirme kavramı." Hayır, Perlin gürültüsü Ken Perlin'in icat ettiği sürekli gürültü işlevlerinden biridir ("simpleks gürültü" olarak adlandırılan değil). Sürekli gürültü işlevlerinin tümü Perlin sesi değildir; sürekli gürültü işlevlerinin tümü, hatta Perlin gürültüsünün belirli bir örnek olduğu degrade gürültü değildir; Bağlandığınız şey degrade gürültüsü değil, değer gürültüsüdür.

Bağlantınızdaki kod "gezinmesi daha kolay" çünkü Perlin gürültüsü değil; o kadar pürüzsüz değil; çok daha fazla kaynak kullanıyor; Kısacası, içinden geçmek daha kolaydır, çünkü manyaktır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.