IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Zoom et rafraîchissement


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut Zoom et rafraîchissement
    Bonjour

    J'ai un problème dans ce petit code Java5 avec JOGL.
    Je cherche à faire un zoom avec la souris. Toutefois, à la moindre action, mon objet disparaît.
    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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package test;
     
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseWheelEvent;
    import javax.swing.*;
     
    import javax.media.opengl.*;
    import javax.media.opengl.glu.*;
     
    import com.sun.opengl.util.*;
    import java.awt.event.MouseMotionListener;
    import java.awt.event.MouseWheelListener;
     
    public class Test extends JFrame{
     
        public GLCanvas canvas;
     
        public Test(){
            super();
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setMinimumSize(new java.awt.Dimension(640, 480));
            canvas = new GLCanvas();
            canvas.addGLEventListener(new Render(this));
            this.getContentPane().add(canvas);
            canvas.requestFocusInWindow();
        }
     
        public void refresh(){
            this.canvas.display();
        }
     
        public static void main(String[]args){
            new Test().setVisible(true);
        }
     
    }
     
    class Render implements GLEventListener, MouseMotionListener, MouseWheelListener{
     
        Test mw;
        private float zoom = 1f;
     
        public Render(Test test){
            this.mw = test;
        }
     
        public void init(GLAutoDrawable arg0) {
            final GL gl = arg0.getGL();
            gl.glShadeModel(GL.GL_SMOOTH); // Enable Smooth Shading
            gl.glClearColor(1f, 1f, 1f, 1f);
            gl.glClearDepth(1.0f);
            gl.setSwapInterval(1);
            arg0.addMouseWheelListener(this);
        }
     
        public void display(GLAutoDrawable arg0) {
            final GL gl = arg0.getGL();
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
            gl.glTranslatef(0f, 0f, zoom);
            gl.glColor3f(0f, 0f, 1f);
            gl.glBegin(GL.GL_POLYGON);
            gl.glVertex3f(-0.5f, 0.5f, 0f);
            gl.glVertex3f(0.5f, 0.5f, 0f);
            gl.glVertex3f(0.5f, -0.5f, 0f);
            gl.glVertex3f(-0.5f, -0.5f, 0f);
            gl.glEnd();
            gl.glFlush();
        }
     
        public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
            final GL gl = arg0.getGL();
            gl.glViewport(0, 0, arg3, arg4);
            gl.glMatrixMode(GL.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrtho(-2.5f * arg3 / arg4 * zoom, 2.5f * arg3 / arg4 * zoom, -2.5f * zoom, 2.5f * zoom, -5f * zoom, 5f * zoom);
            gl.glMatrixMode(GL.GL_MODELVIEW);
            gl.glLoadIdentity();
        }
     
        public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
        }
     
        public void mouseDragged(MouseEvent arg0) {
        }
     
        public void mouseMoved(MouseEvent arg0) {
        }
     
        public void mouseWheelMoved(MouseWheelEvent arg0) {
            if (arg0.getWheelRotation() == 1) {
                zoom += 0.05f;
            } else {
                zoom -= 0.05f;
            }
            this.mw.refresh();
        }
     
    }
    Comment trouver une solution ?
    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    oula, erreure, tu ne fait pas un zoom ici, tu fait une translation vers l'objet, et donc la camera peut le depasser...
    pour faire un vrai zoom, il faut juste faire appel à glOrtho/glFrustum avec un angle de camera plus petit, ce que tu ne fait pas ici à priori vu qu'il n'y a pas d'appel a reshape lors de ton zoom...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Ok, merci bafman pour ta réponse.
    Mais, sans te commander, aurais-tu un petit snippet ?
    J'ai ajouté glFrustum dans ma routine reshape, mais guère d'effet.
    Merci encore à toi.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    salut David,

    dans mon projet j'utilise GLOrtho et je fais mon zoom à cet endroit là. Voilà le code:
    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
     
    void BGLWindow::SetView()
    {
    	// Retrieve the new window's rectangle (it has already been resized)
    	GetClientRect(m_hwnd, &m_winRect);
     
    	// If we have a valid rectangle, calculate corresponding aspect ratio
        if (m_winRect.bottom)
    		m_aspectRatio = ((GLdouble) m_winRect.right) / m_winRect.bottom;
     
    	// Set an OpenGL viewport of corresponding size
    	glViewport(0, 0, m_winRect.right - m_winRect.left,
    					 m_winRect.bottom - m_winRect.top);
     
    	// Apply an orthogonal projection taking the scene size, aspect ratio
    	// and zoom factor into account
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glOrtho(-m_sceneSize*m_sceneZoom,				  m_sceneSize*m_sceneZoom,
                -m_sceneSize*m_sceneZoom / m_aspectRatio, m_sceneSize*m_sceneZoom / m_aspectRatio,
                -m_sceneSize*1.1,						  m_sceneSize*1.1); 
     
    	// Switch to modelview matrix to prepare for drawing 
    	glMatrixMode(GL_MODELVIEW);
    }
    tu n'as pas besoin de tout ca, mais pour résumer il te suffit de multiplier les parametres left, right, top et bottom de glOrtho par ta valeur zoom et c'est bon

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 895
    Par défaut
    Bonjour, c'est une solution que j'avais déjà essayé mais qui ne me convient pas.
    Néanmoins, merci quand même de ta suggestion.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    dans ton code, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gl.glOrtho(-2.5f * arg3 / arg4 * zoom, 2.5f * arg3 / arg4 * zoom, -2.5f * zoom, 2.5f * zoom, -5f * zoom, 5f * zoom);
    et aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gl.glTranslatef(0f, 0f, zoom);
    je dirais qu'il faut soit l'un, soit l'autre, et si tu utilises la 1ere version il ne faut pas appliquer le zoom aux deux derniers parametres, qui sont les plans de clipping "near" et "far"...c'est sûrement ca qui fait disparaitre ton objet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. visualisation et zoom d'une image
    Par julie20 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/08/2003, 03h28
  2. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40
  3. [VB6][Graphisme] Zoom
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/10/2002, 17h30
  4. Zoom avec du TJPEG
    Par Thylia dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2002, 16h03
  5. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo