在補充(23)元件列表中,與物理模擬相關的元件包括:

# 物件名稱 中文名稱 功能說明
38 CollisionComponent 碰撞偵測元件 偵測兩個物理模擬本體是否接觸
39 PhysicsBodyComponent 物理本體元件 要加入物理模擬的個體
40 PhysicsMotionComponent 物理運動元件 用程式手動控制運動與旋轉速度
41 ForceEffectComponent 力場元件 提供物理力場模擬效果
42 ParticleEmitterComponent 粒子噴射元件 產生粒子系統特效
43 PhysicsJointsComponent 物理關節元件 加入關節模擬
44 PhysicsSimulationComponent 客製化物理模擬元件 調整物理系統的參數(如重力加速度)

其中,碰撞偵測元件(CollisionComponent)與物理本體元件(PhysicsBodyComponent)為必要元件,運動元件(PhysicsMotionComponent)用來配合可動主體(kinematic),由程式控制運動速度與旋轉速度。

本節先來了解這三個元件所帶的屬性與方法,以熟悉物理模擬的基本功能。這三個元件分別對應模型個體的三個屬性:

  1. 模型.physicsBody? — 物理本體元件
  2. 模型.collision? — 碰撞偵測元件
  3. 模型.physicsMotion? — 運動元件

就像之前(如6-7c)透過「模型.model?」來變更模型元件的網格(mesh)與材質(materials)一樣,這些加上 ? 的屬性都是 Optional 類型,在加入對應的元件之後才會生效。

當我們設定物理本體時,其實就是在初始化物理本體元件:

模型.physicsBody = .init(mode: .dynamic)
// 相當於:
模型.physicsBody = PhysicsBodyComponent()  // 預設為動態本體
// 或
模型.components.set(PhysicsBodyComponent())

同樣的,產出模型的碰撞外形時,也是在初始化碰撞偵測元件:

模型.generateCollisionShapes(recursive: false)
// 相當於:
模型.collision = try? await CollisionComponent(shapes: [.generateConvex(from: 模型.model!.mesh)])
// 或
try? await 模型.components.set(CollisionComponent(shapes: [.generateConvex(from: 模型.model!.mesh)]))

這些元件附帶的屬性大多有預設值,從預設值可以了解預設的物理屬性,對進一步寫物理模擬程式相當重要。

以下分別列出這三個元件的屬性與預設值。

PhysicsBodyComponent (模型.physicsBody?)預設屬性