PhysicsShapeCapsule shape,diameter#,ax#,ay#,az#,bx#,by#,bz#

Parameters

shape - live physics-shape handle

diameter# - capsule diameter in metres

ax# - X of end-sphere centre A, in body-local metres
ay# - Y of end-sphere centre A, in body-local metres
az# - Z of end-sphere centre A, in body-local metres

bx# - X of end-sphere centre B, in body-local metres
by# - Y of end-sphere centre B, in body-local metres
bz# - Z of end-sphere centre B, in body-local metres

Description

Replaces the shape with a capsule whose two segment endpoints are body-local metre coordinates.

diameter is the diameter of both hemispherical ends and the cylinder. Endpoints may coincide, producing sphere-equivalent geometry. This supports any capsule direction; the full end-to-end length is segment length plus diameter. Inspect endpoints 1 and 2 with PhysicsCapsulePointX/Y/Z.

The shape handle, body/world ownership, public enumeration order, application tag, density, filter, sensor/event settings and material table remain intact. Sphere, capsule and box setters and RefreshPhysicsHull require a one-slot material table; explicitly remap existing faces and shrink larger tables before converting to a convex shape. Triangle meshes and terrain remain restricted to static bodies.

Primitive diameters and box dimensions must be positive; all positions, dimensions and frame angles must be finite. Replacement data is validated and cooked before native mutation. Invalid inputs raise a runtime error and retain the previous collider. Supported source limits are 1,048,576 vertices and 1,048,576 triangles. Coordinates/bounds must fit the pinned Box3D coordinate range; mass and inertia must remain finite and representable. Native allocation failure follows the library's allocation policy; these limits are not a guarantee that every maximum-size mesh will fit memory.

Successful edits recalculate body mass from all shapes, replacing custom mass data. Moving the centre of mass preserves point velocity, including saved velocity on disabled bodies. Enabled bodies are woken; disabled bodies remain disabled. Geometry changes invalidate contacts and wake affected touching bodies. Replacing an identical shared hull can retain its native proxy/contact cache. Queries run afterward see the current collider; existing owned queries retain their historical numbers and still resolve this live public shape handle.

Visual geometry changes never refresh physics automatically. Refresh is an explicit authoring operation, not a dynamic deformable-mesh solver. Native mesh geometry is borrowed: the wrapper releases previous cooked storage only after native references are gone. Hull geometry is copied into the native world database. All replacement effects record/replay. Hull/mesh replacement uses added opcodes and requires the patched Blitz3D+ player; older opcodes retain their values. Wrapper frame/dimension metadata and editable visual assets are not restored by physics replay.


See also: PhysicsShapeSphere, PhysicsShapeBox, RefreshPhysicsHull, RefreshPhysicsMesh, PhysicsShapeRadius, PhysicsShapeLocalMinX.

Example

; PhysicsShapeCapsule Example
; ---------------------------

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2

camera=CreateCamera()
PositionEntity camera,0,3,-7
RotateEntity camera,20,0,0

light=CreateLight()
RotateEntity light,45,-30,0
AmbientLight 60,60,60

; An independent Box3D world with standard gravity
world=CreatePhysicsWorld()

; Blue static floor
ground=CreateCube()
ScaleEntity ground,6,0.5,6
PositionEntity ground,0,-0.5,0
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,12,1,12)

; An empty pivot carries the body; a child mesh shows its collider
root=CreatePivot()
body=CreatePhysicsBody(world,root,PHYSICS_DYNAMIC)

; A capsule: a cylinder with a ball on each end
half#=0.5
model=CreateCylinder(16,True,root)
EntityColor model,255,120,70
cap_a=CreateSphere(16,root)
cap_b=CreateSphere(16,root)
EntityColor cap_a,255,120,70
EntityColor cap_b,255,120,70
ScaleEntity cap_a,0.4,0.4,0.4
ScaleEntity cap_b,0.4,0.4,0.4
ScaleEntity model,0.4,half,0.4
PositionEntity cap_a,0,-half,0
PositionEntity cap_b,0,half,0

; A 1.8 m capsule: a 1 m segment plus the 0.8 m diameter
shape=PhysicsBodyCapsule(body,0.8,1.8)
ResetPhysicsBody body,0,2,0,0,0,0

While Not KeyDown(1)

    ; Space tosses the body, R drops it again
    If KeyHit(57)
        PhysicsBodyImpulse body,0,5,0
        PhysicsBodyAngularImpulse body,0.5,0,0.5
    EndIf
    If KeyHit(19) Then ResetPhysicsBody body,0,2,0,0,0,0

    ; [ and ] lengthen or shorten the capsule between its two end points
    change=KeyHit(27)-KeyHit(26)
    If change<>0
        half=half+change*0.25
        If half<0 Then half=0
        PhysicsShapeCapsule shape,0.8,0,-half,0,0,half,0
        ScaleEntity model,0.4,half,0.4
        PositionEntity cap_a,0,-half,0
        PositionEntity cap_b,0,half,0
    EndIf
    StepPhysics world,1.0/60.0,4

    ; Arrow keys move the camera
    If KeyDown(200) Then MoveEntity camera,0,0,0.1
    If KeyDown(208) Then MoveEntity camera,0,0,-0.1
    If KeyDown(203) Then TurnEntity camera,0,1,0
    If KeyDown(205) Then TurnEntity camera,0,-1,0

    RenderWorld

    Text 0,0,"Arrow keys: move camera   Space: toss   R: reset   [ / ]: length   Esc: exit"
    Text 0,20,"PhysicsShapeCapsule shape,0.8,0,"+(-half)+",0,0,"+half+",0"
    Text 0,40,"End points are body-local; the ends add half the diameter"

    Flip

Wend

FreePhysicsWorld world
End

Index