การสร้างเรน 2D (และพลศาสตร์ของไหล)


11

ฉันกำลังทดลองกับสภาพอากาศในเกมของฉันและฉันก็ประทับใจกับวิธีที่ Starbound จัดการฝน โดยทั่วไปเมื่อฝนตกกระทบพื้นดินมันก็กระจายตัวในแนวนอน (และถูกดูดซับโดยพื้นดิน) หรือก่อให้เกิดกองน้ำ

วิดีโอนี้แสดงให้เห็นอย่างชัดเจน: http://imgur.com/gallery/CKCGKbG

ฉันรู้วิธีที่จะทำให้ฝนตกและตรวจสอบว่ามันกระทบพื้น แต่นั่นคือสิ่งที่ฉันติด คำถามของฉันคือ: สิ่งนี้สามารถสร้างได้อย่างไร? และรูปแบบหนึ่งของการไหลของน้ำได้อย่างสมบูรณ์แบบโดยไม่ฆ่าประสิทธิภาพได้อย่างไร

ขอบคุณล่วงหน้า!


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

คำตอบ:


9

ระบบน้ำของ Starbound นั้นเป็นระบบออโตมาตาเซลเซลแบบ 2D แบบกระเบื้อง แต่ละกระเบื้องบนหน้าจอที่ไม่มีเลเยอร์ของกระเบื้องด้านหน้าสามารถถือน้ำได้ ปริมาณน้ำจะถูกคำนวณผ่านเซลลูลาร์ออโตมาตา

ข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้ที่นี่:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

สำหรับหยดฝนนั้นเป็นอนุภาค พวกเขาให้บริการหลักในการปลอมว่ามีน้ำตกลงมาจากท้องฟ้า น้ำสะสมเพียงเพราะเกมรู้ว่าฝนกำลังตก หยดแต่ละอันไม่เกี่ยวข้องกับการก่อตัวของแอ่งน้ำจริง

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

Starbound จัดการกับแรงดันน้ำและเทคนิคการเรนเดอร์ของพวกเขานั้นน่าทึ่งมาก พวกเขามีการใช้ 2D ฟิสิกส์ที่ดีที่สุดโดยใช้เซลออโตมาตาที่ฉันเคยเห็น

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

http://www.jgallant.com/images/pressuretest.gif

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


2
เพื่อเพิ่มความจริงที่ว่าอนุภาคน้ำฝนปลอมผลกระทบของน้ำที่ตกลงมา: หยดน้ำหยดเล็ก ๆ บนพื้นผิวก็ไม่ได้เกี่ยวข้องกับอนุภาคฝนที่เกิดขึ้นจริง แต่ผลที่แยกต่างหาก การรวมกันทำให้ดูเหมือนว่าหยดทำให้กระเด็น
Felsir

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

ไม่สิ่งที่คุณต้องทำก็คือเพิ่มกฎเช่นอนุญาตให้มีไพ่มากกว่า 1 หน่วยเต็ม หากกระเบื้องนั้นมีของเหลวมากกว่า 1 หน่วยเต็มและไม่สามารถไหลได้ตามกฎชุดปกติ - ให้ไหลขึ้นด้านบน ปรับเพื่อให้น้ำไหลได้มากขึ้นตามค่าความดันของกระเบื้องนั้น
jgallant

3

มีหลายวิธีในการเข้าถึงสิ่งนี้ เช่นเคย 'มันขึ้นอยู่กับ'

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

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

สมมุติว่า Waterbox มีขนาด 32X32 พิกเซล เพิ่มสีน้ำหนึ่งบรรทัดจาก 0,31- 31,31 อีก 10 หยดวาดเส้นจาก 0,30 - 31,30 เช่นเดียวกับหยดที่สะสมคุณจะต้องสร้างกล่องเก็บน้ำจากด้านล่างจนเต็ม

หวังว่ามันสมเหตุสมผล

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