Page 1 sur 1

MousePick()

Publié : mer. 26/sept./2012 15:17
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 :)

Re: MousePick()

Publié : mer. 26/sept./2012 15:24
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

Re: MousePick()

Publié : mer. 26/sept./2012 15:40
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

Re: MousePick()

Publié : mer. 26/sept./2012 16:39
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.

Re: MousePick()

Publié : mer. 26/sept./2012 19:47
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

Re: MousePick()

Publié : mer. 26/sept./2012 19:54
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 ;)

Re: MousePick()

Publié : mer. 26/sept./2012 20:24
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

Re: MousePick()

Publié : mer. 26/sept./2012 20:54
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

Re: MousePick()

Publié : mer. 26/sept./2012 22:06
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. :)

Re: MousePick()

Publié : dim. 25/nov./2012 12:20
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

Re: MousePick()

Publié : dim. 25/nov./2012 16:14
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

Re: MousePick()

Publié : dim. 25/nov./2012 16:21
par Patrick88
ok, vu merci.