บทความทั้งหมด
อัปเดตผลิตภัณฑ์ · 8 min read

น้ำที่ประพฤติตัว: มองครั้งแรกกับ Numivo Water

มองครั้งแรกกับ Numivo Water สำหรับ Unreal Engine: มหาสมุทร ทะเลสาบ ใต้น้ำ และถ้ำระดับภาพยนตร์ ตัดสินเทียบกับภาพถ่ายอ้างอิง แสงและฟองแบบอิงฟิสิกส์ และแรงลอยตัว Drop-a-Mesh ที่ทำให้วัตถุใด ๆ ลอยหรือจมได้โดยไม่ต้องตั้งค่า

Illustration of a stylised sea with a floating crate and a sinking statue

สรุปสั้น ๆ: เรากำลังสร้างระบบน้ำสำหรับ Unreal Engine พร้อมคำสัญญาสองข้อ: น้ำที่ดูถูกต้องเพราะแสง สี และฟอง ถูกคำนวณเชิงฟิสิกส์ (ไม่ใช่จูนด้วยมือทีละฉาก) และน้ำที่ ประพฤติตัว: ทิ้งเมชใดก็ได้ลงบนผิวน้ำ แล้วมันจะลอย เอียง หรือจมอย่างถูกต้อง โดยไม่ต้องตั้งค่า อยู่ระหว่างการพัฒนาอย่างจริงจัง โพสต์นี้อธิบายว่ามันครอบคลุมอะไร เราให้ตัวเอง รับผิดชอบด้วยภาพถ่ายอ้างอิงอย่างไร ทำไมแรงลอยตัวจึงเป็นส่วนยากที่ทุกคนข้าม และมันวางตัวตรงไหนข้าง ๆ ส่วนที่เหลือของ ชุดเครื่องมือ

คลื่นพายุระเบิดกระแทกชายฝั่งหิน มาตรฐานที่ต้องเอาชนะ สังเกตว่าอะไรทำให้สิ่งนี้สมจริง: ฟองที่เกิดจากคลื่นแตก หมอกที่กัดกินหน้าผา สถิติยอดคลื่นขาว ทั่วทั้งคลื่นยาว ไม่มีอะไรวางด้วยมือ ทั้งหมดคือฟิสิกส์ นั่นคือเส้นที่เราตั้งไว้

ทำไมต้องมีระบบน้ำอีกระบบ?

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

มีความล้มเหลวที่สอง เงียบกว่า และสำคัญพอ ๆ กัน: แทบทุกระบบน้ำปฏิบัติต่อวัตถุลอยน้ำเป็นเรื่องที่นึกได้ทีหลัง คุณได้ เทมเพลตเรือ คำแนะนำการติดตั้งทุ่นหนึ่งหน้า และสมมติฐานที่ไม่ได้พูดว่าจะไม่มีใครโยนลังสุ่ม ๆ ลงทะเล ผู้เล่นโยนลังลง ทะเลอยู่ตลอดเวลา

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

ตัดสินเทียบภาพถ่าย ไม่ใช่เทียบรสนิยม

การพัฒนาถูกเกตด้วยภาพถ่ายอ้างอิงที่มีสัญญากล้องและแสงคงที่ หน่วยแสงเชิงฟิสิกส์ ทोนแมปเปอร์ที่ล็อก และ เมตริกความต่างเชิงการรับรู้ที่ตัดสินผ่านหรือไม่ผ่าน ไม่ใช่อารมณ์ของอาร์ตไดเรกเตอร์ในวันนั้น

สองภาพอ้างอิงเป็นแบบฉบับ และถูกเลือกให้ตรงข้ามกัน:

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

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

