PhysicsQueryContactZ# ( query,manifold,point[,side] )
Parameters
|
query - owned query handle manifold - one-based manifold index point - one-based point index within the manifold side (optional) - 1 for native A, 2 for native B; optional; 1 (default) |
Description
|
Returns the copied world-space Z contact position in metres for side A (1, default) or B (2). Positions are copied using the current native centre of mass plus the cached world-oriented solver anchor, matching Box3D debug drawing. They are cached solver geometry, not freshly computed surface intersections; A/B positions can differ. Stored separation and impulse fields retain their native solver meaning. 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
; PhysicsQueryContactZ 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,"PhysicsQueryContactZ(query,1,1) = "+PhysicsQueryContactZ(query,1,1) Text 0,20+20,"(side 2 copy: "+PhysicsQueryContactZ(query,1,1,2)+")" Text 0,20+40,"(point 1 of manifold 1: "+PhysicsQueryContactX(query,1,1)+", "+PhysicsQueryContactY(query,1,1)+", "+PhysicsQueryContactZ(query,1,1)+")" EndIf Flip Wend FreePhysicsWorld world End
Index