XPBD 物理エンジン (Extended Position Based Dynamics)
v1.2.1 の注意点: PlutoEngine は現在、最大限のパフォーマンスを引き出すために WebGPU、
InstanceBufferArena、SoA、および Flyweight pattern (Zero-Allocation) を利用しています。
PlutoEngine v1.2.1 は、従来の剛体力学(Rigid Body Dynamics)に代わり、堅牢で安定したExtended Position Based Dynamics (XPBD) ベースの2D物理エンジンを内蔵しています。すべての物理シミュレーションはSoA(Structure of Arrays)を用いてゼロアロケーションで実行されます。
XPBDの利点
XPBDは、力や加速度を積分して速度を求め、そこから位置を更新する従来のアプローチ(Force-based)とは異なります。 XPBDは**直接「位置」を制約条件に従って修正(Solve)**します。
- 無限の剛性: 従来のバネダンパモデルでは発散(爆発)してしまうような、非常に硬い制約(関節やロープ)でも安定してシミュレーション可能です。
- イテレーション非依存: サブステップの回数に依存せず、常に一定の物理的挙動を保ちます。
DODとSoAによる実装
物理演算はCPU・メモリのボトルネックになりやすい領域です。 PlutoEngineのXPBDソルバは完全にデータ指向(DOD)で設計されています。
positions,prev_positions,inverse_mass,velocitiesなどの配列をSoA形式でフラットなFloat32Arrayに保持します。- 衝突解決やジョイント制約の計算は、これらに対する単純な数学演算として連続的に実行されます。
- クラスインスタンスの生成(
new Vector2()やnew ContactPoint())はループ内で一切発生しません。完全にゼロアロケーションです。
Standalone Usage
typescript
import { XPBDSolver } from '@pluto-engine/xpbd';
const solver = new XPBDSolver();Plugin Usage (this.registerPlugin)
typescript
import { XpbdPlugin } from '@pluto-engine/xpbd';
class MyScene extends Scene {
constructor() {
super();
this.registerPlugin(new XpbdPlugin());
}
update() {
// 物理シミュレーションステップの進行 (GCフリー)
this.xpbd.step(this.arena);
}
}