ฝั่งกล้องถูกกำหนดเข้มงวดพอ ๆ กับฝั่งน้ำ เพราะการเปรียบเทียบภาพจะยุติธรรมก็ต่อเมื่อกล้องโกงไม่ได้ นั่นหมายถึงความเข้ม แสงเชิงฟิสิกส์จริง (ดวงอาทิตย์เที่ยงราว 100,000 ลักซ์ ไม่ใช่สไลเดอร์ความสว่างตามอำเภอใจ) การเปิดรับแสงคงที่ และการ ตั้งค่าโทนแมปปิงและบลูมคงที่ต่อภาพอ้างอิง เปลี่ยนโทนแมปเปอร์ แล้วน้ำใด ๆ ก็ทำให้ตรงกับภาพใด ๆ ได้ นั่นคือเหตุผลที่ โทนแมปเปอร์ถูกตรึงเป็นอย่างแรก

Drop-a-Mesh: ลอยได้โดยไม่ต้องทำการบ้าน

ลากเมชใด ๆ ลงบนแหล่งน้ำ Numivo แล้วมันจะประพฤติตัวถูกต้องทันที ระบบสร้างพร็อกซีฟิสิกส์อัตโนมัติ คำนวณ ปริมาตรที่แทนที่ต่อเฟรมจากความสูงคลื่นจริง และอนุมานลอย-หรือ-จมจากความหนาแน่นจริง

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

ท่อนไม้ลอยและกลิ้งไปด้านยาว ลังโคลงเคลง รูปปั้นหินจม ไม่มีการริก ไม่มีการวางทุ่น ไม่มีสคริปต์ ใต้ฝากระโปรง:

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

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

เป้าหมายการออกแบบตรงไปตรงมา และเป็นเดโมที่เราอยากรันสด ๆ ได้: มีคนลากพร็อพสุ่ม 20 ชิ้นลงทะเล แล้วทุกอย่างก็ประพฤติตัว เอง โดยไม่เปิดหน้าต่างตั้งค่าแม้แต่บานเดียวก่อน ถ้าเดโมนั้นต้องมีบทสอน แสดงว่าฟีเจอร์ล้มเหลว

มันครอบคลุมอะไร

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

รายละเอียดที่สำคัญถ้าคุณใส่ใจเรื่องน้ำ:

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

ทำไมแรงลอยตัวจึงเป็นส่วนที่ทุกคนข้าม

หน้าตาปลอมได้ด้วยเชเดอร์ที่ดี แต่พฤติกรรมปลอมไม่ได้ การลอยและจมที่น่าเชื่อต้องมีการประมาณปริมาตรแบบเรียลไทม์ และโซลเวอร์ที่เสถียร ซึ่งยากจริง ๆ ระบบส่วนใหญ่จึงปล่อยพรีแฟบเรือแล้วหยุด

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

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

จะได้ใช้เมื่อไร?

อยู่ระหว่างการพัฒนาในฐานะส่วนขยายของ Unreal Engine พร้อมการปล่อยเป็นขั้น พรีวิวการลอยแบบคิเนแมติกจะมาก่อน โซลเวอร์ฟิสิกส์เต็ม เพื่อให้ฉากถูกเติมได้เร็ว เราไม่ประกาศวันที่ ภาพอ้างอิงเป็นผู้ตัดสินว่าเสร็จเมื่อไร

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

ชุดเครื่องมือที่มันจะออกมาข้าง ๆ (scatter, mesh blending, grids, การวัด) ทดลองใช้ฟรีได้วันนี้ ถ้าคุณอยากได้รับแจ้งทันทีที่มี บิลด์น้ำสาธารณะ Discord ที่ลิงก์จากเว็บไซต์คือที่ที่จะประกาศเป็นที่แรก และที่ที่จะโพสต์การเปรียบเทียบผ่าน/ไม่ผ่านของภาพอ้างอิง เมื่อมันเกิดขึ้น

มินิ FAQ

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

เอนจินเวอร์ชันไหน? เวอร์ชัน Unreal Engine 5 ปัจจุบัน รายละเอียดจะลงบนโรดแมปเมื่อส่วนขยายเข้าใกล้บิลด์สาธารณะ แทนที่จะสัญญา ตอนนี้แล้วแก้ทีหลัง

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

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