Simulator Scene in Unity3D – Collider and Rigidbody 3D version (Section 1)

簡介

假如模擬場景中需要模擬真實世界的物理效果,在Unity中提供了基礎物件的碰撞、物理效果、重量與重力效果,本篇章就先講講這一塊的使用方式。

Rigidbody

在講解使用Collider之前必須要先講到Rigidbody(剛體), 剛體能讓你的遊戲物件被物理引擎所控制,所有遊戲物件必須包含剛體元件來實現重力、通過指令碼施加運動加速度、或者與其他物件進行互動,這一切都通過NVIDIA的PhysX物理引擎來實現 。我們在弄剛體前先檢查一下Unity Editor的Edit->Project Setting->Physical,看看你的重力(Gravity)設定值是否為-9.81(假如你場景是要做月球或外太空就可以設定其他的值)。

此章節我們先講3D空間的Rigidbody與Collider,之後有講到2D Game相關的功能在來說說2D Collider與2D Rigidbody。在 3D GameObject加入Rigidbody的元件(Component,這詞很常用可以記起來)如下圖。

加入完之後我們會看到如下圖的Rigidbody的一些參數,這邊我們來做個個參數的講解。

Mass : 這個值是你要設定物件的重量(質量),單位是公斤kg。

Drag : 空氣阻力,為0表示沒有阻力,infinity表示立即停止移動 ,有時候會用程式去控制風量與rigibody這個值去最對應 。

Angular Drag : 扭力的阻力, 0表示沒有阻力,infinity表示立即停止移動 。

Use Gravity : 是否要使用重力(會連結到Setting中的數值)。

Is Kinematic : 勾選這個選項會使遊戲物件不受物理引擎的影響,但這不等同於沒有剛體元件。這通常用於需要用動畫控制的剛體例如人體的骨架,這樣就不會因為慣性而影響動畫了。

Interpolate : 這個選項的使用時機是在當你的物件在運動的時候,假如有出現抖動的情況,可以將此區的選項開啟,None(無差值) 就是不使用的意思,Interpolate(差值):根據上一幀來平滑移動, Extrapolate(推算):根據推算下一幀物體的位置來平滑移動。這個值是蠻好用的。

Collision Detection : 用於防止快速移動的物體穿過其他物體而不會檢測到碰撞 有四種方式,下方有項目的偵測對照表。Discrete(離散碰撞),此值是預設值,普通的碰撞偵測。 Continuous(連續),勾選了這選項會比較耗資源,因為它會跟Mesh Collider做反覆的連續偵測 ,當這個剛體與其他普通鋼體碰撞時仍使用Discrete偵測,但是與沒有設定剛體的Mesh Collider碰裝時就會使用到連續檢測了。 Continuous Dynamic(動態連續),假如自身有設定此參數而預碰裝的物體也設定此參數,兩者之間的偵測才會使用連續動態偵測,而他對沒設定剛體的Mesh Collider物件也是會使用Continuous偵測,其餘的鋼體適用離散偵測,小結是假如是有高速碰撞的物體都設定為此值較好。

Constrains : 限制剛體的物理運動,這邊有限制物件的位置與旋轉。Freeze Position可以限制物體的x,y,z位移,Freeze Rotation可限制物體x,y,z的旋轉,假如想設定物件只想沿著x軸旋轉運動的話就把y,z Freeze Rotation。

Collider

Collider(碰撞器),在模擬物理環境的碰撞必須物體要附加Rigidbody,系統才會計算物理碰撞的效果。假如都只將物件掛載Collider元件並不會有物理的運算效果,值得議題的是,可以透過程式來偵測兩物件是否有接觸碰撞到,但前提是要把被碰撞物(程式要掛載在此物體)的Is Trigger打勾。我們在未來講解到有關程式偵測碰撞時在詳述。
那3D Collider有哪些種類呢?新增方式是Add Component->Physics->如下圖 :

All Collider Same Parameters
Is Trigger : 打勾的話可以使用程式觸發 ColliderOnTrigger程式,但是假如這個選項打勾的話則不會產生碰撞物理效果,例如A物件掛載了Collider+Rigidbody,B物件掛載了Collider,假如A或B其中一個Collider IsTrigger打勾則會穿透。
Material : 這裡的Material不是材質類的Material,而是物理系數的Physics Material,如下圖一,透過Create->Add Physics Material

下圖是Physics Material細部參數,Dynamic Friction(動態摩擦力)是在物體移動情況下的摩擦力,數值介於0-1之間,0就沒摩擦力,就像在冰上一樣的滑,1的話動態物件會快速停止。Static Friction(靜態摩擦力),是在物體靜止情況下的摩擦力,數值與Dynamic Friction相同。Bounciness(物體表面的彈跳係數),數值介於0-1,0就不會彈,1就會一直彈。Friction Combine(摩擦係數複合)與Bounce Combine(彈跳係數複合),這兩參數選項都相同,只是復合的項目是摩擦力與彈跳係數。Average是兩個物體的平均值,Min & Max是取兩個物體數值的最小與最大值,Multiple是兩物體的數值相乘。

最後是要講共同參數的Collider大小範圍控制,有兩個方法調整Collider的大小跟位置,先講位置,Center的XYZ是控制碰撞器對於附加物件的中心點的位置,Size是等比縮放控制區,數值的大小會隨著Center的點來等比縮放XYZ大小。而此元件提供了可以隨機編輯碰撞器的大小,如下圖一Edit Collider功能按鈕,點下後可以看下圖二。可以點選在Scene視窗中Collider的面點進行拖拉編輯大小。

上述所說的都是3D Collider中的共同參數,下方就來分別講一下不同元件特別的參數。
Box Collider : 所有功能同上方。
Capsule Collider :膠囊狀的碰撞器,這邊與上述不同的是大小的設定。Radius碰撞器的半徑大小,如下圖,Height是膠囊碰撞器的高度,而Direction是控制要往哪一個軸向來調整Size。

Mesh Collider :Convex是“網格碰撞器”將與其他“網格碰撞器”碰撞。凸網格碰撞器限制為255個三角形。 Mesh就是你自己Import的Model的網格。
Cooking Option選項啟用或禁用影響物理引擎處理網格的方式的Mesh Cooking選項,’ˇMesh Collider無法手動調整,只能使用這選項並搭配Import Setting來使用,要注意的是盡量不要用剛剛的Convex,會影響遊戲效能。要怎麼產生自己模型的Mesh Cooking?如下圖,在你Import的Model檔案中的Import Setting->Generator Collider。
None:不啟用。
Everything:全部啟用。
Cook for Faster Simulation:最優化效果的選項。
Enable Mesh Clean: 清除多餘或無效的三角面使碰撞更準確。
Weld Colocated Vertices: 啟用後會合併相同位置的頂點。
Mesh Cooking選項預設會將後三個默認開啟,確保Mesh Cooking效果最好。
另外值得一提的是假如你的模型不想顯像但是需要該模型的Mesh碰撞器的話可以把Import Setting的Normal改選None節省資源。

Sphere Collider :圓形的碰撞器,調整大小的參數是Radius(調整碰撞器半徑)。
Terrain Collider :地形碰撞器可以參照這篇有提到。

小結

這篇我們先講到這,在Unity環境中想要製作物力與碰撞效果請務必要使用此API,而第二篇我們再來講到實作Collider+Rigidbody的排列組合,看看怎樣搭配才會有不同的物理碰撞種類。

Reference: https://docs.unity3d.com/Manual/class-Rigidbody.html
https://docs.unity3d.com/Manual/class-PhysicMaterial.html
https://connect.unity.com/p/peng-zhuang-qi

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *