Class: PhysicsSystem
Defined in: packages/core/src/physics/physics-system.ts:160
Manages a Havok simulation on either a dedicated worker or the main thread.
Per-frame commands and poses travel through a pair of transferable ArrayBuffers. Both execution modes use the same binary protocol and shared Havok runtime. Worker mode alternates ownership of transferable ArrayBuffers, avoiding both structured-clone copies and SharedArrayBuffer's cross-origin-isolation requirement. Shape creation/removal uses infrequent control messages.
Remarks
- Supports Sphere, Box, Cylinder, Capsule, ConvexHull, TriMesh, and Auto shapes.
- Synchronizes dynamic body poses and velocities back to ECS entities.
- Sends grab targets, impulses, velocity edits, damping, and gravity changes through one transport contract.
- Automatically releases bodies and shapes when entities are removed.
Extends
System<{gravity: {default: [number,number,number];type:Vec3; };interpolation: {default:true;type:Boolean; };updateFrequency: {default:number;type:Float32; };useWorker: {default:true;type:Boolean; }; }, {angularDampingOverrides: {required: (Component<{_angularVelocity: {default: [number,number,number];type:Vec3; };_engineAngularDamping: {default:number;type:Float32; };_engineBody: {default:number;type:Float64; };_engineGravityFactor: {default:number;type:Float32; };_engineLinearDamping: {default:number;type:Float32; };_engineOffset: {default:number;type:Float64; };_linearVelocity: {default: [number,number,number];type:Vec3; };angularDamping: {default:number;type:Float32; };centerOfMass: {default: [number,number,number];type:Vec3; };gravityFactor: {default:number;type:Float32; };linearDamping: {default:number;type:Float32; };state: {default:"DYNAMIC";enum: {Dynamic:"DYNAMIC";Kinematic:"KINEMATIC";Static:"STATIC"; };type:Enum; }; }> |Component<{_engineShape: {default:number;type:Float64; };density: {default:number;type:Float32; };dimensions: {default: [number,number,number];type:Vec3; };friction: {default:number;type:Float32; };restitution: {default:number;type:Float32; };shape: {default:"Auto";enum: {Auto:"Auto";Box:"Box";Capsules:"Capsules";ConvexHull:"ConvexHull";Cylinder:"Cylinder";Sphere:"Sphere";TriMesh:"TriMesh"; };type:Enum; }; }>)[];where:ValuePredicate[]; };gravityOverrides: {required: (Component<{_angularVelocity: {default: [number,number,number];type:Vec3; };_engineAngularDamping: {default:number;type:Float32; };_engineBody: {default:number;type:Float64; };_engineGravityFactor: {default:number;type:Float32; };_engineLinearDamping: {default:number;type:Float32; };_engineOffset: {default:number;type:Float64; };_linearVelocity: {default: [number,number,number];type:Vec3; };angularDamping: {default:number;type:Float32; };centerOfMass: {default: [number,number,number];type:Vec3; };gravityFactor: {default:number;type:Float32; };linearDamping: {default:number;type:Float32; };state: {default:"DYNAMIC";enum: {Dynamic:"DYNAMIC";Kinematic:"KINEMATIC";Static:"STATIC"; };type:Enum; }; }> |Component<{_engineShape: {default:number;type:Float64; };density: {default:number;type:Float32; };dimensions: {default: [number,number,number];type:Vec3; };friction: {default:number;type:Float32; };restitution: {default:number;type:Float32; };shape: {default:"Auto";enum: {Auto:"Auto";Box:"Box";Capsules:"Capsules";ConvexHull:"ConvexHull";Cylinder:"Cylinder";Sphere:"Sphere";TriMesh:"TriMesh"; };type:Enum; }; }>)[];where:ValuePredicate[]; };linearDampingOverrides: {required: (Component<{_angularVelocity: {default: [number,number,number];type:Vec3; };_engineAngularDamping: {default:number;type:Float32; };_engineBody: {default:number;type:Float64; };_engineGravityFactor: {default:number;type:Float32; };_engineLinearDamping: {default:number;type:Float32; };_engineOffset: {default:number;type:Float64; };_linearVelocity: {default: [number,number,number];type:Vec3; };angularDamping: {default:number;type:Float32; };centerOfMass: {default: [number,number,number];type:Vec3; };gravityFactor: {default:number;type:Float32; };linearDamping: {default:number;type:Float32; };state: {default:"DYNAMIC";enum: {Dynamic:"DYNAMIC";Kinematic:"KINEMATIC";Static:"STATIC"; };type:Enum; }; }> |Component<{_engineShape: {default:number;type:Float64; };density: {default:number;type:Float32; };dimensions: {default: [number,number,number];type:Vec3; };friction: {default:number;type:Float32; };restitution: {default:number;type:Float32; };shape: {default:"Auto";enum: {Auto:"Auto";Box:"Box";Capsules:"Capsules";ConvexHull:"ConvexHull";Cylinder:"Cylinder";Sphere:"Sphere";TriMesh:"TriMesh"; };type:Enum; }; }>)[];where:ValuePredicate[]; };manipluatedEntities: {required: (Component<{_angularVelocity: {default: [number,number,number];type:Vec3; };_engineAngularDamping: {default:number;type:Float32; };_engineBody: {default:number;type:Float64; };_engineGravityFactor: {default:number;type:Float32; };_engineLinearDamping: {default:number;type:Float32; };_engineOffset: {default:number;type:Float64; };_linearVelocity: {default: [number,number,number];type:Vec3; };angularDamping: {default:number;type:Float32; };centerOfMass: {default: [number,number,number];type:Vec3; };gravityFactor: {default:number;type:Float32; };linearDamping: {default:number;type:Float32; };state: {default:"DYNAMIC";enum: {Dynamic:"DYNAMIC";Kinematic:"KINEMATIC";Static:"STATIC"; };type:Enum; }; }> |Component<{angularVelocity: {default: [number,number,number];type:Vec3; };force: {default: [number,number,number];type:Vec3; };linearVelocity: {default: [number,number,number];type:Vec3; }; }>)[];where:ValuePredicate[]; };physicsEntities: {required: (Component<{_angularVelocity: {default: [number,number,number];type:Vec3; };_engineAngularDamping: {default:number;type:Float32; };_engineBody: {default:number;type:Float64; };_engineGravityFactor: {default:number;type:Float32; };_engineLinearDamping: {default:number;type:Float32; };_engineOffset: {default:number;type:Float64; };_linearVelocity: {default: [number,number,number];type:Vec3; };angularDamping: {default:number;type:Float32; };centerOfMass: {default: [number,number,number];type:Vec3; };gravityFactor: {default:number;type:Float32; };linearDamping: {default:number;type:Float32; };state: {default:"DYNAMIC";enum: {Dynamic:"DYNAMIC";Kinematic:"KINEMATIC";Static:"STATIC"; };type:Enum; }; }> |Component<{_engineShape: {default:number;type:Float64; };density: {default:number;type:Float32; };dimensions: {default: [number,number,number];type:Vec3; };friction: {default:number;type:Float32; };restitution: {default:number;type:Float32; };shape: {default:"Auto";enum: {Auto:"Auto";Box:"Box";Capsules:"Capsules";ConvexHull:"ConvexHull";Cylinder:"Cylinder";Sphere:"Sphere";TriMesh:"TriMesh"; };type:Enum; }; }>)[]; }; },this>
Constructors
Constructor
new PhysicsSystem(
_w,_qm,_p):PhysicsSystem
Defined in: node_modules/.pnpm/elics@3.4.2/node_modules/elics/lib/system.d.ts:76
Parameters
_w
_qm
QueryManager
_p
number
Returns
PhysicsSystem
Inherited from
createSystem( { physicsEntities: { required: [PhysicsBody, PhysicsShape], }, manipluatedEntities: { required: [PhysicsBody, PhysicsManipulation], where: [ne(PhysicsBody, '_engineBody', 0)], }, gravityOverrides: { required: [PhysicsBody, PhysicsShape], where: [ne(PhysicsBody, 'gravityFactor', DEFAULT_GRAVITY_FACTOR)], }, linearDampingOverrides: { required: [PhysicsBody, PhysicsShape], where: [ne(PhysicsBody, 'linearDamping', DEFAULT_LINEAR_DAMPING)], }, angularDampingOverrides: { required: [PhysicsBody, PhysicsShape], where: [ne(PhysicsBody, 'angularDamping', DEFAULT_ANGULAR_DAMPING)], }, }, { gravity: { type: Types.Vec3, default: [0, -9.81, 0] }, useWorker: { type: Types.Boolean, default: true }, updateFrequency: { type: Types.Float32, default: DEFAULT_UPDATE_FREQUENCY }, interpolation: { type: Types.Boolean, default: true }, }, ).constructor
Properties
camera
readonlycamera:PerspectiveCamera
Defined in: packages/core/src/ecs/system.ts:63
Inherited from
cleanupFuncs
readonlycleanupFuncs: () =>void[]
Defined in: packages/core/src/ecs/system.ts:66
Returns
void
Inherited from
config
config:
SystemConfigSignals<S>
Defined in: packages/core/src/ecs/system.ts:49
Inherited from
createEntity()
createEntity: () =>
Entity
Defined in: packages/core/src/ecs/system.ts:81
Returns
Entity
Inherited from
globals
globals:
Record<string,any>
Defined in: packages/core/src/ecs/system.ts:54
Inherited from
input
readonlyinput:InputManager
Defined in: packages/core/src/ecs/system.ts:61
Inherited from
isPaused
isPaused:
boolean
Defined in: packages/core/src/ecs/system.ts:48
Inherited from
player
readonlyplayer:XROrigin
Defined in: packages/core/src/ecs/system.ts:58
Inherited from
playerEntity
readonlyplayerEntity:Entity
Defined in: packages/core/src/ecs/system.ts:59
Inherited from
playerHeadEntity
readonlyplayerHeadEntity:Entity
Defined in: packages/core/src/ecs/system.ts:60
Inherited from
priority
priority:
number
Defined in: packages/core/src/ecs/system.ts:53
Inherited from
queries
queries:
Record<keyofQ,Query>
Defined in: packages/core/src/ecs/system.ts:50
Inherited from
queryManager
queryManager:
QueryManager
Defined in: packages/core/src/ecs/system.ts:52
Inherited from
renderer
readonlyrenderer:WebGLRenderer
Defined in: packages/core/src/ecs/system.ts:64
Inherited from
scene
readonlyscene:Scene
Defined in: packages/core/src/ecs/system.ts:62
Inherited from
visibilityState
readonlyvisibilityState:Signal<VisibilityState>
Defined in: packages/core/src/ecs/system.ts:65
Inherited from
world
world:
World
Defined in: packages/core/src/ecs/system.ts:51
Inherited from
xrFrame
xrFrame:
XRFrame
Defined in: packages/core/src/ecs/system.ts:56
Inherited from
xrManager
xrManager:
WebXRManager
Defined in: packages/core/src/ecs/system.ts:55
Inherited from
Methods
flushDebugFrame()
flushDebugFrame():
Promise<void>
Defined in: packages/core/src/physics/physics-system.ts:408
Wait until all submitted physics work is reflected in ECS transforms. Used by debugger pause/step so worker and inline execution expose the same settled state at command boundaries.
Returns
Promise<void>
init()
init():
void
Defined in: packages/core/src/physics/physics-system.ts:207
Returns
void
Overrides
play()
play():
void
Defined in: packages/core/src/ecs/system.ts:79
Returns
void
Inherited from
prepareDebugFrame()
prepareDebugFrame(
delta):void
Defined in: packages/core/src/physics/physics-system.ts:397
Prepare one exact-delta physics tick for an ECS debugger step.
Parameters
delta
number
Returns
void
setBodyTransform()
setBodyTransform(
entity,pose,options):void
Defined in: packages/core/src/physics/physics-system.ts:285
Teleport an existing physics body and mirror the pose immediately on its Object3D. The runtime consumes the command on the next available exchange.
Parameters
entity
Entity
pose
options
PhysicsBodyTransformOptions = {}
Returns
void
stop()
stop():
void
Defined in: packages/core/src/ecs/system.ts:80
Returns
void
Inherited from
update()
update(
delta):void
Defined in: packages/core/src/physics/physics-system.ts:332
Per-frame tick. Both arguments are in seconds (Three.js Clock convention), not milliseconds.
Parameters
delta
number
Seconds since the previous frame.
Returns
void