Bagaimana game seperti Minecraft menghasilkan seluruh dunia dari sejumlah unggulan?

32

Saya ingin menghasilkan dunia yang sepenuhnya unik dengan bioma (seperti apa yang dilakukan Minecraft dan game sejenis). Saya tidak mengerti bagaimana mereka menghasilkan seluruh dunia ini dari satu nomor "seed". Bisakah seseorang memberikan gambaran umum dasar teknik ini?

Josh
sumber
13
Notch benar-benar menulis posting blog tentang pembuatan medan , yang sekarang benar-benar usang karena kode baru itu memiliki bioma dan FRACTALS dan sihir lainnya. Tidak pernah ada bagian 2, juga.
kucing

Jawaban:

27
  1. Bagaimana Anda menghasilkan X acak dari sebuah benih? nilai seed adalah keadaan awal dari generator angka acak. Di sebagian besar bahasa pemrograman, Anda dapat mengatur seed ini. Misalnya, C menggunakan srand(). Jika Anda tidak menentukan seed tertentu untuk memulai, biasanya nilai cap waktu digunakan sebagai seed. Dengan begitu, setiap kali Anda berlari, angka acak berbeda.

    // C example
    srand(1);
    for(i=0; i<3; i++)
        printf("%d\n", rand());
    srand(1);
    for(i=0; i<3; i++)
        printf("%d\n", rand());
    
    1270216262 
    1085377743 
    1481765933
    1270216262 
    1085377743 
    1481765933

    Seperti yang Anda lihat, setiap kali Anda seed dengan nilai tertentu (saya menggunakan 1 sebagai seed), angka acak yang dihasilkan adalah sama.

  2. Bagaimana Anda membuat dunia minecraft berdasarkan nomor acak? Notch memiliki pos tentang ini. Anda juga dapat melihat tutorial orang lain tentang "dunia mirip minecraft". Saya menikmati yang ini, misalnya: rendering mirip Minecraft di OpenGL 4 . Ide dasarnya adalah menggunakan Perlin noise (atau simplex noise). Berikut adalah pertanyaan bagus tentang fungsi kebisingan: Memahami Perlin Noise

Jimmy
sumber
1
Sebenarnya, Anda tidak akan dapat menggunakan Perlin Noise. Saya khawatir minecraft memiliki tebing yang sangat menggantung, gua, dan sebagainya, dan PN tidak dapat melakukannya.
jcora
6
Perlin noise hanyalah sistem noise yang dapat Anda gunakan sebagai bagian dari metode pembuatan medan yang lebih besar. misalnya. Anda dapat menggunakan 3D perlin noise dengan nilai ambang batas ketinggian-bergantung untuk menghasilkan tebing, gua, dll. (Sunting - sebenarnya, saya melihat dari tautan di jawaban yang persis seperti yang dilakukan Notch pada satu titik.)
Kylotan
1
+1 Kylotan. Inilah kutipan dari blog Notch: "Secara khusus, tidak ada cara untuk [2D Perlin heightmap] untuk menghasilkan overhang. Jadi saya mengubah sistem menjadi sistem serupa yang didasarkan pada suara 3D Perlin. Alih-alih mengambil sampel" ketinggian tanah ", saya memperlakukan nilai kebisingan sebagai "kepadatan", di mana sesuatu yang lebih rendah dari 0 adalah udara, dan apa pun yang lebih tinggi dari atau sama dengan 0 akan ditumbuk. "
Jimmy