ฟังก์ชั่นเมล็ดแบบสุ่มสำหรับการสร้างแผนที่?


28

ฉันกำลังมองหาฟังก์ชั่นในการสร้างแผนที่แบบเรียงต่อกันแบบสุ่มตามขอบเขตภาพของการเปลี่ยนแปลงแผนที่ (โดยผ่านแผนที่) ฉันต้องการให้แผนที่มีขนาดใหญ่มากและมีโครงสร้างเหมือนเขาวงกต

อย่างไรก็ตามหากโลกไม่มีที่สิ้นสุดให้กลับไปที่จุดที่ผู้เล่นเคยเป็นมาก่อนจะทำให้เกิดปัญหา เกมต้องจำได้ว่าทุกอย่างกลับไปที่นั่นดูเหมือนจริง

ดังนั้นฉันจึงคิดว่า - "Minecraft จะแก้ปัญหานี้ได้อย่างไร" และฉันคิดกับตัวเองว่าพวกเขาจะต้องใช้ฟังก์ชั่นตัวเลขสุ่มบางอย่างกับเมล็ดพืชซึ่งทั้งสองสามารถไปข้างหน้า แต่ข้างหลังและด้วยวิธีนั้นสร้างกระเบื้องเก่าขึ้นมาใหม่เหมือนเดิม แต่ในกรณีใหม่

คุณคิดอย่างไรกับเรื่องนี้?


เป็นอย่างไรคำตอบของฉันอยู่ที่ +5 แต่คำถามนั้นอยู่ที่ +2 เท่านั้น? นี่คือหนึ่งในคำถามที่ดีที่สุดในหน้าแรกในขณะนี้

2
minecraft ไม่เพียงเก็บชิ้นส่วนที่คุณเคยเยี่ยมชม / ดัดแปลง?
FxIII

@FxIII: Minecraft ต้องเพราะคุณสามารถปรับเปลี่ยนภูมิทัศน์ หากคุณไม่สามารถทำเช่นนั้นได้การจัดเก็บชิ้นส่วนนั้นอาจเป็นของเสียหรืออย่างน้อยก็เป็นการ overcomplication

@Joe Wreschnig: ตกลงโอเค ... ฉันกลัวว่าฉันพลาดบางสิ่งที่ยิ่งใหญ่จริงๆ!
FxIII

คำตอบ:


20

สิ่งที่คุณได้สังเกตเห็นความแตกต่างระหว่างที่เครื่องกำเนิดไฟฟ้าจำนวนสุ่มและฟังก์ชั่นเสียง ตัวสร้างตัวเลขสุ่มจะกระจายจำนวนที่แตกต่างกันออกไปในแต่ละครั้งที่คุณเรียกมัน ฟังก์ชั่นสัญญาณรบกวนใช้อาร์กิวเมนต์บางตัวเช่นแผนที่ x และ y และแยกตัวเลขด้วยคุณสมบัติทางสถิติแบบสุ่มแต่ค่าเดียวกันสำหรับอาร์กิวเมนต์เดียวกันทุกครั้งนั่นคือฟังก์ชันทางคณิตศาสตร์ที่เหมาะสม

ทั้งสองมีความสัมพันธ์กันอย่างใกล้ชิด ฟังก์ชั่นเสียงสามารถจำลองเครื่องกำเนิดไฟฟ้าจำนวนสุ่มโดยผ่านในค่าที่แตกต่างกันในแต่ละครั้ง - เช่นnoise(1), noise(2)และอื่น ๆ และเครื่องกำเนิดตัวเลขแบบสุ่มที่ถูกโยนเข้าไปในโต๊ะขนาดยักษ์สามารถทำหน้าที่เป็นเสียงได้ ในทั้งสองกรณีคุณกำลังใช้เครื่องมือที่ผิดสำหรับงาน

Minecraft โดยเฉพาะอย่างยิ่งการใช้Perlin เสียงประเภทของเสียงซึ่งเป็นราคาถูกคำนวณและมีคุณสมบัติที่พึงประสงค์ของการอย่างต่อเนื่องในขณะที่หลายมิติตามที่คุณต้องการ - ถ้าคุณกราฟf(x)จะf(x + 1)มีจะไม่กระโดดอย่างฉับพลันใด ๆ สิ่งนี้ทำให้มีประโยชน์มากสำหรับหลาย ๆ อย่างเช่นการปรับแต่งพื้นผิวเมฆปริมาตรและก๊าซและการสร้างภูมิประเทศ

หากคุณกำลังมองหาการติดตั้งเพื่อเริ่มเล่นเครื่องกำเนิดเสียง Perlin ที่ปรับปรุงแล้วของ Ken Perlinเป็นหนึ่งในการติดตั้งที่ง่ายที่สุด


3
โปรดทราบว่าเครื่องกำเนิดตัวเลขสุ่มจำนวนมากใช้เมล็ดพันธุ์และจะสร้างชุดหมายเลขเดียวกันที่ให้เมล็ดเดียวกัน
thedaian

3
@thedaian: ซึ่งไม่เป็นประโยชน์อย่างยิ่งในกรณีนี้เว้นแต่ว่าคุณต้องการสร้างใหม่ทุกหมายเลข ฟังก์ชั่นสัญญาณรบกวนช่วยให้คุณได้หมายเลขที่ 500 โดยไม่ต้องสร้าง 499 ก่อนหน้านั้น

กำหนดอัลกอริธึม Perlin Noise เป็นไปได้หรือไม่ที่จะทำการสอบเทียบ พิจารณาว่าฉันต้องการอัลกอริทึมที่จะสร้างชุดของแผ่นผนังและชุดของแผ่นพื้นที่
Mathias Lykkegaard Lorenzen

