โลก 'ถิ่นทุรกันดาร' ที่สร้างขึ้นขนาดใหญ่


76

ฉันแน่ใจว่าคุณทุกคนรู้เกมเช่นป้อมปราการแคระ - ถิ่นทุรกันดารและแผ่นดินที่สร้างขึ้นขนาดใหญ่ บางสิ่งเช่นนี้นำมาจากบทความที่มีประโยชน์มากนี้

อย่างไรก็ตามฉันสงสัยว่าฉันจะใช้สิ่งนี้กับขนาดที่ใหญ่ขึ้นได้อย่างไร ขนาดของ Minecraft นั้นมาถึงใจแล้ว (ไม่ใช่ขนาด 8x ของพื้นผิวโลกใช่ไหม) Pseudo-infinite ฉันคิดว่าคำที่ดีที่สุดจะเป็น

: D

บทความพูดถึงเสียงเพอร์ลินเศษส่วน ฉันไม่มีทางเป็นผู้เชี่ยวชาญในเรื่องนี้ แต่ฉันได้รับความคิดทั่วไป (มันเป็นเสียงที่สร้างขึ้นแบบสุ่มซึ่งมีลักษณะกึ่งกันดังนั้นจึงไม่ใช่แค่ค่าพิกเซลแบบสุ่ม)

ฉันสามารถกำหนดขอบเขต X โดย X ในขนาดเพิ่มสิ่งที่ประเภทโหลดภูมิภาคบางส่วนและมีเสียงหนึ่งบิตสร้างภูมิภาค แต่สิ่งนี้จะส่งผลให้เกิดหมู่เกาะจำนวนมาก

ในอีกด้านหนึ่งฉันไม่คิดว่าฉันจะสามารถสร้างเสียงเพอร์ลินซึ่งมีมวลมหาศาลได้ และมันจะเป็นแค่เกาะใหญ่ที่ฉันคิดว่า

ฉันค่อนข้างมั่นใจว่าเสียงเพอร์ลินหรือเสียงรบกวนจะเป็นคำตอบในทางใดทางหนึ่ง ฉันหมายถึงแผนที่ดูดีจริงๆ และคุณสามารถแทนที่ ascii ด้วยกระเบื้องและดูสิ่งที่สวยงามมาก


9
"จะส่งผลให้เกิดหมู่เกาะจำนวนมาก" - หรือมันสร้างที่ดินที่มีทะเลสาบอยู่ในนั้นถ้าคุณเพียงแค่เปลี่ยนที่ดิน / น้ำ

3
ถึงอย่างนั้นคุณก็จะได้ทะเลสาบจำนวนมากในรูปแบบที่ค่อนข้างธรรมดา
The Duck คอมมิวนิสต์

3
@ Kylotan: Mincraft มีขนาดไม่ จำกัด (ไม่จริง แต่มีขนาดใหญ่จริงๆ ... ปริมาณรวม = ยาว MaxValue x 128 x ยาว MaxValue) ดังนั้นจึงไม่สร้างโลกทั้งใบในภาพเดียวและไม่เก็บแผนที่ทั้งหมดในหน่วยความจำ มันสร้างขอบเขตของบล็อกขนาด 16x128x16 แบบอะซิงโครนัสหากไม่ได้รับการเยี่ยมชมก่อนที่จะโหลดจากดิสก์
zfedoran

2
@ The Communist Duck: ใช่นี่เป็นความจริงเกมเช่น minecraft สามารถหนีได้โดยใช้ข้อมูลประมาณ 2 ถึง 4 ไบต์ต่อบล็อก แต่จำเป็นต้องบันทึกเพียงไบต์เท่านั้นหลังจากมองไม่เห็นอีกต่อไป (หนึ่งไบต์อธิบายถึงประเภทของบล็อก ไบต์อื่น ๆ อธิบายถึงแสงและข้อมูลอื่น ๆ ซึ่งสามารถคำนวณใหม่ได้ในภายหลัง) ที่นี่เป็นที่ที่น่าสนใจคุณสามารถใช้ RLE เพื่อลดขนาดที่เก็บไว้ลงเหลือเพียงไม่กี่ไบต์เนื่องจากบล็อกค่อนข้างสอดคล้องกันดังที่คุณกล่าวถึง
zfedoran

