การกระแทกฟิสิกส์
ฟิสิกส์ร่างกายที่มีความเข้มงวดที่เป็นมิตรหลายหลักและห้องสมุดตรวจจับการชนกัน เหมาะสำหรับเกมและแอพพลิเคชั่น VR ใช้โดย Horizon Forbidden West
|
|---|
| วิดีโอ YouTube ที่แสดงกอง ragdoll จำลองด้วยฟิสิกส์ Jolt |
สำหรับการสาธิตและวิดีโอเพิ่มเติมไปที่ส่วนตัวอย่าง
ข้อควรพิจารณาในการออกแบบ
ทำไมต้องสร้างเครื่องยนต์ฟิสิกส์อื่น? ประการแรกมันเป็นโครงการการเรียนรู้ส่วนตัว ประการที่สองฉันต้องการแก้ไขปัญหาบางอย่างที่ฉันมีกับเอ็นจิ้นฟิสิกส์ที่มีอยู่:
- เกมทำมากกว่าการจำลองฟิสิกส์ สิ่งเหล่านี้เกิดขึ้นในหลายเธรด เราเน้นการเข้าถึงข้อมูลฟิสิกส์พร้อมกันนอกการอัปเดตการจำลองหลัก:
- ส่วนของการจำลองสามารถโหลด / ขนถ่ายในพื้นหลัง เราเตรียมชุดฟิสิกส์เป็นชุดบนด้ายพื้นหลังโดยไม่ล็อคหรือส่งผลกระทบต่อการจำลอง เราแทรกชุดลงในการจำลองด้วยผลกระทบน้อยที่สุดต่อประสิทธิภาพ
- การสืบค้นการชนสามารถเรียกใช้ขนานกับการเพิ่ม / ลบหรืออัปเดตร่างกาย หากการเปลี่ยนแปลงของร่างกายเกิดขึ้นในเธรดเดียวกันการเปลี่ยนแปลงจะปรากฏขึ้นทันที หากการเปลี่ยนแปลงเกิดขึ้นในเธรดอื่นแบบสอบถามจะเห็นความสอดคล้องก่อนหรือหลังสถานะ อีกทางเลือกหนึ่งคือการมีเวอร์ชันอ่านและเขียนของโลก สิ่งนี้จะป้องกันการเปลี่ยนแปลงจากการมองเห็นได้ทันทีดังนั้นเราจึงหลีกเลี่ยงสิ่งนี้
- การสืบค้นการชนสามารถทำงานขนานกับการจำลองฟิสิกส์หลัก เราทำการตรวจสอบหยาบ (แบบสอบถามเฟสกว้าง) ก่อนขั้นตอนการจำลองและทำการตรวจสอบที่ดี (แบบสอบถามเฟสแคบ) ในพื้นหลัง ด้วยวิธีนี้กระบวนการทำงานที่ยาวนาน (เช่นการสร้างตาข่ายนำทาง) สามารถกระจายออกไปในหลายเฟรม
- การปลุกร่างกายโดยไม่ตั้งใจทำให้เกิดปัญหาด้านประสิทธิภาพเมื่อโหลด / ขนถ่ายเนื้อหา ดังนั้นร่างกายจะไม่ตื่นขึ้นมาโดยอัตโนมัติเมื่อสร้างขึ้น ร่างกายที่อยู่ใกล้เคียงจะไม่ตื่นขึ้นมาเมื่อร่างกายถูกลบออก สิ่งนี้สามารถเรียกใช้ด้วยตนเองได้หากต้องการ
- การจำลองทำงานอย่างกำหนด คุณสามารถจำลองการจำลองไปยังไคลเอนต์ระยะไกลได้เพียงแค่จำลองอินพุตไปยังการจำลอง อ่านส่วนการจำลองที่กำหนดขึ้นเพื่อทำความเข้าใจขีด จำกัด
- เราพยายามจำลองพฤติกรรมของร่างกายที่เข้มงวดในโลกแห่งความเป็นจริง แต่ทำการประมาณ ดังนั้นห้องสมุดนี้ควรใช้เป็นหลักสำหรับเกมหรือการจำลอง VR
คุณสมบัติ
- การจำลองร่างที่แข็งของรูปร่างต่าง ๆ โดยใช้การตรวจจับการชนกันอย่างต่อเนื่อง:
- ทรงกลม
- กล่อง
- แคปซูล
- เรียว
- กระบอกสูบ
- เครื่องสูบบุหรี่
- นูน
- เครื่องบิน
- สารประกอบ
- ตาข่าย (สามเหลี่ยม)
- ภูมิประเทศ (สนามสูง)
- การจำลองข้อ จำกัด ระหว่างร่างกาย:
- ที่ตายตัว
- จุด
- ระยะทาง (รวมถึงสปริง)
- บานพับ
- ตัวเลื่อน (เรียกอีกอย่างว่าปริซึม)
- กรวย
- ชั้นวางและปีกนก
- เกียร์
- ลูกรอก
- เส้นทางเส้นโค้งที่ราบรื่น
- Swing-Twist (สำหรับไหล่มนุษย์)
- 6 DOF
- มอเตอร์เพื่อขับเคลื่อนข้อ จำกัด
- การตรวจจับการชน:
- การหล่อรังสี
- การทดสอบรูปร่างเทียบกับรูปร่าง
- หล่อรูปร่างกับรูปร่างอื่น
- BroadPhase ทดสอบเฉพาะเพื่อกำหนดวัตถุใดที่อาจตัดกัน
- เซ็นเซอร์ (ปริมาณทริกเกอร์)
- Ragdolls ภาพเคลื่อนไหว:
- การคีย์แข็ง (จลนศาสตร์เท่านั้นร่างกายที่แข็ง)
- soft keying (การตั้งค่าความเร็วในร่างกายที่แข็งตัวแบบไดนามิก)
- ขับมอเตอร์ จำกัด ไปยังท่าทางเคลื่อนไหว
- การทำแผนที่รายละเอียดสูง (แอนิเมชั่น) โครงกระดูกลงบนโครงกระดูกรายละเอียดต่ำ (ragdoll) โครงกระดูกและในทางกลับกัน
- การจำลองตัวละครเกม (แคปซูล)
- ตัวละครร่างกายแข็ง เคลื่อนไหวระหว่างการจำลองฟิสิกส์ ตัวเลือกที่ถูกที่สุดและการตอบสนองการชนที่แม่นยำที่สุดระหว่างตัวละครและร่างกายแบบไดนามิก
- ตัวละครเสมือนจริง ไม่มีร่างกายที่แข็งในการจำลอง แต่จำลองหนึ่งโดยใช้การตรวจสอบการชน อัปเดตนอกการอัปเดตฟิสิกส์เพื่อการควบคุมเพิ่มเติม การมีปฏิสัมพันธ์ที่แม่นยำน้อยลงกับร่างกายแบบไดนามิก
- ยานพาหนะ
- ยานพาหนะล้อ
- ยานพาหนะติดตาม
- มอเตอร์ไซค์
- การจำลองร่างกายที่อ่อนนุ่ม (เช่นลูกบอลอ่อนหรือผ้า)
- ข้อ จำกัด ของขอบ
- ข้อ จำกัด ของ Dihedral Bend
- ข้อ จำกัด ปริมาณ Tetrahedron
- ข้อ จำกัด ของสิ่งที่แนบมาระยะยาว (เรียกอีกอย่างว่า Tethers)
- การ จำกัด การจำลองให้อยู่ในช่วงของจุดสุดยอดที่มีผิวหนัง
- ความดันภายใน
- การปะทะกันกับร่างกายที่มีความแข็งแกร่งจำลอง
- การทดสอบการชนกับร่างกายที่อ่อนนุ่ม
- การคำนวณการลอยน้ำ
- โหมดความแม่นยำสองเท่าเสริมที่ช่วยให้โลกใหญ่
แพลตฟอร์มที่รองรับ
- Windows (เดสก์ท็อปหรือ UWP) x86/x64/arm32/arm64
- Linux (ทดสอบบน Ubuntu) x64/arm64
- FreeBSD
- Android x86/x64/arm32/arm64
- แพลตฟอร์มสีน้ำเงิน (คอนโซลเกมยอดนิยม) x64
- macos x64/arm64
- iOS x64/arm64
- MSYS2 MINGW64
- WebAssembly ดูโครงการแยกต่างหากนี้
คุณสมบัติ CPU ที่จำเป็น
- บน x86/x64 ข้อกำหนดขั้นต่ำคือ SSE2 ห้องสมุดสามารถรวบรวมได้โดยใช้ SSE4.1, SSE4.2, AVX, AVX2 หรือ AVX512
- บน ARM64 ห้องสมุดใช้นีออนและ FP16 บน ARM32 สามารถรวบรวมได้โดยไม่มีคำแนะนำ CPU พิเศษใด ๆ
เอกสาร
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Jolt ไปที่สถาปัตยกรรมล่าสุดและเอกสาร API นอกจากนี้ยังมีเอกสารประกอบสำหรับการเปิดตัวเฉพาะ
ในการเริ่มต้นให้ดูตัวอย่าง HelloWorld ตัวอย่าง HelloWorld ที่ใช้ CMake FetchContent ยังมีให้เพื่อแสดงให้เห็นว่าคุณสามารถรวมฟิสิกส์ Jolt ในโครงการ CMake ได้อย่างไร
อัลกอริทึมบางอย่างที่ใช้โดย Jolt อธิบายไว้ในรายละเอียดใน GDC 2022 Talk ของฉัน: สถาปัตยกรรม Jolt Physics สำหรับ 'Horizon Forbidden West' (สไลด์, สไลด์พร้อมบันทึกลำโพง, วิดีโอ)
การรวบรวม
- รวบรวมด้วย Visual Studio 2019+, Clang 10+ หรือ GCC 9+
- ใช้ C ++ 17
- ขึ้นอยู่กับไลบรารีเทมเพลตมาตรฐานเท่านั้น
- ไม่ได้ใช้ RTTI
- ไม่ได้ใช้ข้อยกเว้น
หากคุณต้องการทำงานบนแพลตฟอร์มสีน้ำเงินคุณจะต้องจัดหาสภาพแวดล้อมการสร้างและ platformblue.h ของคุณเองเนื่องจากข้อกำหนดของ NDA ไฟล์นี้มีอยู่ในฟอรัมนักพัฒนาแพลตฟอร์ม Blue
สำหรับคำแนะนำในการสร้างไปที่ส่วนงานสร้าง เมื่ออัพเกรดจากไลบรารีรุ่นเก่าไปที่บันทึกการเปิดตัวหรือการเปลี่ยนแปลง API
ผลงาน
หากคุณสนใจว่า Jolt จะปรับขนาดด้วยซีพียูหลายตัวและเปรียบเทียบกับเครื่องยนต์ฟิสิกส์อื่น ๆ ให้ดูที่เอกสารนี้
โครงสร้างโฟลเดอร์
- สินทรัพย์ - โฟลเดอร์นี้มีสินทรัพย์ที่ใช้โดย TestFramework ตัวอย่างและ JoltViewer
- Build - มีทุกสิ่งที่จำเป็นในการสร้างห้องสมุดดูส่วนงานสร้าง
- เอกสาร - มีเอกสารประกอบสำหรับห้องสมุด
- HelloWorld - แอปพลิเคชั่นง่าย ๆ แสดงให้เห็นถึงวิธีการใช้ห้องสมุดฟิสิกส์ Jolt
- Jolt - ซอร์สโค้ดทั้งหมดสำหรับไลบรารีอยู่ในโฟลเดอร์นี้
- JoltViewer - เป็นไปได้ที่จะบันทึกเอาต์พุตของเอ็นจิ้นฟิสิกส์โดยใช้คลาส debuGrendererRecorder (ไฟล์. jor) โฟลเดอร์นี้มีซอร์สโค้ดไปยังแอปพลิเคชันที่สามารถมองเห็นการบันทึก สิ่งนี้มีประโยชน์สำหรับการแสดงภาพผลลัพธ์ของ performancetest จากแพลตฟอร์มที่แตกต่างกัน ปัจจุบันมีอยู่ใน Windows เท่านั้น
- PerformAncetest - มีแอปพลิเคชันง่าย ๆ ที่เรียกใช้การทดสอบประสิทธิภาพและรวบรวมข้อมูลเวลา
- ตัวอย่าง - สิ่งนี้มีแอปพลิเคชันตัวอย่างดูส่วนตัวอย่าง ปัจจุบันมีอยู่ใน Windows เท่านั้น
- TestFramework - กรอบการเรนเดอร์เพื่อให้เห็นภาพผลลัพธ์ของเครื่องยนต์ฟิสิกส์ ใช้โดยตัวอย่างและ Joltviewer ปัจจุบันมีอยู่ใน Windows เท่านั้น
- Unittests - ชุดการทดสอบหน่วยเพื่อตรวจสอบพฤติกรรมของเครื่องยนต์ฟิสิกส์
- WebIncludes - ทรัพยากร JavaScript จำนวนหนึ่งที่ใช้โดยกรอบการทำโปรไฟล์ภายในของเครื่องยนต์ฟิสิกส์
การผูกสำหรับภาษาอื่น ๆ
- C ที่นี่และที่นี่
- C#
- ชวา
- จาวาสคริปต์
- ซิก
การบูรณาการในเครื่องยนต์อื่น ๆ
ดูรายการโครงการที่ใช้ฟิสิกส์ Jolt ที่นี่
ใบอนุญาต
โครงการจัดจำหน่ายภายใต้ใบอนุญาต MIT
ผลงาน
ยินดีต้อนรับการมีส่วนร่วมทั้งหมด! หากคุณตั้งใจจะทำการเปลี่ยนแปลงที่ใหญ่ขึ้นโปรดหารือก่อนในส่วนการสนทนาของ GitHub สำหรับการเปลี่ยนแปลงที่ไม่สำคัญเราต้องการให้คุณตกลงกับข้อตกลงผู้สนับสนุน เมื่อคุณสร้าง PR ผู้ช่วย CLA จะแจ้งให้คุณลงนาม