|
query - owned query handle manifold - one-based manifold index side - 1 for native A, 2 for native B |
|
Returns the body tag on one side of a copied contact manifold. Returns the copied signed application body tag on side 1 (native A) or 2 (native B) of a copied manifold. Tags retain their capture-time value after edits/deletion. The normal points from A toward B; querying body B does not swap the native sides. 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. |
; PhysicsQueryContactBodyTag 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)
; Tag the bodies and shapes: 1 floor, 2 orange crate, 3 green crate
SetPhysicsBodyTag ground_body,1
SetPhysicsBodyTag crate_body,2
SetPhysicsBodyTag top_body,3
SetPhysicsShapeTag ground_shape,1
SetPhysicsShapeTag crate_shape,2
SetPhysicsShapeTag top_shape,3
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"
For m=1 To manifolds
Text 0,20+(m-1)*20,"Manifold "+m+": "+"body tags "+PhysicsQueryContactBodyTag(query,m,1)+" and "+PhysicsQueryContactBodyTag(query,m,2)
Next
Text 0,20,"(1 floor, 2 orange crate, 3 green crate)"
Flip
Wend
FreePhysicsWorld world
End