Obi框架
- Obi是一個基於粒子的Unity物理學插件的集合。Obi的內容一切都是被稱為粒子的小球體組成。
- 粒子之間可以相互影響,通過使用約束來影響其他物體。
ObiSolver
- ObiSolver是一個執行物理模擬的組件。ObiSolver暴露了一些全局模擬參數,如重力、慣性尺度或速度阻尼。
ObiUpdater
- ObiUpdater是一個組件,可以推進一個或多個ObiSolver的模擬,使它們與Unity自己的物理引擎保持同步。Obi中包含了幾種類型的ObiUpdater,以覆蓋常見的用例,但如果你需要精確控制模擬更新周期,可以自行編寫ObiUpdater。
ObiActorBlueprint
- ObiActorBlueprint是一種asset,它存儲了一堆粒子和約束。它本身並不執行任何模擬或渲染。只是一個數據容器,與紋理或音頻文件不一樣。ObiActorBlueprint是由網格(ObiCloth和ObiSoftbody)、曲線(ObiRope)或材質定義(ObiFluid)生成的。
ObiActor
- ObiActor是在ObiSolver中實例化一個ObiActorBlueprint的組件。所有的ObiActor必須是ObiSolver的孩子。多個ObiActor可以共享同一個ObiActorBlueprint。並且可以重復使用同一個ObiActorBlueprint。ObiActor的例子有一根繩子、一面旗子、一個彈力果凍或一個噴水器。
- 每個ObiSolver都會維護幾個列表或每個粒子的屬性:位置、速度、半徑等。最初,這些列表沒有元素。每當一個新的ObiActor被添加到ObiSolver中,就會發生這些步驟。
- ObiActor要求ObiSolver根據ObiActorBlueprint的需要分配盡可能多的粒子。ObiSolver將每個粒子分配到它在其內部數組中找到的第一個空閑槽中。當從ObiSolver中移除ObiActor時,分配的粒子之間會出現空隙。正因為如此,在ObiSolver數組中,屬於同一角色的粒子可能不會相鄰。
- ObiActor會復制ObiActorBlueprint中發現的所有約束,並更新它們的粒子引用,使它們指向正確的ObiSolver陣列位置。更新ObiSolver中的活性粒子數量。
Obi具體成員
Actors
- 一塊布、一根繩子、一個流體發射器或一個軟體,它們都是Actor。所有的Actor都以一個Blueprint作為輸入。Actor將實例化Blueprint中包含的信息(粒子和約束),這樣Solver就可以對其進行模擬。可以在多個Actor之間重復使用同一個Blueprint。
- 如果想對一個Actor進行模擬,它必須是Solver的子角色。在運行時,可以修改一個Actor的父親為某一個Solver,也可以將它從當前Solver的層次結構中移除。
- 無論你要創建什么類型的Actors,進行模擬所需的步驟都非常相似:
1.生成一個適當類型的Blueprint資源,然后根據需要進行編輯。
2.創建Actor,並為其提供Blueprint。
- 可以通過進入GameObject->3DObject->Obi來創建任何Actor。
- 例如,要創建一個布的Actor,GameObject->3DObject->Obi->Obi Cloth,要創建一個繩索GameObject->3DObject->Obi->Obi Rope等等。
- 當第一次在場景中創建一個actor時,Obi會尋找一個ObiSolver組件來添加這個actor。如果它找不到合適的Solver,將自動創建一個。當創建一個Solver時,它也會自動將其添加到場景中找到的第一個 ObiFixedUpdater中。
- Actors暴露了一些參數,讓你可以修改它的行為(例如,可以改變撕布所需的力,或軟體的可塑性)。改變這些參數不會以任何方式影響原始Blueprint,只會影響由actor生成的實例。
- 對於每個Actor的Bluprint,將在后續的文章中更新。
繩索:模擬為一條粒子鏈,通過約束條件將它們連接在一起,迫使它們彼此保持一定的距離(距離約束)
布:一塊正方形的布被表示為一個二維的粒子網格,通過距離和彎曲約束連接在一起
流體發射器:生成新的粒子,排斥或吸引周圍的其他粒子,試圖保持一個恆定的密度(單位體積的質量)
流體發射器:生成新的粒子,排斥或吸引周圍的其他粒子,試圖保持一個恆定的密度(單位體積的質量)
ObiSolver
- ObiSolver組件是Obi中最重要的組件。它負責模擬粒子物理和強制約束。關於ObiSolver,要記住三個重要的事情
- ObiSolver可以被添加到場景中的任何GameObject中,並且在同一場景中可以有多個ObiSolver同時工作。
- 每個Actor都需要成為Solver的孩子,才能獲得其模擬的更新。
- 每個Solver都是完全獨立於其他Solver的。因此,被不同Solver更新的Actor不會相互影響/碰撞。只有同一Solver中的Actor才會相互影響。
- Solver總是在局部空間進行模擬。這意味着,平移、旋轉或縮放Solver將僵化地改變整個模擬。
- 但是,可以將Solver線性/旋轉運動的一定比例以慣性力的形式注入到模擬中。例如,若想控制整體角色運動對服裝模擬的影響程度。為此,Solver暴露了兩個參數來獨立控制線性和旋轉慣性力。
- Simulate when invisible //不可見時仍保持模擬
當所有攝像機都不可見時,這個Sovler是否還保持模擬?如果模擬要求需要隨時更新,則需要開啟此功能。當場景中存在多個Sovler,但這些Sovler在任何時候都不可見時,需要禁用它以提高性能。
- Mode //模式
Sovler可以在2D或3D模式下進行仿真。在二維模式下,模擬只發生在XY平面上。
2D模式通常與2D碰撞器的使用結合在一起。但是,為了方便起見,你也可以將3D碰撞器與2D模式一起使用。
- Interpolation //插值
用於渲染粒子的插值模式。None擁有最快的速度,但Interpolate會產生更多的視覺效果。
Interpolate 最適合慢鏡頭效果,它可以避免Unity的timescale<1時產生的停頓。
- Gravity //重力
在這個Sovler中施加於粒子的重力方向和大小,用Sovler的局部空間表示
- Damping //阻尼
速度阻尼應用於粒子速度。增加阻尼以減少粒子的動能。
高阻尼值對模擬水下效應很有用。低的非零值(例如0.15)可以在大多數情況下提高模擬的真實性,代替空氣的動力阻力。
- Shock propagation //沖擊傳播
值變高會人為增加支撐其他粒子的質量。可以實現更好的堆積穩定性。
- Max Anisotropy //最大各向異性
Obi中的流體粒子的形狀可以是橢圓形的,而不是完美的球形。這是為了讓它們的形狀更好地適應它們所代表的物體表面,實現更精確的碰撞檢測和更平滑的渲染。
最大各向異性可以讓你確定橢球體半徑之間的最大比例:數值為1將迫使所有粒子都是球形的(停用各向異性),數值大於1將允許粒子變得更加橢球化。
啟用各向異性(最大各向異性>1)可以極大影響流體渲染。可以在使用較低的流體分辨率時獲得更平滑的流體表面。
- Sleep threshold //睡眠閾值
任何動能低於這個值的粒子都會被凍結在原地。當你不想讓速度或力的微小變化擾亂一個粒子,使它看起來像在抖動或緩慢移動時,可以開啟這個功能。如果你想讓粒子的位置受到任何作用在它們上 的力的影響,需要把它設置為零。
- World linear inertia scale //世界線性慣性標尺
控制Sovler變換的世界空間線性慣性有多少被應用到粒子上。值范圍從0(無)到1(100%)。
移動中的Sovler包含一塊布,線性慣性標度設置為1。當解算器突然停止時,布根據慣性繼續向前移動。當解算器恢復運動時,布收到慣性向后。
- World angular inertia scale //世界角慣量表
類似於前一個屬性,但控制的是角慣性(旋轉)而不是線性慣性(平移)。注意,離心力和科里奧利力都被計算在內。
旋轉求解器中包含一塊布,角慣性刻度設為1。注意離心力如何在旋轉時將布抬起。