【Unity】Obi外掛系列(三)—— Collisions

CtronicHikari2發表於2020-11-14

Collisions

在這裡插入圖片描述

  • 布料與地形和一些箱子碰撞。

  • 大多數時候,我們會希望粒子能夠與場景中的其他元素碰撞並做出反應:牆壁、地板、箱子什麼的。它們也可以互相碰撞。這兩種型別的碰撞(對碰撞器和對其他粒子)可以在Obi中獨立控制。本節中的所有內容都適用於所有Obi actors(布、繩索、流體發射器等)。

設定碰撞器

  • 將Obi Collider元件新增到場景中的任何碰撞器中,使其與Obi一起工作。你可以將這個元件新增到SphereColliders、MeshColliders、BoxColliders…幾乎所有標準的Unity colliders,包括3D和2D。Obi目前唯一不支援的碰撞器型別是Polygon Collider 2D。
  • 在每個模擬步驟開始時,solvers將根據什麼colliders在空間上接近它們,為其所有粒子生成碰撞約束。
  • 有時想讓某些actors,甚至只有一些特定的粒子忽略某個特定的colliders。你可以使用phases來實現這一點。每個ObiCollider都有一個 "Collision phases "屬性,而粒子有一個 "phases "通道,你可以使用blueprint編輯器來設定。只有不同phases的colliders和粒子才會發生碰撞。同一phases的colliders和粒子將互相忽略。預設情況下,ObiColliders處於相位0,而粒子處於相位1,所以它們會立即發生碰撞。
    在這裡插入圖片描述
  • Obi Colliders還允許你設定它們的碰撞材料和厚度。正的厚度值會在對撞機表面和碰撞粒子之間留下一個間隙。負值將導致粒子在實際撞擊其表面之前 "沉入 "colliders。
    在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述
  • 繩索顆粒與立方體碰撞,從上到下:厚度=0.1,厚度=0,厚度=-0.05。
  • 請注意,Obi Collider的厚度引數與Unity colliders的contact Offset無關。你可以使用這兩個引數來獨立調整與Obi actors的碰撞和與其他Collider的碰撞。

Rigidbodies

  • 當你將一個Obi Collider元件新增到一個物件中時,它將尋找其層次結構中的第一個Rigidbody元件,並將一個Obi Rigidbody元件附加到它上面。這個元件允許Obi粒子與剛體互動。如果你刪除了這個元件,Obi會在你下次點選 "播放 "時自動重新建立它。在這裡插入圖片描述
  • Obi Rigidbody只有一個引數。“Kinematic for particles”. 啟用這個引數可以使剛體免受粒子施加的任何力的影響,所以它的行為就像場景中沒有Obi粒子存在一樣。但粒子仍然會 "感覺 "到剛體並與之碰撞。

Intercollisions

  • 如果它們的粒子具有不同的phases,那麼Obi Actors會相互碰撞,只要它們是由同一個Obi Solver模擬的。不同Solver模擬的粒子不能相互作用,這意味著不同Solver中的角色不能相互碰撞。
  • 例如:如果希望A布和B布互相碰撞,就把A布的粒子設定為第2phases,B布的粒子設定為第3phases(或者除了2以外的任何其他相!)。

Self collisions

  • 要使一個actors與自己發生碰撞,只需在其inspector中啟用 "自我碰撞 "核取方塊。

Collision constraints

  • 一旦你設定了碰撞,你的Solver將開始為粒子生成碰撞約束。Obi使用了一種被稱為 "推測性接觸 "的碰撞檢測正規化,這意味著在粒子之間或Collider和粒子之間發生任何實際碰撞之前,就可以生成接觸約束。多虧了這一點,碰撞在實際發生之前就被計算在內,而隧道問題(大多數碰撞引擎中存在的眾所周知的子彈紙問題)幾乎不存在。即使在高速下,也能檢測和解決接觸問題。此外,如果幾個碰撞發生在同一幀中,則不需要TOI(影響時間)排序。
  • 一個給定的粒子在同一幀中可以產生幾個接觸。然後,推測的接觸必須被計算在內,如果它們變成實際的碰撞,則必須被解決。然而,按順序解析接觸點(一個接一個)會不幸地導致之前解析的接觸點再次成為碰撞。請看下圖。在步驟1中,產生了兩個推測性接觸,因為根據橙色粒子的當前速度,幾乎可以肯定它將在下一幀中與灰色對撞機發生碰撞。在步驟2中,兩個推測性接觸都發展為必須解決的實際碰撞。第3步顯示瞭如何先解析右邊的碰撞。在步驟4中,我們解決左邊的碰撞,但這又會導致右邊的碰撞被穿透。我們必須第二次解決右邊的碰撞(步驟5),以確保任何一個接觸都不會發生穿透。在這裡插入圖片描述
  • 所有這些向右、向左、向右、向左…的迭代求解都會造成視覺上的抖動,因為我們看到粒子在兩個配置之間跳動,直到所有的碰撞都被解決(這可能需要很高的迭代量)。出於這個原因,Obi讓你決定(就像它對所有約束組一樣)必須如何解決碰撞:順序或並行。在並行模式下,所有的接觸都在同一步驟中獨立地解決(就像其他接觸不存在一樣),並且最終的修正是作為其所有單獨結果的平均值計算的。這增加了穩定性(消除了由於未解析的碰撞造成的抖動),但降低了收斂速度(實現零穿透需要更多的迭代),使得在使用低迭代次數時碰撞顯得過於 “軟”。見下圖。在這裡插入圖片描述
  • 一般的經驗法則:如果在你的場景中同時發生多個碰撞,並且產生抖動問題,那麼將碰撞約束評估順序設定為 “並行”。如果抖動不是問題和/或你需要更快的收斂,則使用 "順序 "評估順序。對於粒子-粒子碰撞和粒子-碰撞器碰撞有單獨的控制,所以你可以對它們各自使用不同的方法。你可以在ObiSolver檢查器中的 "Particle Collision Constraint Parameters "和 "Collision Constraint Parameters "下找到這個設定。在這裡插入圖片描述
  • 請參閱ObiSolver瞭解更多關於順序解(sequential)和並行解(parallel)的資訊。在這裡插入圖片描述

