Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > API graphiques > OpenGL
OpenGL Forum d'entraide sur le développement en OpenGL. Avant de poster -> FAQ OpenGL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 15h16   #1
Membre habitué
 
Aycha Aycha
Développeur informatique
Inscription : octobre 2010
Messages : 326
Détails du profil
Informations personnelles :
Nom : Aycha Aycha
Âge : 26
Localisation : Tunisie

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2010
Messages : 326
Points : 120
Points : 120
Par défaut Zoom avec Sélection

Bonjour,
je suis débutante en OpenGl, je veux mettre en place un petit viewer de nuage de points.
Je programme sous visual c++.
j'aime réaliser un zomm sur une partie déjà sélectionnée avec la sourie, donc j'ai penser à faire un zoom puis une translation pour placer la partie sélectionnée au centre de l'écran.
la première fois donne des bons résultats mais si je répète l'opération, l'affichage sera décalé

Code :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
void COpenGL::Mouse(int button, int state, int x, int y)
{
	_mouseX = x;
	_mouseY = y;
 
	ctrl_pressed = false;
 
	switch (glutGetModifiers()) // on détecte l'appuis sur CTRL ou SHIFT
	{
		case GLUT_ACTIVE_CTRL:
			ctrl_pressed = true;
			break;
    }
 
    if (state==GLUT_UP)
	{
        switch (button)
        {
            case GLUT_LEFT_BUTTON:
				{
					xSelectedZone2=x;
					ySelectedZone2=y;
 
					if (ctrl_pressed)
					{
						double tmpx2=(xSelectedZone1+xSelectedZone2)/2;
						double tmpy2=(ySelectedZone1+ySelectedZone2)/2;
						//Calculer le rapport de zoom
						double ss1 = window_x/(double)abs(xSelectedZone1-xSelectedZone2);
						double ss2 = window_y/(double)abs(ySelectedZone1-ySelectedZone2);
 
							scale=min(ss1,ss2);
						}
						glScaled(scale,scale,scale);
 
						Transform2Dto3D(tmpx2, tmpy2, tx2, ty2, tz2);
						Transform2Dto3D(tmpx1, tmpy1, tx1, ty1, tz1);
 
						tx+=(tx2-tx1)*ss;
						ty+=(ty2-ty1)*ss;
						tz+=(tz2-tz1)*ss;
 
						glTranslated(-tx, -ty, -tz);
 
						glutPostRedisplay();
					}
				}
				break;
		}
	}
    else
	{
        switch (button)
        {
            case GLUT_LEFT_BUTTON:
 
				{
					xSelectedZone1=x;
					ySelectedZone1=y;
				}
				break;
		}
	}
}
Je ne comprend pas pourquoi il y a un décalage dans l'affichage de la zone sélectionnée.
Comment je peux corriger l'affichage??

Merci d'avance
3aychoucha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 19h41   #2
Invité de passage
 
Inscription : novembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2011
Messages : 9
Points : 4
Points : 4
Pour glutGetModifiers() il vaut mieux l'utiliser comme suit:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    int active_mod;
    active_mod = glutGetModifiers();
 
    if (active_mod & GLUT_ACTIVE_CTRL)
    {
        ctrl_pressed = true;
    }
 
    if (active_mod & GLUT_ACTIVE_SHIFT)
    {
    }
 
    if (active_mod & GLUT_ACTIVE_ALT)
    {
    }
En effet comme tu peux le voir il s'agit d'un champ de bits et non d'un enum.

Ensuite je ne suis pas rentré dans le détail de ton code sur la modification de la matrice MODELVIEW, mais il y a tout de même un truc que j'ai remarqué et qui est peut-être ("PEUT-ÊTRE") à l'origine de ton problème. D'après l'extrait que je vois j'ai l'impression que tu concerves le contenu de ta matrice MODELVIEW d'une frame sur l'autre et que tu la modifies non pas en repartant de zéro (une matrice identité) mais en reprenant sa précédente valeur. Selon moi (peut-être que tout le monde ne sera pas d'accord) c'est une méthode risquée et source d'erreurs. Selon moi toujours il vaut mieux avoir des variables qui représentent le point de vue, et recréer la matrice ModelView à partir de ces variables à chaque frame, c'est à dire en débutant avec glLoadIdentity(); puis avec les appels nécessaires à glScale / glRotate / glTranslate. En plus c'est plus facile à deboguer car on peut afficher ces variables et comprendre ce qui ne va pas, tandisqu'en gardant la matrice ModelView que l'on modifie à chaque fois il sera difficile de trouver l'origine du problème.
coupecoupe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web