PhysicsQueryContactTotalImpulse# ( query,manifold,point )

Parameters

query - owned query handle

manifold - one-based manifold index

point - one-based point index within the manifold

Description

Returns the raw copied native totalNormalImpulse solve accumulator, in newton-seconds.

The pinned solver adds the accumulated impulse in both bias and relaxation passes, plus restitution contributions. This is not net physical impulse, momentum change, force times the time step, or an average contact force. In the stationary load regression it is approximately twice mass × gravity × full-step duration. Use it as a native interaction/solve diagnostic; PhysicsQueryContactImpulse reads the final-substep normal impulse. 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.


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

Example

; PhysicsQueryContactTotalImpulse 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 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,"PhysicsQueryContactTotalImpulse(query,1,1) = "+PhysicsQueryContactTotalImpulse(query,1,1)
        Text 0,20+20,"(the solver's running total; compare PhysicsQueryContactImpulse "+PhysicsQueryContactImpulse(query,1,1)+")"
    EndIf

    Flip

Wend

FreePhysicsWorld world
End

Index