震動物理
多核友好的剛性身體物理和碰撞檢測庫。適用於遊戲和VR應用程序。 Horizon禁止西部使用。
|
|---|
| YouTube視頻顯示了用震動物理模擬的Ragdoll樁。 |
有關更多演示和視頻,請轉到“樣本”部分。
設計注意事項
為什麼要創建另一個物理引擎?首先,這是一個個人學習項目。其次,我想解決現有物理引擎遇到的一些問題:
- 遊戲所做的不僅僅是模擬物理學。這些事情發生在多個線程中。我們強調在主要模擬更新之外同時訪問物理數據:
- 模擬部分可以在後台加載 /卸載。我們在背景線上準備一批物理機構,而無需鎖定或影響模擬。我們將批次插入模擬中,對性能的影響最小。
- 碰撞查詢可以平行於添加 /刪除或更新車身。如果對身體的更改發生在同一線程上,則將立即看到更改。如果更改發生在另一個線程上,則查詢將在狀態之前或之後看到一致的。另一種選擇是擁有世界的讀寫版。這樣可以防止立即看到變化,因此我們避免這種情況。
- 碰撞查詢可以平行於主要物理模擬。在模擬步驟之前,我們進行了粗糙的檢查(廣泛的查詢),並在後台進行精細檢查(窄相查詢)。這樣,可以在多個幀中分散長期運行的過程(例如導航網格生成)。
- 加載 /卸載內容時,意外喚醒身體會導致性能問題。因此,創建時身體不會自動醒來。移除屍體時,鄰近的屍體不會被喚醒。如果需要,可以手動觸發。
- 模擬確定性地運行。您可以通過僅將輸入複製到仿真來將仿真複製到遠程客戶端。閱讀確定性模擬部分以了解限制。
- 我們試圖模擬現實世界中剛體的行為,但進行近似。因此,該庫應主要用於遊戲或VR模擬。
特徵
- 使用連續碰撞檢測對各種形狀的剛體模擬:
- 領域
- 盒子
- 膠囊
- 錐形膠囊
- 圓柱
- 錐形缸
- 凸船體
- 飛機
- 化合物
- 網格(三角形)
- 地形(高度場)
- 模擬身體之間的約束:
- 固定的
- 觀點
- 距離(包括彈簧)
- 合頁
- 滑塊(也稱為棱鏡)
- 錐體
- 架子和小齒輪
- 齒輪
- 滑輪
- 光滑的樣條路徑
- 扭動扭動(用於人形肩膀)
- 6 dof
- 驅動約束的電動機。
- 碰撞檢測:
- 鑄造光線。
- 測試形狀與形狀。
- 施放形狀與另一種形狀。
- Broadphase僅測試快速確定哪些對象可能相交。
- 傳感器(觸發量)。
- 動畫ragdolls:
- 硬鍵鍵(僅運動學僅剛體)。
- 軟鍵(在動態剛體上設置速度)。
- 驅動約束電動機到動畫姿勢。
- 將高細節(動畫)骨骼映射到一個低細節(Ragdoll)骨骼上,反之亦然。
- 遊戲角色模擬(膠囊)
- 僵硬的身體特徵。在物理模擬過程中移動。最便宜的選擇和最準確的角色和動態物體之間的碰撞響應。
- 虛擬字符。在模擬中沒有剛體的身體,但使用碰撞檢查模擬一個體。在物理更新之外更新以獲得更多控制。與動態體的相互作用較少。
- 車輛
- 柔軟的身體模擬(例如,軟球或一塊布)。
- 邊緣約束。
- 二面彎約束。
- 四面體體積約束。
- 遠程附件約束(也稱為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示例。也可以使用Cmake FetchContent的Helloworld示例來展示如何將震動物理集成到CMAKE項目中。
我的GDC 2022談話中詳細介紹了jolt使用的某些算法:為“ Horizon Forbidden Forbidden West”進行震撼物理學(幻燈片,帶有揚聲器筆記的幻燈片,視頻)。
編譯
- 與Visual Studio 2019+,Clang 10+或GCC 9+一起編譯。
- 使用C ++ 17。
- 僅取決於標準模板庫。
- 不使用RTTI。
- 不使用異常。
如果您想在平台藍色上運行,則由於NDA要求,需要提供自己的構建環境和PlatformBlue.h。該文件可在平台藍色開發人員論壇上找到。
對於構建說明,請轉到“構建”部分。從較舊版本的庫升級時,請轉到發行說明或API更改部分。
表現
如果您對使用多個CPU的震動縮放並與其他物理引擎進行比較感興趣,請查看此文檔。
文件夾結構
- 資產 - 此文件夾包含TestFramework,樣本和JoltViewer使用的資產。
- 構建 - 包含構建庫所需的一切,請參閱“構建”部分。
- 文檔 - 包含圖書館的文檔。
- Helloworld-一個簡單的應用程序,演示瞭如何使用Jolt Physics庫。
- JOLT-庫的所有源代碼都在此文件夾中。
- JoltViewer-可以使用debugrendererrecorder類(a .jor文件)記錄物理引擎的輸出,此文件夾將源代碼包含到可以可視化錄製的應用程序的源代碼。這對於例如從不同平台可視化performAtest的輸出很有用。目前僅在Windows上可用。
- PerformAncEtest-包含一個簡單的應用程序,該應用程序運行性能測試並收集定時信息。
- 樣本 - 其中包含樣本應用程序,請參見“樣本”部分。目前僅在Windows上可用。
- TestFramework-一個可視化物理引擎結果的渲染框架。由樣本和Joltviewer使用。目前僅在Windows上可用。
- Unitests-一組單元測試,以驗證物理引擎的行為。
- Webincludes-物理引擎內部分析框架使用的許多JavaScript資源。
其他語言的綁定
- C在這里和這裡
- C#
- 爪哇
- JavaScript
- ZIG
其他引擎集成
在此處查看使用震動物理的項目列表。
執照
該項目是根據麻省理工學院許可證分發的。
貢獻
歡迎所有貢獻!如果您打算進行更大的更改,請先在GitHub討論部分中討論。對於非平凡的變化,我們要求您同意撰寫貢獻者協議。創建PR時,CLA助手會提示您簽名。