4
'ใหญ่จริงๆ' ไม่เหมือนกับอนันต์และคุณไม่สามารถใช้สองคำแทนกันได้ หากคุณขยายแผนที่เป็นและเมื่อมีการค้นพบนั่นคือขนาดที่แน่นอนที่เติบโตตามความต้องการ - ค่อนข้างเป็นข้อเสนอที่แตกต่างจากการไม่มีที่สิ้นสุด การเจริญเติบโตแต่ละบิตสามารถสร้างได้ตามต้องการ ข้อมูลภูมิประเทศใน Minecraft นั้นคล้อยตามการบีบอัดเล็กน้อยเนื่องจากมีการเชื่อมโยงกันระหว่างข้อมูลในระดับสูง (เช่น RLE ตามที่กล่าวไว้)
Kylotan

คำตอบ:


35

ฉันคิดว่าฉันเข้าใจสิ่งที่คุณถามตอนนี้ดีขึ้น

เสียงรบกวนไม่ได้สุ่ม - มันดูสุ่ม แต่ขึ้นอยู่กับสูตรทางคณิตศาสตร์อย่างสมบูรณ์และสามารถทำซ้ำได้ ข้อมูลทั้งหมดจะถูกเข้ารหัสในสูตร ซึ่งหมายความว่าคุณสามารถมีสูตรที่อาจครอบคลุมพื้นที่ไม่ จำกัด และใช้สูตรบนพิกัดของพื้นที่ที่คุณต้องการ เมื่อคุณต้องการพื้นที่ที่อยู่ติดกันคุณเพียงแค่ใช้สูตรบนพิกัดใหม่อีกครั้งและเนื่องจากสูตรให้ค่าอย่างต่อเนื่องพื้นที่จะเข้าร่วมได้อย่างราบรื่น

นี่คือตัวอย่างแบบง่าย ๆ โดยใช้ไซน์แทนเสียงเพอลินสำหรับการสร้างความสูงและการจินตนาการว่าโลกไม่มีที่สิ้นสุดในแกน X แต่มีเพียง 1 ยูนิตที่สูงในแกน Y และ Z

สูตรคือ: height(x,y) = sin(x/20)

เกมเริ่มต้นขึ้นและเราสร้างความสูงสำหรับพื้นที่ใกล้เคียงเช่น (0,0) ถึง (9,0):

[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]

เรามีเนินเขาลุกขึ้นไปทางขวา สมมติว่าเราเดินไปจนสุดและต้องสร้างค่าจาก (10,0 ถึง 19,0) ตอนนี้:

[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]

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

หากโลกไม่เปลี่ยนแปลงคุณก็ไม่จำเป็นต้องเก็บอะไรเลยเพราะคุณสามารถคำนวณได้ว่าอะไรคือความสูงที่จุดใดจุดหนึ่งจากสูตร เห็นได้ชัดว่ามีอะไรบางอย่างเช่น Minecraft โลกที่สามารถเปลี่ยนแปลงได้ทั้งหมดดังนั้นคุณเพียงแค่บันทึกแต่ละชิ้นในขณะที่คุณสร้างมันขึ้นมา เนื่องจากมีระดับความเชื่อมโยงสูงระหว่างชิ้นส่วนที่อยู่ติดกัน (เช่นถ้า 1 บล็อกเป็นหญ้ามีโอกาสมากกว่าที่บล็อกที่อยู่ถัดจากมันจะเป็นหญ้าด้วย) คุณสามารถบีบอัดข้อมูลได้อย่างมีประสิทธิภาพมาก ดี แต่แล้วก็เกือบทุกอัลกอริทึมการบีบอัดมาตรฐาน

ในขณะที่ฉันได้พูดคุยเกี่ยวกับความสูงเป็นค่าที่ชัดเจนที่สุดคุณสามารถใช้ระบบเดียวกันเพื่อสร้างคุณลักษณะที่คุณต้องการ ใช้ฟังก์ชั่นทางคณิตศาสตร์ที่มีคุณสมบัติต่อเนื่องและตำแหน่งที่เป็นพิกัดโลกของคุณและที่สามารถตัดสินใจว่ามีสถานที่สำคัญฝากแร่จุดวางไข่อะไรก็ตามที่คุณต้องการ (เห็นได้ชัดว่าค่าในสูตรหนึ่งอาจส่งผลกระทบต่ออีกอย่างหนึ่ง - ไม่มีจุดใดที่วางฝากถ่านหินไว้กลางอากาศดังนั้นคุณสร้างแผนที่ความสูงของโลกแล้วคำนวณความเป็นไปได้ของถ่านหินสำหรับบล็อกที่อยู่ต่ำกว่าพื้นดิน)


