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
- Traduire à l'origine
- échelle pour zoomer
- 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:
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?
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
J'ai essayé - cela conduit à un comportement similaire: l'origine des scènes est décalée vers la position de la souris. – sum1stolemyname
@ sum1, je ne suis pas sûr de ce que cela signifie. Pouvez-vous poster une capture d'écran? – LarsH