Bonjour,
Comment détecter les coordonnées de la souris et les transformer en coordonnées OpenGL?
Bonjour,
Comment détecter les coordonnées de la souris et les transformer en coordonnées OpenGL?
bonjour,
dans quel langage de programmation travail tu ?
voila un exemple pour JOGL :
sinon avec C++ tu peut utiliser les fonction de la SDL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int x = e.getX(); int y = e.getY(); Dimension size = e.getComponent().getSize(); float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width); float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height); prevMouseX = x; prevMouseY = y; view_rotx += thetaX; view_roty += thetaY;
OpenGL n'a aucune connaissance des inputs clavier/souris, ce sont des librairies de plus haut niveau qui fournissent ces données (glut, SDL, DirectInput, serveur X, ...)
Avec quelle librairie initialises-tu OpenGL ?
Concernant la transformation en coordonnées OpenGL, que souhaites-tu faire exactement ? De la sélection d'objet ?
Merci pour vos réponse,
En fait j'utilise JOGL.
J'ai implémenté un exemple qui existe sur le net. Il permet de détecter les coordonnées de la souris (avec mouse move par exemple), mais il donne des coordonnées à la mains pour z (o ou 1) pour pouvoir calculer x et y.
J'ai trouvé dans l'exemple ici de nehe une instruction "glReadPixels()" pour calculer la valeur de Z. Mais j'ai toujours un message d'erreur :
Je sais pas comment activer le pixel_buffer_object.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Exception in thread "AWT-EventQueue-1" javax.media.opengl.GLException: pack pixel_buffer_object must be enabled to call this method
J'ai utilisé le code suivant pour détecter la position x, y, z de la souris:
Sachant que la valeur de depth est calculée en utilisant l'instruction suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 public void mouseMoved(MouseEvent e) { mouseX= e.getX(); mouseY = e.getY(); mouseZ=0; /* note viewport[3] is height of window in pixels */ realy = viewport[3] - (int) mouseY - 1; glu.gluUnProject((double) mouseX, (double) realy,buffer.getFloat(0), // mvmatrix, 0, projmatrix, 0, viewport, 0, wcoord, 0); DecimalFormat df = new DecimalFormat ( ) ; df.setMaximumFractionDigits ( 3 ) ; //arrondi à 2 chiffres apres la virgules // df.setMinimumFractionDigits ( 3 ) ; //df.setDecimalSeparatorAlwaysShown ( true ) ; CoordinatesTextField.setText( df.format(wcoord[0] + model3D.getBarycenter().getX())+"; " + df.format(wcoord[1] +model3D.getBarycenter().getY())+ "; " + df.format(wcoord[2]+model3D.getBarycenter().getZ()) ); }
Mais en bougeant la souris, que X et Y changenet et Z reste fixe. Et lorsque je fais une rotation du modèle j'ai toujours les mèmes X, et Y. Donc, les coordonnées sont prises par rapport à l'écran et non pas par rapport au modèle. Avez vous une idée comment peut-on corriger ces problémes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part gl.glReadPixels( mouseX, (int)mouseY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, buffer );
Le probléme est résolu, et voilà le code pour ceux qui sont intéressés. Il s'agit d'une fonction qui stocke les coordonnées de la souris dans un JtextField:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 void GetOGLPos(int x, int y, JTextField textField) { double winX, winY,winZ; java.nio.ByteBuffer buffer = BufferUtil.newByteBuffer(4); double position[]=new double[3];; gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0); gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0); gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0); gl.glEnable(GL.GL_DEPTH_TEST); winX = (float)x; winY = (float)viewport[3] - (float)y; gl.glReadPixels( x, (int)winY, 1, 1, GL.GL_DEPTH_COMPONENT, GL.GL_FLOAT, buffer ); glu.gluUnProject((double) winX, (double) winY, (double)buffer.getFloat(), // mvmatrix, 0, projmatrix, 0, viewport, 0, position, 0); DecimalFormat df = new DecimalFormat ( ) ; df.setMaximumFractionDigits ( 3 ) ; //arrondi à 2 chiffres apres la virgules textField.setText( df.format(position[0] + model3D.getBarycenter().getX())+" || " + df.format(position[1] +model3D.getBarycenter().getY())+ " || " + df.format(position[2]+model3D.getBarycenter().getZ()) ); } } // End class
Partager