คุณช่วยล้างสิ่งต่างๆได้อย่างแน่นอนขอบคุณ :) แต่บางอย่างเช่นฟังก์ชั่นเสียงรบกวนจะไม่ต่อเนื่อง และ AFAICS ถ้ามันต่อเนื่องฉันจะไม่ได้รับโลกที่ 'สุ่ม' หรือฉันกำลังพลาดบางสิ่งที่นี่
The Duck คอมมิวนิสต์เมื่อ

ขออภัยสำหรับความคิดเห็นที่สอง แต่ฉันรู้สึกว่าข้างต้นแยกจากนี้ เมื่อคุณพูดว่า 'ใช้พิกัดโลกสำหรับเสียงเพอร์ลิน' นี่จะเป็นผลแบบเดียวกับการสร้างเสียง 'ใหญ่' แต่ในบางส่วนหรือไม่? วันนี้ฉันรู้สึกว่าการดูดซึมช้า
The Duck คอมมิวนิสต์เมื่อ

การสร้างเสียงรบกวนของคุณนั้นสามารถเกิดขึ้นได้อย่างต่อเนื่องและมักจะเป็นเพราะคุณทำให้มันราบรื่น หากต้องการข้ามขอบเขตให้ราบรื่นคุณอาจต้องอ่านข้ามพรมแดนเล็กน้อย แต่หลักการยังคงเหมือนเดิม หากเสียงดังในคำถามต้องการข้อมูลแบบหลอกหลอกคุณต้องสร้างเสียงนั้นจากปริมาณที่ทราบ - เช่น แฮชของพิกัดโลกของคุณ ผลลัพธ์นั้นสามารถคาดการณ์ได้
Kylotan

2
ในแง่ของการสุ่มแต่ละโลกสามารถมีค่าเมล็ดของตัวเองซึ่งใช้ในการคำนวณ เช่น. sin (x + seed) แทนที่จะเป็น sin (x) ในตัวอย่างด้านบน แต่ละเมล็ดที่แตกต่างกันจะสร้างโลกที่แตกต่าง และเกี่ยวกับแผ่นใหญ่ ๆ ... ฉันไม่แน่ใจว่ามีความเกี่ยวข้องอะไร ไม่สำคัญว่าคุณจะสร้างมากหรือน้อยเพียงใดหรือเมื่อคุณทำเช่นนั้น สถานะเริ่มต้นของโลกถูกกำหนดโดยสูตรทางคณิตศาสตร์และคุณเพียงแค่ใช้สูตรนั้นเพื่อค้นหาสถานะนั้นเป็นเวลาที่คุณต้องการ
Kylotan

32

บทช่วยสอนที่ฉันเขียนเมื่อหลายปีก่อนอาจให้สิ่งที่คุณต้องการ:

ข้อความแสดงแทน

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


7
การสร้างภาพที่ยอดเยี่ยม!
zfedoran

3
ฉันจำได้ว่าใช้บทช่วยสอนนี้เมื่อทำวิทยานิพนธ์ของอาจารย์เกี่ยวกับการจำลองปรากฏการณ์ทางธรรมชาติ ฉันใช้ตัวอย่าง "ฮิลล์" เพื่อสร้างโดมท้องฟ้าเหนือโลก 3 มิติของฉัน การแนะนำที่ยอดเยี่ยมเกี่ยวกับแนวคิดของการสร้างภูมิประเทศ
C.McAtackney

1
มันช่างยอดเยี่ยม! ฉันไม่รู้ว่าใครเคยใช้มันจริงๆ
มหานคร

1
พระเจ้าช่วย !!! ฉันใช้สิ่งนี้ในโครงการก่อนหน้านี้ ... วิธีที่ง่ายที่สุดในการสร้างภูมิประเทศที่ฉันเคยเจอ !!!
สงคราม

15

เพื่อสร้างเกาะขนาดใหญ่คุณไม่จำเป็นต้องสร้างมันทั้งหมดในครั้งเดียว ฉันจะสร้างภูมิภาคแบบอะซิงโครนัสเมื่อคุณเยี่ยมชมพวกเขา

