Blitz3D+ Command Reference

LinePick ( x#,y#,z#,dx#,dy#,dz#[,radius#] )

Parameters

x# - x coordinate of start of line pick
y# - y coordinate of start of line pick
z# - z coordinate of start of line pick

dx# - x direction and distance of line pick
dy# - y direction and distance of line pick
dz# - z direction and distance of line pick

radius# (optional) - radius of line pick; 0 (default)

Description

Casts a ray from x,y,z to x+dx,y+dy,z+dz and returns the first pickable entity it hits, or 0 if it hits nothing.

Note that dx,dy,dz is the direction and length of the pick, not a destination point. LinePick is the workhorse ray test: fire it straight down (LinePick px,py,pz,0,-100,0) to find the ground height below a point, forward from a gun muzzle for hitscan bullets, or between two points as a custom line-of-sight probe.

Only entities made pickable with EntityPickMode are considered. The optional radius turns the thin ray into a swept sphere, so the pick has thickness - useful for making narrow gaps stop a fat projectile.

The pick's details are then available from the Picked commands: PickedX/Y/Z for the exact point hit, PickedNX/NY/NZ for the surface normal, PickedTime for how far along the ray it hit, and PickedEntity/PickedSurface/PickedTriangle for what was hit.

See also: CameraPick, EntityPick, EntityPickMode, PickedX, PickedTime.

Example

; LinePick Example
; ----------------

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,10,-14
RotateEntity camera,35,0,0

light=CreateLight()
RotateEntity light,60,30,0

floor=CreatePlane()
EntityColor floor,40,60,90

; Radar station at the centre of the arena
radar=CreatePivot()
PositionEntity radar,0,1,0

; Visible beam - a thin cylinder parented to the radar, lying along its z axis
beam=CreateCylinder(8,1,radar)
ScaleEntity beam,0.05,6,0.05
RotateEntity beam,90,0,0
PositionEntity beam,0,0,6
EntityColor beam,0,255,0

; Four crates for the radar to find - EntityPickMode 2 makes them pickable
crate1=CreateCube()
PositionEntity crate1,-6,1,3
EntityPickMode crate1,2

crate2=CreateCube()
PositionEntity crate2,5,1,6
EntityPickMode crate2,2

crate3=CreateCube()
PositionEntity crate3,2,1,-6
EntityPickMode crate3,2

crate4=CreateCube()
PositionEntity crate4,-4,1,-5
EntityPickMode crate4,2

While Not KeyDown(1)

    ; Sweep the radar round
    TurnEntity radar,0,1.5,0

    ; Convert 12 units along the radar's z axis into a world-space direction
    TFormVector 0,0,12,radar,0

    ; LinePick casts a ray from the radar along the beam
    picked=LinePick(EntityX(radar),EntityY(radar),EntityZ(radar),TFormedX(),TFormedY(),TFormedZ())

    ; Repaint the crates, then flash the one the beam is hitting
    EntityColor crate1,180,140,80
    EntityColor crate2,180,140,80
    EntityColor crate3,180,140,80
    EntityColor crate4,180,140,80
    If picked<>0 Then EntityColor picked,255,255,255

    ; 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

    Text 0,0,"Arrow keys: move camera   Esc: exit"
    If picked<>0
        Text 0,20,"LinePick: contact! Entity handle "+picked
    Else
        Text 0,20,"LinePick: 0 (beam sweeping - nothing on this bearing)"
    EndIf

    Flip

Wend

End

Index