CreatePhysicsQuery ( world )
Parameters
| world - owning physics world handle |
Description
|
Creates a query owned by a physics world and returns its handle. Initial results are empty, kind is 0, limit is 1024, category/mask bits cover all 32 public bits, sensors are excluded, and there is no ignored body or target. Queries share the generation-safe handle policy used by bodies and joints. 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. A query created from GetWorldPhysics reads the committed managed scene. Queries do not reconcile pending entity transforms, collider edits or enablement; call UpdateWorld or GetWorldPhysics to synchronize those changes first. Queries remain usable against the last committed scene after a rejected edit. They expose real canonical and compatibility shapes on the same body, so one entity can supply multiple shape hits; the existing sensor and target filters still apply. ClearWorld retains the borrowed world and its queries; FreeWorld invalidates them. Replaced or deleted shape identities read as zero in saved results, while copied geometry and tags remain available. A surviving body still resolves to its entity. Requires Extended mode. See also: PhysicsQueryFilter, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit. |
Example
; CreatePhysicsQuery 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) 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 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 Esc: exit" Text 0,20,"CreatePhysicsQuery(world) = "+query Text 0,40,"One query can be reused for any number of searches" Flip Wend FreePhysicsWorld world End
Index