2 คะแนน โดย GN⁺ 2025-02-08 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ปัญหาของน้ำ

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

การตั้งค่า

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

สิ่งที่ไม่ใช่คำตอบ

  • Smoothed Particle Hydrodynamics ให้ผลลัพธ์ที่น่าประทับใจมาก แต่แก้ปัญหาคนละแบบ
  • Stable Fluids ของ Jos Stam จัดการกับปริมาตรของไหลทั้งหมด และทำงานได้ไม่เร็ว

สมการน้ำตื้น

  • สมการน้ำตื้นทำการเฉลี่ยในแนวดิ่ง ทำให้เหลือสมการแบบ 2D
  • ส่วนที่ว่า "ตื้น" หมายถึงการสมมติว่าขนาดในแนวดิ่งโดยทั่วไปของคอลัมน์น้ำนั้นเล็กกว่ามาตราส่วนในแนวนอนมาก

กริด

  • ในพลศาสตร์ของไหล กริดมีความสำคัญ และโดยทั่วไปจะใช้ staggered grids
  • staggered grids จะเก็บความสูง/ความหนาแน่นของน้ำไว้ในเซลล์สี่เหลี่ยม และเก็บความเร็วไว้ที่ขอบระหว่างเซลล์

วิธีท่อเสมือน

  • จำลองการไหลของน้ำโดยสมมติว่าเซลล์น้ำเชื่อมต่อกันด้วยท่อเสมือน
  • ประกอบด้วยสามขั้นตอน: การเร่งการไหล, การสเกลการไหลออก, และการอัปเดตคอลัมน์น้ำ

การเร่งการไหล

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

การอัปเดตคอลัมน์น้ำ

  • สำหรับแต่ละเซลล์น้ำ ให้เพิ่มหรือลดน้ำตามการไหลที่อยู่ติดกัน

การสเกลการไหลออก

  • ปรับการไหลออกเพื่อไม่ให้ปริมาณน้ำในเซลล์กลายเป็นค่าติดลบ

ระดับความสูงของภูมิประเทศ

  • เพิ่มระดับความสูงของภูมิประเทศเพื่อให้น้ำเคลื่อนที่ไปบนภูมิประเทศ

เงื่อนไขขอบเขต

  • ต้องพิจารณาว่าเกิดอะไรขึ้นที่ขอบของการจำลอง
  • กำหนดค่าการไหลที่ขอบเขตเพื่อระบุเงื่อนไขอย่างกำแพง การไหลเข้า การไหลออก เป็นต้น

ความหนืด

  • เพิ่มความหนืดเพื่อให้ชั้นน้ำที่บางมากเคลื่อนที่ได้ยากขึ้น

โค้ดการจำลองทั้งหมด

  • โค้ดการจำลองประกอบด้วยลูป for 4 ชุดที่ทำงานกับอาร์เรย์ 2D ไม่กี่ชุด

ข้อเสียของโมเดล

  • ไม่มีความเฉื่อยและการแพร่ของความเร็ว ดังนั้นเมื่อน้ำที่ไหลเร็วไหลเข้าสู่ทะเลสาบ มันจะกระจายออกไปทุกทิศทาง

โบนัส: กริดหกเหลี่ยม/สามเหลี่ยม

  • สามารถใช้งานกริดสามเหลี่ยมเพื่อจำลองน้ำได้ ซึ่งมองได้ว่าเป็น dual ของกริดหกเหลี่ยม

1 ความคิดเห็น

 
GN⁺ 2025-02-08
ความคิดเห็นจาก Hacker News
  • กล่าวถึงปัญหาในงานจำลองของไหลที่น้ำสะสมและส่งผลต่อเซลล์ข้างเคียง ซึ่งเป็นหนึ่งในเหตุผลที่ทำให้การทำงานแบบขนานในเกมที่สร้างแบบ procedural ทำได้ยาก

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

    • แบ่งปันประสบการณ์การทำ fluid dynamics บน GPU ของตนเองในปี 2011
    • อธิบายว่าของไหล (เลือด) ถูกจำลองแบบ 2D บนพื้นผิว (เนื้อเยื่อ) และฉายลงบน mesh โดยคำนึงถึงแรงโน้มถ่วงและความเอียงของพื้นผิว
  • กล่าวถึงวิธีเก็บทรัพยากรใน Animal Crossing ว่ามีประสิทธิภาพโดยไม่ต้องปรับเปลี่ยนภูมิประเทศ

    • ตัดต้นไม้เพื่อเอาท่อนไม้ได้ แต่หลังจากได้ครบจำนวนหนึ่งแล้วต้องรอคูลดาวน์
    • เสนอว่าสำหรับเกมที่ไม่จำเป็นต้องปรับภูมิประเทศ วิธีนี้อาจดีกว่า
  • กล่าวถึงว่า physics ของน้ำในเกม Timberborn เป็นองค์ประกอบสำคัญของเกม และแนะนำเกมนี้

    • การหาวิธีกั้นน้ำและนำไปใช้กับเครื่องยนต์และพื้นที่เพาะปลูกเป็นส่วนสำคัญของการเล่นเกม
  • แบ่งปันประสบการณ์ทดลองอัลกอริทึมที่นำไปทำเป็น 3D โดยใช้ o3-mini-high

    • กล่าวว่าตนได้เขียน Perlin noise ขึ้นมาเองตั้งแต่ต้นและนำไปใช้สร้างภูมิประเทศ
  • แนะนำงานจำลองน้ำท่วมเพื่อการศึกษา โดยใช้ WebGL คำนวณค่าของแต่ละเซลล์จากเซลล์ข้างเคียง

    • อธิบายว่าสามารถเห็นผลกระทบขนาดใหญ่ได้จากการเปลี่ยนค่าของโมเดล
  • เสนอวิธีแก้ปัญหาการขาด inertia และการแพร่ของความเร็วในการจำลองน้ำ

    • อธิบายว่าสามารถแก้ได้ด้วยการนำค่าของลูกศรทิศทางการไหลไปเฉลี่ยกับลูกศรของเซลล์ข้างเคียง
  • แบ่งปันความสนใจเกี่ยวกับงานจำลองการกัดเซาะที่เริ่มต้นจากโปรเจกต์ส่วนตัว

    • กล่าวว่าตนหยุดโปรเจกต์ไปเพราะไม่เข้าใจการกัดเซาะ
  • กล่าวถึงไอเดียจำลองน้ำในเกม Creeper World แล้วค่อยทิ้งระเบิดหลังจากนั้น