Blitz3D+ Command Reference

PhysicsQueryTarget query[,body][,shape]

Parameters

query - query handle

body (optional) - target body, or 0 (optional; 0) (default)

shape (optional) - physics shape handle (or 0 to clear a target) (optional; 0) (default)

Description

Restricts future runs to one body or one shape in the query's world.

Set body to a body handle, or pass body=0 and shape to a shape handle. Passing both non-zero is an error; both zero clear the restriction. This supplies body/shape-scoped rays, sweeps and overlaps while retaining all query filters. A deleted target makes a rerun fail until the target is changed or cleared; historical results remain readable.

For managed entity physics, a body target survives collider rebuilding and selects its current shapes. A shape target becomes stale when that shape is replaced, just as when it is deleted. Queries use committed geometry; they do not synchronize pending entity edits.

Explicit closest-point, shape-distance, current-contact and sensor-occupancy inspections use their supplied object handles and ignore this search target, including a stale target.

Results are copied. They survive StepPhysics and other queries until this query runs successfully again or is freed. Failed runs preserve the previous results. Freeing the owning world frees its queries. Invalid/stale/wrong-kind handles and invalid hit indices raise runtime errors.

Requires Extended mode.

See also: CreatePhysicsQuery, PhysicsQueryFilter, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit.

Example

; PhysicsQueryTarget Example
; --------------------------
; Requires Extended mode.

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

Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2

camera=CreateCamera()
PositionEntity camera,0,7,-8
RotateEntity camera,40,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)

; A ring of crates to aim at
For i=1 To 8
    crate=CreateCube()
    ScaleEntity crate,0.5,0.5,0.5
    PositionEntity crate,Cos(i*45)*4,0.5,Sin(i*45)*4
    EntityColor crate,255,120,70
    crate_body=CreatePhysicsBody(world,crate,PHYSICS_STATIC)
    crate_shape=PhysicsBodyBox(crate_body,1,1,1)
    If i=1 Then first_body=crate_body
Next

; A query object runs searches and keeps a copy of their results
query=CreatePhysicsQuery(world)

; Start aimed at a crate
angle#=45

While Not KeyDown(1)

    ; A and D sweep the ray around the centre
    If KeyDown(30) Then angle=angle+1.5
    If KeyDown(32) Then angle=angle-1.5
    dx#=Cos(angle)*6
    dz#=Sin(angle)*6

    ; T limits the query to the first crate only, or back to everything
    If KeyHit(20)
        only=Not only
        If only
            PhysicsQueryTarget query,first_body
        Else
            PhysicsQueryTarget query
        EndIf
    EndIf

    StepPhysics world,1.0/60.0,4

    ; Cast a ray 6 m out from the centre, half a metre above the floor
    hits=QueryPhysicsRay(query,0,0.5,0,dx,0,dz)

    ; 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

    ; Draw the ray from the centre to the first hit, or to its full length
    CameraProject camera,0,0.5,0
    start_x=ProjectedX()
    start_y=ProjectedY()
    If hits>0
        CameraProject camera,PhysicsQueryX(query,1),PhysicsQueryY(query,1),PhysicsQueryZ(query,1)
    Else
        CameraProject camera,dx,0.5,dz
    EndIf
    Line start_x,start_y,ProjectedX(),ProjectedY()

    Text 0,0,"Arrow keys: move camera   A / D: sweep the ray   T: target one crate"
    Text 0,20,"Esc: exit"
    Text 0,40,"Only the first crate: "+only
    Text 0,60,"Hits: "+hits

    Flip

Wend

FreePhysicsWorld world
End

Index