DOCS v0.1.13 github

@hatch:physics v0.1.9

Rapier-backed physics. World2D and World3D from one import — bodies, colliders, gravity, force / impulse, position + velocity reads, raycasts, and contact-event streams. Bundles rapier2d + rapier3d in a single cdylib so games never have to choose between dimensions at the package level. Wires into @hatch:game for a step-per-frame physics loop.

stable system updated Jun 4, 2026 source ↗
$ hatch add @hatch:physics

MOD physics

CL PhysicsCore

FN PhysicsCore.static world2dCreate(descriptor)

FN PhysicsCore.static world2dDestroy(id)

FN PhysicsCore.static world2dStep(id, dt)

FN PhysicsCore.static world2dSpawnDynamic(worldId, descriptor)

FN PhysicsCore.static world2dSpawnStatic(worldId, descriptor)

FN PhysicsCore.static world2dSpawnKinematic(worldId, descriptor)

FN PhysicsCore.static world2dDespawn(worldId, bodyId)

FN PhysicsCore.static world2dPosition(worldId, bodyId)

FN PhysicsCore.static world2dRotation(worldId, bodyId)

FN PhysicsCore.static world2dLinearVelocity(worldId, bodyId)

FN PhysicsCore.static world2dSetLinearVelocity(worldId, bodyId, x, y)

FN PhysicsCore.static world2dApplyImpulse(worldId, bodyId, x, y)

FN PhysicsCore.static world2dApplyForce(worldId, bodyId, x, y)

FN PhysicsCore.static world3dCreate(descriptor)

FN PhysicsCore.static world3dDestroy(id)

FN PhysicsCore.static world3dStep(id, dt)

FN PhysicsCore.static world3dSpawnDynamic(worldId, descriptor)

FN PhysicsCore.static world3dSpawnStatic(worldId, descriptor)

FN PhysicsCore.static world3dSpawnKinematic(worldId, descriptor)

FN PhysicsCore.static world3dDespawn(worldId, bodyId)

FN PhysicsCore.static world3dPosition(worldId, bodyId)

FN PhysicsCore.static world3dPositionInto(worldId, bodyId, out, offset)

FN PhysicsCore.static world3dRotation(worldId, bodyId)

FN PhysicsCore.static world3dRotationInto(worldId, bodyId, out, offset)

FN PhysicsCore.static world3dLinearVelocity(worldId, bodyId)

FN PhysicsCore.static world3dSetLinearVelocity(worldId, bodyId, x, y, z)

FN PhysicsCore.static world3dApplyImpulse(worldId, bodyId, x, y, z)

FN PhysicsCore.static world3dApplyForce(worldId, bodyId, x, y, z)

FN PhysicsCore.static world3dCastRay(worldId, ox, oy, oz, dx, dy, dz, maxToi, solid)

FN PhysicsCore.static world2dCastRay(worldId, ox, oy, dx, dy, maxToi, solid)

FN PhysicsCore.static world3dDrainContactEvents(worldId)

FN PhysicsCore.static world2dDrainContactEvents(worldId)

FN PhysicsCore.static world3dCastShape(worldId, shape, ox, oy, oz, dx, dy, dz, maxToi)

FN PhysicsCore.static world2dCastShape(worldId, shape, ox, oy, dx, dy, maxToi)

FN PhysicsCore.static world3dCreateJoint(worldId, bodyA, bodyB, descriptor)

FN PhysicsCore.static world3dDestroyJoint(worldId, jointId)

FN PhysicsCore.static world2dCreateJoint(worldId, bodyA, bodyB, descriptor)

FN PhysicsCore.static world2dDestroyJoint(worldId, jointId)

CL World2D

NEW World2D.new_(id)

GET World2D.id

GET World2D.drainContactEvents → List<Map>

GET World2D.destroy

FN World2D.static new(descriptor)

FN World2D.static new()

FN World2D.step(dt)

FN World2D.spawnDynamic(descriptor)

FN World2D.spawnStatic(descriptor)

FN World2D.spawnKinematic(descriptor)

FN World2D.despawn(bodyId)

FN World2D.position(bodyId)

FN World2D.rotation(bodyId) → Num

FN World2D.linearVelocity(bodyId)

FN World2D.setLinearVelocity(bodyId, x, y)

FN World2D.applyImpulse(bodyId, x, y)

FN World2D.applyForce(bodyId, x, y)

FN World2D.castRay(ox: Num, oy: Num, dx: Num, dy: Num, maxToi: Num) → Map?

FN World2D.castRay(ox, oy, dx, dy, maxToi, solid)

FN World2D.castShape(shape: Map, ox: Num, oy: Num, dx: Num, dy: Num, maxToi: Num) → Map?

FN World2D.createJoint(bodyA: Num, bodyB: Num, descriptor: Map) → Num

FN World2D.destroyJoint(jointId)

CL Collider2D

FN Collider2D.static ball(radius)

FN Collider2D.static ball(radius, options)

FN Collider2D.static box(halfWidth, halfHeight)

FN Collider2D.static box(halfWidth, halfHeight, options)

FN Collider2D.static capsule(halfHeight, radius)

FN Collider2D.static capsule(halfHeight, radius, options)

FN Collider2D.static merge_(base, options)

CL World3D

NEW World3D.new_(id)

GET World3D.id

GET World3D.drainContactEvents → List<Map>

GET World3D.destroy

FN World3D.static new(descriptor)

FN World3D.static new()

FN World3D.step(dt)

FN World3D.spawnDynamic(descriptor)

FN World3D.spawnStatic(descriptor)

FN World3D.spawnKinematic(descriptor)

FN World3D.despawn(bodyId)

FN World3D.position(bodyId)

FN World3D.positionInto(bodyId: Num, out: Float32Array, offset: Num)

FN World3D.rotation(bodyId) → List<Num>

FN World3D.rotationInto(bodyId: Num, out: Float32Array, offset: Num)

FN World3D.linearVelocity(bodyId)

FN World3D.setLinearVelocity(bodyId, x, y, z)

FN World3D.applyImpulse(bodyId, x, y, z)

FN World3D.applyForce(bodyId, x, y, z)

FN World3D.castRay(ox: Num, oy: Num, oz: Num, dx: Num, dy: Num, dz: Num, maxToi: Num) → Map?

FN World3D.castRay(ox, oy, oz, dx, dy, dz, maxToi, solid)

FN World3D.castShape(shape: Map, ox: Num, oy: Num, oz: Num, dx: Num, dy: Num, dz: Num, maxToi: Num) → Map?

FN World3D.createJoint(bodyA: Num, bodyB: Num, descriptor: Map) → Num

FN World3D.destroyJoint(jointId)

CL Collider3D

FN Collider3D.static ball(radius)

FN Collider3D.static ball(radius, options)

FN Collider3D.static box(halfX, halfY, halfZ)

FN Collider3D.static box(halfX, halfY, halfZ, options)

FN Collider3D.static capsule(halfHeight, radius)

FN Collider3D.static capsule(halfHeight, radius, options)

FN Collider3D.static merge_(base, options)