Blitz3D+ Command Reference

PickedTime# ( )

Parameters

None.

Description

Returns how far along the pick ray the most recent pick hit, as a fraction from 0 to 1.

Despite the name this is not a duration - it is a position along the ray fired by CameraPick, EntityPick or LinePick. 0 means the hit came right at the ray's start, 0.5 halfway along, 1 at its very end.

That makes distances easy: multiply PickedTime by the length of the ray. For EntityPick the ray length is the range you passed, so PickedTime()*range is the distance to the target - a laser rangefinder in one line. For LinePick it is the length of the dx,dy,dz vector; for CameraPick the ray reaches to the camera's far range.

If the last pick missed, PickedTime returns 1 - but check the pick command's return value (or PickedEntity) to be sure, since a genuine hit at the ray's very end also gives values close to 1.

See also: PickedEntity, PickedX, LinePick, EntityPick, CameraPick.

Example

; PickedTime Example
; ------------------

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

camera=CreateCamera()
PositionEntity camera,0,3,-8

; A short draw range keeps the PickedTime fractions easy to read
CameraRange camera,1,50

light=CreateLight()
RotateEntity light,45,45,0

; Shooting-gallery floor - EntityPickMode 2 makes it pickable by its polygons
floor=CreatePlane()
EntityColor floor,70,110,70
EntityPickMode floor,2

; Three targets, all pickable by their polygons
cube=CreateCube()
PositionEntity cube,-3,1,4
EntityPickMode cube,2

ball=CreateSphere()
PositionEntity ball,0,1.4,4
EntityPickMode ball,2

drum=CreateCylinder()
PositionEntity drum,3,1,4
EntityPickMode drum,2

; Small marker sphere shows the exact pick point
marker=CreateSphere()
ScaleEntity marker,0.15,0.15,0.15
EntityColor marker,255,255,0
HideEntity marker

bob#=0

While Not KeyDown(1)

    ; Repaint the targets; the picked one is flashed white below
    EntityColor cube,200,180,60
    EntityColor ball,60,120,220
    EntityColor drum,220,80,60

    ; The ball bobs gently so the gallery feels alive
    bob=bob+2
    PositionEntity ball,0,1.4+0.4*Sin(bob),4

    ; Click to shoot - CameraPick casts a pick ray through the mouse cursor
    If MouseHit(1) Then CameraPick(camera,MouseX(),MouseY())

    ; Highlight the last picked entity and park the marker on the pick point
    hit=PickedEntity()
    If hit<>0
        If hit<>floor Then EntityColor hit,255,255,255
        ShowEntity marker
        PositionEntity marker,PickedX(),PickedY(),PickedZ()
    Else
        HideEntity marker
    EndIf

    ; 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

    ; Crosshair at the mouse position
    Rect MouseX()-6,MouseY(),13,1
    Rect MouseX(),MouseY()-6,1,13

    Text 0,0,"Click a target or the floor to pick it   Arrow keys: move camera   Esc: exit"
    ; PickedTime is how far along the pick ray the hit happened
    ; (0 = at the camera, 1 = the far end of the ray)
    Text 0,20,"PickedTime: "+PickedTime()
    Text 0,40,"Near targets give small fractions - pick the far floor for big ones"

    Flip

Wend

End

Index