Collision materials

  • 一旦一個碰撞約束不再是一個推測性的接觸,而變成了一個實際的接觸(兩個物體真的相互接觸),碰撞必須以某種方式解決。如何解決取決於你的粒子和Collision使用的是什麼ObiCollisionMaterials。所有Obi Actors(布、繩索等)都有一個 "材料 "屬性,讓你指定該Actors的所有粒子將使用哪種ObiCollisionMaterial。你也可以將碰撞材料分配給ObiColliders。
  • ObiCollisionMaterials是assets,就像Unity的PhysicMaterials一樣。你可以在你的專案資料夾中右擊,然後選擇建立–>Obi–>ObiCollisionMaterial。這裡是材質inspector。在這裡插入圖片描述
    動摩擦力Dynamic friction:在碰撞中,一旦超過靜摩擦力閾值,粒子相對於表面運動時,相對切向速度消失的百分比。0表示事物會像冰做的一樣滑動,1則會導致切向速度完全喪失。
    靜摩擦力Static friction:碰撞中相對切向速度被消除的百分比。0表示物體會像冰塊一樣滑動,1表示切向速度完全喪失。
    粘性Stickiness:碰撞中物體之間施加的內向法向力的大小。0表示不會施加任何力,1表示物體碰撞後會保持不分離。
    粘性距離Stick distance:物體之間施加粘性力的最大距離。應儘量保持小。
    摩擦力聯合體Friction combine: 當參與碰撞的物體具有不同的係數時,摩擦係數如何計算。
    粘性聯合Stickiness combine:當參與碰撞的物體具有不同的係數時,如何計算粘性係數。
    滾動接觸Rolling contacts: 啟用此功能,以執行包括角速度在內的完整接觸解析度(參見下一節)。
    滾動摩擦Rolling friction: 在滾動接觸過程中,施加的滾動阻力量(見下節)。在0和0.1之間的值是最有用的。在這裡插入圖片描述
  • 在上圖中,紅色箭頭代表粒子在碰撞時的速度,這個速度分為兩個部分:一個沿接觸法線,一個沿接觸切線。藍色箭頭代表施加在粒子上的力,以抵消其法線速度,它總是完全施加。紫色箭頭是摩擦力,它能消除切向速度分量的一定比例(在影像中,100%)。綠色箭頭是粘性力。在這裡插入圖片描述
  • 重球落在一塊很粘的布上。
  • Rolling contacts
  • 常規接觸(包括粒子-粒子和粒子-碰撞器)將粒子視為空間中的簡單位置,因此它們不會導致粒子旋轉。這種簡化允許非常廉價的碰撞響應,因為只考慮線性速度。然而,可以選擇通過在接觸材料中啟用滾動接觸來執行考慮到角速度和粒子方向的全接觸解析度。
  • 當兩個接觸材料不同的物體發生碰撞時,如果其中一個接觸材料有滾動接觸,則使用全滾動接觸方程。
  • 使用滾動觸點只對利用粒子方向的actors有意義。ObiEmitter(發射顆粒時)和ObiRod。它們與ObiSoftbody不相容,與ObiCloth和ObiRope一起使用時也不會有明顯的效果。
  • 各向異性(非球形)顆粒使用簡化的接觸點計算演算法,當與滾動接觸一起使用時,不會施加精確的扭矩。出於這個原因,就滾動接觸而言,各向異性顆粒的行為就像完全球形一樣。
  • 常規接觸:角速度/方向被忽略。在這裡插入圖片描述
  • 滾動接觸:利用角速度/方向。在這裡插入圖片描述
  • 如果您啟用了碰撞材料的滾動接觸,將出現一個新的引數 “滾動摩擦”。滾動摩擦力的作用是通過施加一個與參與接觸的粒子的角速度相反的扭矩。在現實生活中,完全球形的粒子在傾斜的平面上永遠不會停止滾動。然而,表面不規則的粒子(如岩石或鵝卵石)會在一段時間後停止滾動,因為它們的表面不平整。這就是滾動摩擦力所要模擬的。
  • 動圖:http://obi.virtualmethodstudio.com/images/tutorial3/rolling_friction.gif
  • 衝擊傳播
  • 衝擊傳播是一種在接觸解析過程中內部改變粒子質量的技術,因此堆積底部的粒子比頂部的粒子具有更高的有效質量。這將導致更快的收斂和更穩定的堆積。你可以在ObiSolver inspector中找到這個引數(Shock propagation),它是全域性性地應用於每個slover。當你需要為你的粒子-粒子接觸提供額外的 "動力 "時,請使用這個引數,特別是在建立顆粒材料堆時。

相關文章