在補充(23)元件列表中,與物理模擬相關的元件包括:
# | 物件名稱 | 中文名稱 | 功能說明 |
---|---|---|---|
38 | CollisionComponent | 碰撞偵測元件 | 偵測兩個物理模擬本體是否接觸 |
39 | PhysicsBodyComponent | 物理本體元件 | 要加入物理模擬的個體 |
40 | PhysicsMotionComponent | 物理運動元件 | 用程式手動控制運動與旋轉速度 |
41 | ForceEffectComponent | 力場元件 | 提供物理力場模擬效果 |
42 | ParticleEmitterComponent | 粒子噴射元件 | 產生粒子系統特效 |
43 | PhysicsJointsComponent | 物理關節元件 | 加入關節模擬 |
44 | PhysicsSimulationComponent | 客製化物理模擬元件 | 調整物理系統的參數(如重力加速度) |
其中,碰撞偵測元件(CollisionComponent)與物理本體元件(PhysicsBodyComponent)為必要元件,運動元件(PhysicsMotionComponent)用來配合可動主體(kinematic),由程式控制運動速度與旋轉速度。
本節先來了解這三個元件所帶的屬性與方法,以熟悉物理模擬的基本功能。這三個元件分別對應模型個體的三個屬性:
就像之前(如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)]))
這些元件附帶的屬性大多有預設值,從預設值可以了解預設的物理屬性,對進一步寫物理模擬程式相當重要。
以下分別列出這三個元件的屬性與預設值。