before PointPick() or MousePick() exist in PB, i used this code
Code:
Structure s_Rayon
*Objet.s_Body ;Adresse de l'objet en collision avec le rayon
Origine.s_Vecteur ;Origine du rayon
Direction.s_Vecteur ;Vecteur directeur du rayon
;Informations collisions
CollisionDetectee.l
DistanceLaPlusCourte.f
PointIntersection.s_Vecteur
EndStructure
Structure s_Souris
Clic.l
Pos2D.POINT
Pos3D.s_Vecteur
Rayon.s_Rayon
EndStructure
;Ecran
Screen\Width = 1024
Screen\Width_2 = Screen\Width / 2
Screen\Height = 768
Screen\Height_2 = Screen\Height / 2
;Calcul de l'angle pour les projections
Angle = (#Focale * 0.0174533) / 2.0
Screen\d = (Screen\Height / (2 * Tan(Angle)))
;Get the camera's matrice (axis)
Procedure CalculMatriceCamera(No.l)
Define.s_Vecteur x, y, z, p, SceneY
SceneY\x = 0
SceneY\y = 1
SceneY\z = 0
;La camera est toujours orientée ver l'entity #Cube.
;Il est aussi possible de définir un point de la scène se trouvant
;dans la direction de la caméra.
;Calcule l'axe z de la caméra (la caméra pointe vers l'entity)
z\x = EntityX(No) - CameraX(0)
z\y = EntityY(No) - CameraY(0)
z\z = EntityZ(No) - CameraZ(0)
Normalise(@z)
;Calcul l'axe x de la caméra de façon à ce qu'il soit perpendulaire aux axes z et Y de la Scène
PRODUIT_VECTORIEL(x, z, SceneY); dot product
Normalise(@x)
;Calcule l'axe Y de la caméra de façon à ce qu'il soit perpendiculaire aux axes z et x
PRODUIT_VECTORIEL(y, z, x)
Normalise(@y)
;Ligne Colonne
MatriceCamera(0,0) = x\x
MatriceCamera(0,1) = x\y
MatriceCamera(0,2) = x\z
MatriceCamera(1,0) = y\x
MatriceCamera(1,1) = y\y
MatriceCamera(1,2) = y\z
MatriceCamera(2,0) = z\x
MatriceCamera(2,1) = z\y
MatriceCamera(2,2) = z\z
EndProcedure
;Get MouseRay
Procedure P2D_P3D(*Mulot.s_Souris)
Define.f X1, Y1, Z1
CalculMatriceCamera(#Cube)
;Conversion position souris en 3D
X1 = (*Mulot\Pos2D\x - Screen\Width_2)
Y1 = (*Mulot\Pos2D\y - Screen\Height_2)
Z1 = Screen\d
;Retour dans le repère de la scène
*Mulot\Pos3D\x = (MatriceCamera(0,0) * X1) + (MatriceCamera(1,0) * Y1) + (MatriceCamera(2,0) * Z1)
*Mulot\Pos3D\y = (MatriceCamera(0,1) * X1) + (MatriceCamera(1,1) * Y1) + (MatriceCamera(2,1) * Z1)
*Mulot\Pos3D\z = (MatriceCamera(0,2) * X1) + (MatriceCamera(1,2) * Y1) + (MatriceCamera(2,2) * Z1)
*Mulot\Pos3D\x + CameraX(0)
*Mulot\Pos3D\y + CameraY(0)
*Mulot\Pos3D\z + CameraZ(0)
;Calcul le rayon passant par la souris
;Origine du rayon
*Mulot\Rayon\Origine\x = CameraX(0)
*Mulot\Rayon\Origine\y = CameraY(0)
*Mulot\Rayon\Origine\z = CameraZ(0)
;Direction du rayon
*Mulot\Rayon\Direction\x = *Mulot\Pos3D\x - CameraX(0)
*Mulot\Rayon\Direction\y = *Mulot\Pos3D\y - CameraY(0)
*Mulot\Rayon\Direction\z = *Mulot\Pos3D\z - CameraZ(0)
Normalise(*Mulot\Rayon\Direction)
EndProcedure
And then, as gnasen said, you have to control ray intersection.
Example here :
http://www.purebasic.fr/english/viewtopic.php?f=16&t=46749