PhysicsQueryFilter query,category_bits,mask_bits[,ignored_body][,include_sensors]
Parameters
|
query - query handle category_bits - signed Int pattern for the query category bits mask_bits - signed Int pattern for accepted shape categories ignored_body (optional) - body to exclude, or 0 (optional; 0) (default) include_sensors (optional) - True to include sensors; False by default (optional; 0) (default) |
Description
|
Sets which bodies and shapes a query's future runs can hit. Sets category/mask bits, an optional ignored body and sensor inclusion for future world ray/sweep/overlap runs. Explicit closest-point, shape-distance, current-contact and sensor-occupancy inspections ignore these search settings. Simulation collision filters still determine contacts and occupants. Defaults for the optional arguments are ignored_body=0 (none) and include_sensors=False. Each Int is interpreted as an unsigned 32-bit pattern: -1 selects all bits, and -2147483648 selects bit 31. Zero category or mask accepts nothing. The ignored body must initially be a live body in the same world. All its shapes are excluded before closest-hit selection. If later deleted, the saved identity cannot accidentally exclude a replacement body. Filter changes retain existing results until rerun. Queries use two-sided category/mask filtering in the existing 32-bit domain, plus optional ignored-body, sensor and target rules. Collision groups and joints do not override query masks. Disabled bodies are absent from world queries. Existing shape filters default to all category bits; assign explicit shape categories when separating groups. 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, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit. |
Example
; PhysicsQueryFilter 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) ; Odd crates are green and in collision category 2; even crates stay in category 1 If i Mod 2 EntityColor crate,120,200,140 PhysicsShapeFilter crate_shape,2,-1 EndIf 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 ; F makes the query skip category 2, so the ray passes through green crates If KeyHit(33) skip=Not skip If skip PhysicsQueryFilter query,-1,1 Else PhysicsQueryFilter query,-1,-1 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 F: skip green Esc: exit" Text 0,20,"Skipping green crates: "+skip Text 0,40,"PhysicsQueryFilter query,-1,"+(1-2*(skip=0)) Flip Wend FreePhysicsWorld world End
Index