ฉันจะกำหนดพื้นที่ที่เต็มไปด้วยน้ำได้อย่างไร


9

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

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

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

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


2
ภูมิประเทศของคุณมีการจัดระเบียบในเครื่องยนต์อย่างไร มีเทคนิคที่แตกต่างกันสำหรับ voxel vs. heightmap เทียบกับภูมิประเทศ (ตาข่าย) polysoup
Exilyth

มันได้รับเป็นตาข่ายและน้ำไม่ควรแลกเปลี่ยนตาข่ายภูมิประเทศนั้นแตกต่างจากตาข่ายแบบคงที่อื่น ๆ
danijar

1
ค้าขายหรือเลี้ยง
Tom 'Blue' Piddock

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

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

คำตอบ:


3

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

ฉันเห็นปัญหาเกี่ยวกับการใช้งานนี้ แต่แน่นอนว่าเป็นทางออกที่ค่อนข้างง่ายและ "ดีพอ" ที่ผู้ชม / ผู้เล่นจะสงสัยว่าจะสังเกตเห็นความเบี่ยงเบนในการจำลอง


2

หากคุณกำลังใช้ภูมิประเทศ voxel-based คุณสามารถนอกเหนือไปจากการจัดเก็บความหนาแน่นของพื้นดินต่อ voxel คุณยังสามารถเก็บค่าน้ำที่จับยึดระหว่างและ0 1 - groundDensityการวาดน้ำนั้นง่ายพอ ๆ กับการเดินไปตามก้อนน้ำที่ผ่านค่าน้ำ การจำลองน้ำจะเป็นเรื่องยากขึ้นเล็กน้อย แต่หลักฐานพื้นฐานคือคุณต้องการที่จะแก้ปัญหาของระบบเช่น:

  1. น้ำใต้ผิวดินควรเติมส่วนที่เหลือของ voxel
  2. ระดับพื้นผิวของน้ำควรมีความหนาแน่นรวมเท่ากันgroundDensity + waterDensityกับเพื่อนบ้าน
  3. น้ำอาจถูกแทนที่ด้วย voxel ใด ๆ ที่อยู่ติดกันทันทีและอยู่ด้านล่างหากความหนาแน่นรวมของเพื่อนบ้านนั้นน้อยกว่าความหนาแน่นทั้งหมด

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


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