MousePick()

Généralités sur la programmation 3D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

MousePick()

Message par djes »

Franchement, j'ai un peu de mal à comprendre ces procédures qui renvoient des valeurs dans des fonctions... Par exemple, dans ce code, quand on va vite ça ne fonctionne pas, parce que la souris ne touche plus aucun objet.

Code : Tout sélectionner

InitEngine3D()
InitSprite()

OpenWindow(0,0,0,1024,768,"Mouse picking")
OpenWindowedScreen(WindowID(0),0,0,1024,768,1,0,0)

CreateCamera(0,0,0,100,100)
CameraLocate(0,100,100,100)
CameraLookAt(0,0,0,0)

CreateCube(1,10)
CreateEntity(1,MeshID(1),#PB_Material_None,0,5,0)

CreateLight(0,$FFFFFF,0,100,0)
;WorldShadows(#PB_Shadow_Modulative)

Repeat
  event = WindowEvent()
  
  MousePick(0, WindowMouseX(0), WindowMouseY(0)) 
  EntityLocate(1,PickX(),5,PickZ())
    
  ClearScreen(0)
  RenderWorld()
  FlipBuffers()
Until event = #PB_Event_CloseWindow
Par contre, si je rajoute un fond, pas de souci, mais ça sautille, parce que le cube est testé ainsi que le plan si l'on déplace la souris trop vite.

Code : Tout sélectionner

InitEngine3D()
InitSprite()

OpenWindow(0,0,0,1024,768,"Mouse picking")
OpenWindowedScreen(WindowID(0),0,0,1024,768,1,0,0)

CreateCamera(0,0,0,100,100)
CameraLocate(0,100,100,100)
CameraLookAt(0,0,0,0)

CreatePlane(0,1000,1000,1,1,1,1)
CreateEntity(0,MeshID(0),#PB_Material_None,0,0,0,1) ; <- Créer un material invisible ici !

CreateCube(1,10)
CreateEntity(1,MeshID(1),#PB_Material_None,0,5,0)

CreateLight(0,$FFFFFF,0,100,0)
;WorldShadows(#PB_Shadow_Modulative)

Repeat
  event = WindowEvent()
  
  MousePick(0, WindowMouseX(0), WindowMouseY(0)) 
  EntityLocate(1,PickX(),5,PickZ())
    
  ClearScreen(0)
  RenderWorld()
  FlipBuffers()
Until event = #PB_Event_CloseWindow
Le code qui fonctionne est un peu plus bas :)
Dernière modification par djes le mer. 26/sept./2012 15:42, modifié 1 fois.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: MousePick()

Message par Fred »

MousePick() sert juste à renvoyer l'entité sous le click (si il y'en a une). Les coordonnées dans l'espace du pick sont renvoyées dans PickX/Y/Z
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MousePick()

Message par djes »

Oui oui, j'avais compris, c'est utilisé pour placer le cube. Pour corriger le petit saut, il faut ne tester que le plan. J'allais mettre le code qui fonctionne ici.

Code : Tout sélectionner

InitEngine3D()
InitSprite()

OpenWindow(0,0,0,1024,768,"Mouse picking")
OpenWindowedScreen(WindowID(0),0,0,1024,768,1,0,0)

CreateCamera(0,0,0,100,100)
CameraLocate(0,100,100,100)
CameraLookAt(0,0,0,0)

CreatePlane(0,1000,1000,1,1,1,1)
CreateEntity(0,MeshID(0), #PB_Material_None, 0, 0, 0, 1) ; Le masque du plan est défini sur 1

CreateCube(1,10)
CreateEntity(1,MeshID(1),#PB_Material_None, 0, 5, 0, 0) ; le masque du cube est défini sur 0

CreateLight(0,$FFFFFF,0,100,0)

Repeat
  
  Repeat 
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow : Quit = #True : EndIf
  Until Event = 0
  
  MousePick(0, WindowMouseX(0), WindowMouseY(0), 1) ;et du coup, on ne détecte que le plan, plus le cube, et ça ne saute plus...
  EntityLocate(1, PickX(), 5, PickZ())
    
  ClearScreen(0)
  RenderWorld()
  FlipBuffers()
  
Until Quit
C'est un peu sioux à comprendre, mais c'est bien pensé :)

Edit : corrigé la gestion de la file d'attente des événements
Dernière modification par djes le jeu. 27/sept./2012 9:26, modifié 1 fois.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: MousePick()

Message par Fred »

Oui, on est obligé d'avoir des masques pour filtrer ce qui doit etre pris en compte :). Sinon ta boucle WindowEvent() n'est pas bonne, il faut gerer tous les evenements à chaque tour, sinon ils vont s'empiler car pas dépilés assez vite.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MousePick()

Message par djes »

Ah oui tiens c'est vrai, merci ! M'enfin à la base l'exemple est de G-Rom :mrgreen: A sa décharge il a fait ça vite fait :P
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: MousePick()

Message par G-Rom »

djes a écrit :Ah oui tiens c'est vrai, merci ! M'enfin à la base l'exemple est de G-Rom :mrgreen: A sa décharge il a fait ça vite fait :P
Il y avait les masques dans mon exemple ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MousePick()

Message par djes »

Oui, heureusement, sinon je serais toujours à patauger :D
Merci !
Et n'oubliez pas d'améliorer la doc, parce que c'est pas encore très clair tout ça ; heureusement qu'il y a les exemples ! Vous jetez un sacré pavé dans la mare, faudrait pas s'arrêter en si bon chemin.

M'donne envie de faire qq démos :P
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: MousePick()

Message par comtois »

djes a écrit :Et n'oubliez pas d'améliorer la doc, parce que c'est pas encore très clair tout ça
Mesa fait un gros boulot là dessus, il traduit et met au nouveau standard la doc française. Je maintiens la doc en ligne au fur et à mesure à cette adresse :
http://purebasic.developpez.com/documentation/
Et le dernier chm (toujours grâce à Mesa) :
http://purebasic.developpez.com/documen ... eBasic.chm
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MousePick()

Message par djes »

comtois a écrit :
djes a écrit :Et n'oubliez pas d'améliorer la doc, parce que c'est pas encore très clair tout ça
Mesa fait un gros boulot là dessus, il traduit et met au nouveau standard la doc française. Je maintiens la doc en ligne au fur et à mesure à cette adresse :
http://purebasic.developpez.com/documentation/
Et le dernier chm (toujours grâce à Mesa) :
http://purebasic.developpez.com/documen ... eBasic.chm
C'est super, merci pour votre boulot, c'est vrai qu'avant je me référais plus souvent à la doc anglaise, maintenant, ce n'est plus nécessaire. :)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: MousePick()

Message par Patrick88 »

bonjour

très bon cet exemple, pile ce qu'il me fallait... en plus de ça, très court...

juste, comment faire pour que le cube ne suive pas le curseur ?
et pouvoir choisir/cliquer un cube parmis des cubes placés au zazar dans le dessin ?

merci

Pat
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: MousePick()

Message par comtois »

Patrick88 a écrit :juste, comment faire pour que le cube ne suive pas le curseur ?
et pouvoir choisir/cliquer un cube parmis des cubes placés au zazar dans le dessin ?
Regarde l'exemple MousePick.pb qui se trouve dans ton répertoire PureBasic sous /Examples/3D
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: MousePick()

Message par Patrick88 »

ok, vu merci.
Répondre