3
คุณยังไม่ได้อ่านและเข้าใจลิงก์ที่ฉันให้ในหกนาที

1
คำตอบนี้จะเสร็จสมบูรณ์ด้วยการโพสต์บล็อกของ Notch: notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

วิธีการที่ Minecraft ควบคุมการผลิตของมันคือการสร้างเมล็ดพันธุ์ระดับซึ่งใช้ในการเพาะเมล็ดจำนวนสุ่มทั้งหมดสำหรับเกม หากไม่มีชิ้นบนดิสก์เมื่อมีการร้องขอมันจะถูกสร้างขึ้นโดยใช้ฟังก์ชั่นการสร้างของ Notch ตามระดับของเมล็ด จากนั้นจะบันทึกลงดิสก์ในภายหลัง

ดูเหมือนว่าคุณกำลังมองหาพฤติกรรมที่คล้ายกันดังนั้นจึงเป็นวิธีที่ปลอดภัย


2

โจชี้ให้เห็นว่าคุณกำลังมองหาฟังก์ชั่นแฮช โดยทั่วไปฟังก์ชั่นสุ่มเป็นเพียงฟังก์ชั่นแฮชที่มีการส่งคืนหมายเลขล่าสุด ดังนั้นหากRandom()ส่งคืนHash(seed)=1234สายที่สองRandom()จะกลับมาHash(1234)เรื่อย ๆ

หากคุณกำลังมองหาฟังก์ชั่นคร่ำเครียดง่ายสำหรับตัวเลขสุ่มหลอกให้ตรวจสอบMurMurHash ฉันใช้งานใน C # และสามารถโพสต์ไว้ที่ใดก็ได้หากคุณสนใจ ข้อมูลรายละเอียดเพิ่มเติมของ Perlin เสียงที่ใช้ฟังก์ชั่นกัญชาดังกล่าวสามารถพบได้ที่นี่และการดำเนินการของมันใน C # เป็นที่นี่

ข้อมูลทั้งหมดนี้มาจากคำถามที่ฉันถามเมื่อหนึ่งปีก่อนที่นี่กับ Stack Overflow สิ่งที่คุณกำลังค้นหาเรียกว่าการสร้างเนื้อหาขั้นตอนดังนั้นหากคุณต้องการข้อมูลเพิ่มเติมให้ทำการค้นหาสิ่งนั้น สร้างภูมิประเทศที่มีความสุข!


-1 เสียงรบกวนของ Perlin นั้นคือไม่มีความคล้ายคลึงกับเทคนิคที่ใช้ใน MMH หรือกิจวัตรการเข้ารหัสลับอื่น ๆ รหัส C # นั้นเป็นขยะที่ดูเหมือนว่าจะทำการสอดแทรกเชิงเส้นตรงระหว่างค่าสุ่ม มันต้องการหน่วยความจำมากกว่าเสียงรบกวน Perlin ที่เหมาะสมและมีแนวโน้มที่จะทำงานช้าลง

1
@ Joe - ฉันขอโทษที่คุณรู้สึกอย่างมากเกี่ยวกับการดำเนินการของ Perlin Noise Perlin Noise เป็นแนวคิดของการเปลี่ยนฟังก์ชั่นแฮชเป็นฟังก์ชั่นเสียงรบกวนอย่างต่อเนื่อง ฉันสร้างเสียงเพอร์ลินได้อย่างมีประสิทธิภาพมากด้วย MurMurHash สำหรับรหัส C # เป็นตัวอย่างของวิธีการกำหนดค่าของจุดเดียวใน 2D Perlin Noise โดยทางโปรแกรม ฉันจะไม่ใช้มันในการผลิต แต่ในความคิดของฉันจะง่ายกว่ารหัสที่คุณโพสต์
dlras2

1
OP ไม่มีความรู้เรื่องเสียงรบกวนหรือการคร่ำครวญดังนั้นฉันเพียงแค่พยายามให้ข้อมูลอ้างอิงด้วยความหวังว่าพวกเขาจะตรวจสอบและตัดสินใจด้วยตนเองเกี่ยวกับวิธีการนำสิ่งที่พวกเขาต้องการทำไปใช้
dlras2

"Perlin Noise เป็นแนวคิดของการเปลี่ยนฟังก์ชั่นแฮชเป็นฟังก์ชั่นลดเสียงรบกวนอย่างต่อเนื่อง" ไม่เสียงเพอร์ลินเป็นหนึ่งในฟังก์ชั่นเสียงรบกวนต่อเนื่องที่คิดค้นโดยเคนเพอร์ลิน (ไม่ใช่เสียงที่เขาเรียกว่า ฟังก์ชั่นเสียงรบกวนอย่างต่อเนื่องไม่ใช่เสียงเพอร์ลินทั้งหมด ไม่ใช่ฟังก์ชั่นเสียงรบกวนอย่างต่อเนื่องทั้งหมดแม้กระทั่งเสียงเกรเดียนต์ซึ่งเสียง Perlin เป็นตัวอย่างเฉพาะ สิ่งที่คุณเชื่อมโยงกับไม่ใช่เสียงไล่ระดับสี แต่เป็นเสียงตามตัวอักษร

รหัสในลิงก์ของคุณคือ "ง่ายกว่าที่จะเดินผ่าน" เพราะไม่ใช่เสียงเพอร์ลิน มันไม่ราบรื่น มันใช้ทรัพยากรมากขึ้น ในระยะสั้นมันง่ายกว่าที่จะเดินผ่านเพราะมันโง่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.