Perlin solucanları ile mağara üretimi


12

Şu anda 3D Simplex Noise ile voksel arazisi gibi bir Minecraft oluşturmaya çalışıyorum ve aynı zamanda mağaraları uygulamak istiyorum.

Gerçekten güzel sonuçlar veren bu iş parçacığında Perlin Solucanları yöntemini buldum . Bununla birlikte, yığın temelinde yığın olarak nasıl oluşturulacağına dair hiçbir fikrim yok. Bu mümkün mü yoksa yığın bazında mağara gibi benzer bir solucan üreten alternatifler var mı?

Düzenleme: Bu nasıl çözüleceğini bilmiyorum sorunudur.

Edit2: Bu , 2D Ridged Multifractal Noise ile Simplex Noise yükseklik haritasının birleştirilmesinin sonucudur. Hala bazı ayarlamalar gerekiyor, ama bu hemen hemen istediğim sonuç. Byte56 sayesinde.


Mümkünse arazi üretimi için doğrudan formüller kullanmalısınız. Bir vokseli yalnızca koordinatlarına dayanarak ve bitişik olanlar hakkında bilgi olmadan hesaplayabiliyorsanız, yığınlar artık sorun değildir. Her voksel için ayrı ayrı hesaplanamayacağını düşündüğüm perlin solucanlarını kullanmak istiyorsanız, bağladığınız sorunun kabul edilen cevabındaki son paragrafa bir göz atın.
danijar

1
Temel olarak, bu benim sorum. Temel araziyi sadece verilen koordinatlarla hesaplamak kolaydır, ancak bir mağara olsun ya da olmasın, nasıl hesaplanacağımı bilmiyorum.
user000user

Yanıtlar:


5

Çoğu perlin gürültü algoritması, herhangi bir konumdaki gürültü değerini, benzer bir şeyle almanızı sağlar noise(x,y,z). Bu, yığın temelinde yığın oluşturmayı oldukça önemsiz hale getirir. Tek yapmanız gereken, yığın konumu yerine global konumu geçmek.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Gördüğünüz gibi, yığın sınırları üzerinden yineleyerek ve bu küresel konumun sağlam olup olmadığını kontrol ederek yığın için arazi üretiyoruz. Bu, genel olarak araziyi oluşturmak için kullandığınız yöntemle aynıdır.

perlinNoise.getküresel bir pozisyon alır ve yoğunluğunu döndürür. isSolidVokselin katı kalifikasyon için "yeterince yoğun" olup olmadığını görmek için basit bir test nerede olurdu.

perlinNoise.getbasit bir gürültü algoritmasından daha karmaşık olabilir. Dünyanızdaki vokselin derinliğine göre kontroller yapabilirsiniz. Örneğin, voksel "mutlak taban zemin seviyesi" olduğuna karar verdiğiniz değerin altındaysa, bir yoğunluğu döndürmek için perlin solucanlar algoritmasını kullanabilir, eğer mutlak tabanın üzerindeyse, size vermek için normal bir yoğunluk fonksiyonu kullanabilir daha çeşitli arazi. Ancak ikisi arasında bazı karıştırma tavsiye ederim.

Farklı Perlin gürültü işlevlerini birleştirmek, oynamak ve neyin işe yaradığını görmek için yapmanız gereken bir şeydir. Ortamınızı kurmak en iyisidir, böylece oyununuzu yeniden yüklemenize gerek kalmadan bazı değerleri değiştirebilir ve araziyi çalışırken değiştirebilirsiniz. Mutlu deneyler.


2
Cevap için teşekkürler. Ancak, solucan benzeri mağaralar oluşturmak için "normal" Perlin veya Simpleks Gürültü kullanmayı bilmiyorum. Bunlar küreseldir, tek bir yönde ölçeklendirilir veya çok uzun değildir. Ve Perlin Solucanlar algoritması için, kafa pozisyonunu bilmeden mevcut pozisyonun bir solucan içinde olup olmadığını nasıl belirleyeceğimi bilmiyorum.
user000user

1
Solucanlar algoritması "kafa pozisyonunu" bilmeye dayanmaz. Söylediğin gibi, senin sorunun yığın yığın yığın gürültü üretmek değil gibi görünüyor. Perlin solucanlarını uygulamak için bağladığınız soru hakkında öğreticiler var. "Düzenli" arazinin nasıl üretileceği burada bulunabilir .
MichaelHouse

3D Simplex Noise ile temel arazi üretimi iyi çalışıyor, ancak bir yığın içindeki bir solucan pozisyonunu / segmentini nasıl belirleyeceğimi bilmiyorum. Anladığım kadarıyla, solucana bir kafa pozisyonu ve n segmenti veriyorsunuz ve gürültü fonksiyonu ile segmentler arasındaki açıyı hesaplıyorsunuz. Sorunumun ne olduğunu daha iyi açıklayabilecek bir resim: link .
user000user

2
Farklı gürültü türleri vardır. Bir kafa pozisyonu kullanmak ve bundan sonra bir yöntem vardır. Bu sayfanın altına bakarsanız , önce kafa pozisyonuna ihtiyaç duymadan istediğiniz gürültü türünü yaratan bir ses bulacaksınız.
MichaelHouse

Bununla ilgili ipucu için teşekkürler. 3D Ridged Multifractal Noise'i uyguladım, ancak bunun sonucu oldukça tatmin edici değildi. 2D'de 2D Yükseklik Haritası ile birleştirmeye çalışacağım ve sonra tekrar rapor edeceğim. Bu daha solucan benzeri mağaralar oluşturabilir.
user000user

3

Bence Minecraft'ta böyle çalışıyor. Her solucan maksimum bir uzunluğa sahiptir (diyelim M). Her solucanın kafaları yığın konumuna göre hesaplanır. Her bir yığını oluşturduğunuzda, bir Myarıçap içindeki tüm parçaları kontrol etmeniz ve tüm solucanlarını takip etmeniz gerekir. Performans açısından ideal değil, ama işe yarıyor.

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.