แทนที่จะใช้หน้ากากเพื่อสร้างเกาะตามบทความอธิบายสิ่งหนึ่งที่คุณสามารถทำได้คือเล่นกับความยาวคลื่นเสียงคู่ perlin เสียงเพื่อให้ได้รูปลักษณ์ที่คุณต้องการ โดยปกติแล้วอ็อกเทฟแรกจะอธิบายรูปร่างทั่วไปของภูมิประเทศ เลอะเลือนทั้งหมดหลังจากนั้นเพียงเพิ่มรายละเอียดเกรนละเอียดมากขึ้น ดังนั้นเล่นกับความยาวคลื่นของอ็อกเทฟแรกเพื่อควบคุมว่าผืนแผ่นดินใหญ่ของคุณจะใหญ่แค่ไหน หากคุณต้องการให้ทวีปอยู่ในศูนย์กลางคุณสามารถลดแผนที่ความสูงลงได้โดยเพิ่มจำนวนมากขึ้นเมื่อคุณย้ายออกจากศูนย์กลางแล้วทำให้เสียงเป็นปกติ เช่นลองจินตนาการถึงการรวมสองสิ่งนี้เข้าด้วยกันเพื่อสร้างเกาะของคุณ:

คู่แรก รายละเอียด

บทความนี้ควรช่วย: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

หากคุณต้องการเรียนรู้เกี่ยวกับโลก 3 มิติที่ไม่มีที่สิ้นสุดและเทคนิคต่าง ๆ ที่คุณสามารถใช้เพื่อเปลี่ยนลักษณะที่ปรากฏของภูมิประเทศผ่านการเล่นด้วยอินพุตเสียงและเอาต์พุตให้ดูบทความนี้: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html

อาจเป็นการอ่านที่ยากสักหน่อยหากคุณไม่คุ้นเคยกับไพพ์ไลน์กราฟิกและการเขียนโปรแกรม Shader


ผลกระทบที่ฉันต้องการเพื่อให้บรรลุนั้นเป็นเหมือนแผนที่ 2 มิติบนแผนที่ Minecraft (ไม่ใช่เกม) ... ถ้าฉันใช้อ็อกเทฟน้อยกว่านี้ฉันจะยังคงต้องสร้างเสียงเพอร์ลินจำนวนมากหรือไม่ หรือฉันสามารถสร้างจำนวนน้อยมากได้หรือไม่?
The Duck Communist

ฉันคิดว่าคุณอาจยังสับสนเล็กน้อยเกี่ยวกับการทำงานของเสียง perlin คุณสามารถสร้างบล็อกจำนวน 16x16 บล็อกแยกกันได้โดยส่งฟังก์ชั่นพิกัด x และ y เพื่อชดเชยเสียงเพอร์ลิน ขอให้สังเกตว่าฟังก์ชั่น PerlinNoise_2D (float x, float y) ใช้งานอย่างไรในพิกัด x และ y กล่าวอีกนัยหนึ่งมันสร้างสัญญาณรบกวนสำหรับบางตำแหน่ง (x, y) นอกจากนี้การสร้างอ็อกเทฟน้อยก็ไม่เหมือนกับการเปลี่ยนความยาวคลื่นของอ็อกเตฟ Less octaves => รายละเอียดเกรนละเอียดน้อยลง ความยาวคลื่นที่ยาวขึ้น => มีการซูมมากขึ้น
zfedoran

นอกจากนี้นี่คือบทความที่มีรหัสที่แสดงให้คุณเห็นว่าจะใช้ wavelenghts การซูม / ยาวขึ้นได้อย่างไร: dreamincode.net/forums/topic/66480-perlin-noise
zfedoran


7

เสียงเพอร์ลินและเพื่อน ๆ เป็นจุดเริ่มต้นที่ดี แต่คุณอาจต้องการก้าวไปอีกขั้น เครื่องกำเนิดสัญญาณรบกวนยอดนิยมส่วนใหญ่จะให้ผลลัพธ์ที่ไม่น่าสนใจ เพื่อให้ภูมิประเทศเป็นจริงคุณต้องการดูอัลกอริทึมที่จำลองเอฟเฟกต์การกัดเซาะ หนึ่งในเกมจำลองโลกที่ทันสมัยที่สุด - นั่นคือป้อมปราการ Dwarf - ทำการจำลองการกัดเซาะเป็นหนึ่งในขั้นตอนการสร้างโลก

หนึ่งในโซลูชั่นที่เย็นสวยผมเคยเห็นที่อธิบายไว้ใน "Advanced อนุภาคทับถม" บทความในเกมอัญมณีโปรแกรม 7. มีอื่น ๆ อีกมากมายที่มีอยู่บนอินเทอร์เน็ตเพื่อให้มีทรัพยากรจำนวนมากในการวาดจาก (เช่น1หรือ2 ) .

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