คุณสามารถใช้ฟังก์ชั่นเสียงรบกวนเพื่อสร้างความสูงแบบสุ่ม ที่ง่ายที่สุดของพวกเขาคือเสียงค่าซึ่งทำงานเหมือนกับคำอธิบายของคุณ: คุณสร้างความสูงจำนวนเต็มแบบสุ่มบางส่วนแล้วแทรกความสูงระหว่างพวกเขา วิธีการแก้ไขที่ใช้บ่อยที่สุดคือการแมป S-curve ลูกบาศก์:
สมมติว่าคุณมีความสูงh0
ที่จุดx0
และความสูงที่จุดh1
x1
จากนั้นเพื่อให้ได้ความสูง ณ จุดใดก็ได้x
( x0<=x<=x1
) คุณใช้
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
ความสูงที่ได้มาในลักษณะนี้จะราบรื่นสุ่ม แต่ไม่น่าสนใจจริงๆ ที่จะทำให้ภูมิประเทศของคุณดีขึ้นคุณสามารถใช้เสียงเศษส่วน มันใช้งานได้เช่นนี้: สมมติว่าคุณได้สร้างฟังก์ชั่นh(x)
ที่ให้ความสูงที่พิกัดที่กำหนด ฟังก์ชั่นนี้มีความถี่พิจารณาจากความถี่ของความสูงของ interger ดั้งเดิม ในการสร้างเศษส่วนจากนั้นคุณรวมฟังก์ชั่นเข้าด้วยกันกับความถี่หลายความถี่:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
ในตัวอย่างนี้ฉันรวมสี่ความถี่ - ดั้งเดิม, คู่, 4 ครั้งและ 8 เท่าเดิมด้วยความถี่ที่สูงขึ้นซึ่งให้น้ำหนักน้อยลง ในทางทฤษฎีเศษส่วนไปตลอดทางจนถึงอนันต์ แต่ในทางปฏิบัติมีข้อกำหนดเพียงไม่กี่ข้อเท่านั้น fbm
ในสูตรหมายถึงการเคลื่อนที่แบบบราวเศษส่วน - นี้เป็นชื่อของฟังก์ชั่นนี้
นี่เป็นเทคนิคที่ทรงพลัง คุณสามารถเล่นกับตัวคูณความถี่ด้วยน้ำหนักของความถี่ที่แตกต่างกันหรือเพิ่มฟังก์ชั่นบางอย่างเพื่อบิดเบือนเสียง ตัวอย่างเช่นหากต้องการความรู้สึก "ยับ" มากขึ้นh(x)
สามารถเปลี่ยนเป็น1-abs(h(x))
(สมมติว่า-1<=h(x)<=1
)
อย่างไรก็ตามในขณะที่ทั้งหมดนี้เป็นสิ่งที่ดีเทคนิคนี้มีข้อ จำกัด ร้ายแรง ด้วยวิธีการตาม "ความสูง" คุณจะไม่มีทาง "ภูมิประเทศยื่น" และฉันคิดว่าพวกเขาจะเป็นคุณสมบัติที่ดีมากที่มีในเกมคล้าย "Moon Buggy"
การเพิ่มระยะยื่นออกที่ดีเป็นงานที่ยาก สิ่งหนึ่งที่ฉันนึกถึง - คุณสามารถเริ่มต้นด้วย "ความสูง" เศษส่วนและ "tessellate" ลงในชุดของเส้นโค้งหรือเส้นโค้ง bezier จากนั้นแนวภูมิประเทศจะถูกกำหนดโดย "ประเด็นสำคัญ" หลายประการ ใช้ความกระวนกระวายใจกับประเด็นสำคัญเหล่านี้ - สิ่งนี้จะส่งผลให้เกิดการเสียรูปแบบสุ่มของภูมิประเทศซึ่งอาจเป็นรูปร่างที่น่าสนใจ อย่างไรก็ตามการตัดกันด้วยตนเองของภูมิประเทศอาจกลายเป็นปัญหาด้วยวิธีนี้โดยเฉพาะอย่างยิ่งเมื่อมีปริมาณกระวนกระวายใจสูง