2010-11-02 25 views
4

Je souhaite implémenter un algorithme zoom-to-mouse-position-with-scrollwheel pour une application CAO sur laquelle je travaille.Zoom sur la position de la souris dans OpenGl

question similaires ont été posées (This one par exemple), mais toutes les solutions que j'ai trouvé utilisé le

  1. Traduire à l'origine
  2. échelle pour zoomer
  3. retraduire

approche . Bien que cela fonctionne en principe, cela conduit à couper des objets sur des niveaux de zoom élevés car ils deviennent plus grands que le volume de visionnage. Une solution plus élégante serait de modifier la matrice de projection pour le zoom.

J'ai essayé de l'implémenter, mais j'ai seulement obtenu un zoom au centre de la fenêtre.

glGetIntegerv(GL_VIEWPORT, @fViewport); 
//convert window coordinates of the mouse to gl's coordinates 
zoomtoxgl := mouse.zoomtox; 
zoomtoygl := (fviewport[3] - (mouse.zoomtoy)); 
//set up projection matrix 
glMatrixMode(GL_PROJECTION); 
glLoadidentiy; 
left := -width/2 * scale; 
right := width/2 * scale; 
top := height/2 * scale; 
bottom := -height/2 * scale; 
glOrtho(left, right, bottom, top, near, far); 

Mes questions sont les suivantes: Est-il possible d'effectuer un zoom sur un point arbitraire en utilisant la matrice de projection seule dans une vue orthographiques, et si oui, comment la position cible de zoom peut être pris en compte dans la matrice de projection?

Mise à jour J'ai changé mon code pour

zoomtoxgl := camera.zoomtox; 
zoomtoygl := (fviewport[3] - camera.zoomtoy); 
dx := zoomtoxgl-width/2; 
dy := zoomtoygl-height/2; 
a := width * 0.5 * scale; 
b := width * 0.5 * scale; 
c := height * 0.5 * scale; 
d := height * 0.5 * scale; 

left := - a - dx * scale; 
right := +b - dx * scale; 
bottom := -c - dy * scale; 
top := d - dy * scale; 
glOrtho(left, right, bottom, top, -10000.5, Camera.viewdepth); 

qui a donné ce résultat:

Zooming issues

lieu de mise à l'échelle autour de la position du curseur, je peux savoir déplacer l'origine du monde à n'importe quel endroit de l'écran que je souhaite. C'est bien d'avoir, mais pas ce que je veux. Comme je suis bloqué depuis un certain temps maintenant, je me demande: un zoom relatif à une position d'écran arbitraire peut-il être généré en modifiant simplement la matrice de projection? Ou devrais-je modifier ma matrice Modelview après tout?

Répondre

1

Que diriez-vous de changer vos valeurs pour gauche/droite/haut/bas pour refléter où la souris est?

Quelque chose comme:

left := zoomtoxgl - width/2 * scale; 
right := zoomtoxgl + width/2 * scale; 
top := zoomtoygl + height/2 * scale; 
bottom := zoomtoygl - height/2 * scale; 
glOrtho(left, right, bottom, top, near, far); 

Vous aurez probablement besoin d'ajuster l'échelle pour cet usage. J'ai vu leur exemple dans cette réponse, avec 8.040 How do I implement a zoom operation?.

+0

Merci pour l'idée. J'ai jonglé avec les coordonnées et l'échelle de ma souris, mais la meilleure chose que j'ai réussi jusqu'ici était de déplacer l'origine de ma scène (0,0,0 en coordonnées du monde) à la position de la souris. Je vais essayer votre suggestion, car je ne suis pas sûr si j'ai essayé cette variante. – sum1stolemyname

+0

J'ai essayé - cela conduit à un comportement similaire: l'origine des scènes est décalée vers la position de la souris. – sum1stolemyname

+0

@ sum1, je ne suis pas sûr de ce que cela signifie. Pouvez-vous poster une capture d'écran? – LarsH