|
query - query handle index - one-based hit index |
|
Returns the Z coordinate of a query result's point. Returns the copied world-space Z component of the copied point in metres: a ray/sweep surface hit, closest point on a solid, or a positive-distance pair witness. It remains historical after stepping or deleting hit objects. Overlap/AABB hits and zero-distance pairs have no point and raise an error. Use PhysicsQueryHasPoint to check availability. For a character plane, the point lies on the native target surface at the captured starting pose; it is not the later movement-cast impact point. 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. See also: CreatePhysicsQuery, PhysicsQueryFilter, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit. |
; PhysicsQueryZ Example
; ---------------------
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"
If hits>0
Text 0,20+0,"PhysicsQueryZ(query,1) = "+PhysicsQueryZ(query,1)
Text 0,20+20,"(X "+PhysicsQueryX(query,1)+", Y "+PhysicsQueryY(query,1)+", Z "+PhysicsQueryZ(query,1)+")"
Else
Text 0,20,"The ray hits nothing"
EndIf
Flip
Wend
FreePhysicsWorld world
End