Blitz3D+ Command Reference

PhysicsQueryContactImpulse# ( query,manifold,point )

Parameters

query - owned query handle

manifold - one-based manifold index

point - one-based point index within the manifold

Description

Returns the copied normal impulse from the final solver substep, in newton-seconds.

For a stationary supported body this can be related to load using the substep duration, but it is not itself force or the full-step sum. Sleeping contacts retain cached values. Query results are copied and survive stepping, other queries and deletion until this query runs successfully again or is freed. Generation-checked identity getters return zero for deleted objects; copied tags and numerical fields survive. Failed runs retain the complete previous payload. Freeing the owning world frees its queries.

Invalid/stale/wrong-kind handles, invalid indices or unavailable payload fields raise runtime errors.

Requires Extended mode.

See also: QueryPhysicsBodyContacts, QueryPhysicsShapeContacts, QueryPhysicsSensor, CountPhysicsQueryManifolds, PhysicsBodyEvents.

Example

; PhysicsQueryContactImpulse Example
; ----------------------------------
; Requires Extended mode.

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 orange crate on the floor, with a green crate resting on top
crate=CreateCube()
ScaleEntity crate,0.6,0.6,0.6
EntityColor crate,255,120,70
crate_body=CreatePhysicsBody(world,crate,PHYSICS_DYNAMIC)
crate_shape=PhysicsBodyBox(crate_body,1.2,1.2,1.2)
top=CreateCube()
ScaleEntity top,0.4,0.4,0.4
EntityColor top,120,200,140
top_body=CreatePhysicsBody(world,top,PHYSICS_DYNAMIC)
top_shape=PhysicsBodyBox(top_body,0.8,0.8,0.8)
ResetPhysicsBody crate_body,0,0.6,0,0,0,0
ResetPhysicsBody top_body,0,1.6,0,0,0,0

; A query object keeps a copy of the contacts it finds
query=CreatePhysicsQuery(world)

While Not KeyDown(1)

    ; Space shoves the orange crate along the floor, R stacks the crates again
    If KeyHit(57) Then PhysicsBodyImpulse crate_body,4,0,0
    If KeyHit(19)
        ResetPhysicsBody crate_body,0,0.6,0,0,0,0
        ResetPhysicsBody top_body,0,1.6,0,0,0,0
    EndIf

    StepPhysics world,1.0/60.0,4

    ; Copy the orange crate's contacts: one manifold for each shape it touches
    manifolds=QueryPhysicsBodyContacts(query,crate_body)

    ; 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

    ; Ring every contact point
    For m=1 To manifolds
        For p=1 To PhysicsQueryContactPoints(query,m)
            CameraProject camera,PhysicsQueryContactX(query,m,p),PhysicsQueryContactY(query,m,p),PhysicsQueryContactZ(query,m,p)
            Oval ProjectedX()-3,ProjectedY()-3,7,7,False
        Next
    Next

    Text 0,0,"Arrow keys: move camera   Space: shove   R: reset   Esc: exit"
    If manifolds>0
        Text 0,20+0,"PhysicsQueryContactImpulse(query,1,1) = "+PhysicsQueryContactImpulse(query,1,1)+" N s"
        Text 0,20+20,"(the push holding the crates apart at that point)"
    EndIf

    Flip

Wend

FreePhysicsWorld world
End

Index