ฉันกำลังเล่นกับ Perlin Noise หลังจากทำงานกับ Diamond Square ฉันติดตามการใช้งานโดย Hugo Eliasซึ่งโดยทั่วไปสร้างชุดฟังก์ชันด้วย x, y เพื่อป้อนค่าแต่ละค่าพิกัด
รหัส PHP ของฉันอยู่ที่นี่ :
ฉันมีสองคำถาม:
ฉันจะใช้อัลกอริทึมเพื่อสร้างแผนที่ความสูงในอาร์เรย์ได้อย่างไร ฉันไม่เข้าใจอย่างเต็มที่และเพิ่งส่งไปยัง PHP รหัสเทียม แต่ทำฟังก์ชั่นสุดท้าย (map_perlined) หลังจากอ่านที่ไหนสักแห่งว่าอัลกอริธึม "น่าอัศจรรย์" ให้ค่าการเปลี่ยนสำหรับแต่ละ x, y ชี้ให้ (ชัดโดยไม่ต้องอ่าน ค่าติดกัน) ฉันเพิ่งได้สิ่งนี้เมื่อใช้เป็นฟังก์ชั่นแบบสุ่มmt_rand(-100,100)/100;
และสิ่งนี้เมื่อใช้การเข้ารหัสลับ: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(อันไหน BTW สามารถดำเนินการ "ตามที่เป็น" ใน PHP?):
ดังนั้นสรุปคำถามที่สาม:
- รหัสของฉันถูกต้องหรือไม่
- ฟังก์ชั่นแบบสุ่มสามารถย้ายไปยัง PHP ตามที่อธิบายไว้ในรหัสได้หรือไม่ มันไม่มีข้อผิดพลาด แต่ผลลัพธ์ไม่ได้อยู่ที่นั่น
- ฉันจะใช้อัลกอริทึมจริงได้อย่างไร
UPDATE
ตกลงทำพอร์ต PHP ของรหัสที่แสดงในกระดาษ Gustavson และตามที่ผู้เขียนโค้ดคนอื่นบอกว่ามันแค่สร้างอ็อกเทฟเดียว มีไซต์ / กระดาษ / คู่มืออื่น ๆ เกี่ยวกับวิธีใช้สิ่งนี้กับแนวคิดของอ็อกเทฟหลายแอมพลิจูดความถี่ ฯลฯ เพื่อควบคุมฟังก์ชั่นเสียงรบกวนหรือไม่? บนกระดาษของกุสตาฟสันแสดงผลลัพธ์ไม่ใช่การใช้อัลกอริทึมจริง ๆ บางทีฉันอาจพลาดอะไรบางอย่าง?
อัปเดต 2
@NATHAN
ฉันทำบางสิ่งเช่น:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
และหลังจากปรับค่าปกติเป็น 0..1 ฉันได้รับแผนที่ความสูงที่ค่อนข้างทึบเช่น:
ฉันจะหว่านเมล็ดแผนที่ได้อย่างไร บางทีสิ่งที่ฉันต้องใช้คือ 3d version ที่มีค่าที่สามเป็นความสูงแบบสุ่ม? แต่ถ้าเป็นเช่นนั้นฉันจะต้องคำนึงถึงคุณค่าของเพื่อนบ้านซึ่งฉันจะลงท้ายด้วยบางอย่างเช่นอัลกอริธึมแบบสี่เหลี่ยมจัตุรัสซึ่งเป็นสิ่งที่ฉันไม่ต้องการทำ
อัพเดท 3
Perlin ทำงานมากขึ้น ฉันยังไม่พบวิธีที่จะนำเสียงไปสู่ผลลัพธ์ของฉัน ตรวจสอบอ็อกเทฟเหล่านี้และผลลัพธ์สุดท้าย:
อ็อกเทฟ I ถึง IV
สรุป
ระดับแปดเสียงแต่ละคู่ค่อนข้างเท่ากัน ตรวจสอบรหัส:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
ผลลัพธ์จะถูกทำให้เป็นมาตรฐาน คุณจะใช้อะไรมีอิทธิพลอย่างมากต่อการพัฒนาเสียง ฉันเห็นตัวอย่างที่การเปลี่ยนแอมพลิจูดให้พื้นผิวที่นุ่มหรือขรุขระ แต่แม้ว่าฉันจะให้แอมพลิจูดขนาดใหญ่ แต่ฉันก็เห็นความแตกต่างเล็กน้อย