еще один вариант. Сделал чтобы можно было пикать по спрайтам в одном сурфейсе.

Graphics3D 800, 600, 32, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
cam = CreateCamera()
PositionEntity( cam, 0, 0, -10 )
InitSpriteSystem()
addSprite("left",-2)
addSprite("right",2)
Global pickedSprite.Sprite
While Not KeyHit(1)
mx = MouseX()
my = MouseY()
MHleft = MouseHit(1)
If MHleft=1 Then
pick = CameraPick(cam, mx, my)
If pick <> 0 Then
tri = PickedTriangle()
pickedSprite = Object.Sprite(FindSprite( tri ))
Else
pickedSprite = Null
EndIf
EndIf
RenderWorld()
If pickedSprite<> Null Then
CameraProject(cam, pickedSprite\x, pickedSprite\y, pickedSprite\z)
Text( ProjectedX(), ProjectedY(), pickedSprite\name )
EndIf
Flip
Wend
Type Sprite
Field tri[2], vertex
Field name$
Field x#, y#, z#
End Type
Global SSmesh, SSsurf
Function InitSpriteSystem()
SSmesh = CreateMesh()
SSsurf = CreateSurface(SSmesh)
EntityPickMode( SSmesh, 2 )
End Function
Function addSprite(name$, x#=0, y#=0, z#=0)
Local SS.Sprite = New Sprite
SS\x = x : SS\y = y : SS\z = z
SS\vertex = AddVertex(SSsurf, SS\x-1, SS\y+1, SS\z+0, 0, 0)
AddVertex(SSsurf, SS\x+1, SS\y+1, SS\z+0, 1, 0)
AddVertex(SSsurf, SS\x+1, SS\y-1, SS\z+0, 1, 1)
AddVertex(SSsurf, SS\x-1, SS\y-1, SS\z+0, 0, 1)
SS\tri[0] = AddTriangle(SSsurf, SS\vertex, SS\vertex+1, SS\vertex+2)
SS\tri[1] = AddTriangle(SSsurf, SS\vertex, SS\vertex+2, SS\vertex+3)
SS\name = name
End Function
Function FindSprite( tri )
Local SS.Sprite
For SS.Sprite = Each Sprite
For n = 0 To 1
If tri = SS\tri[n] Then Return Handle(SS)
Next
Next
Return -1
End Function