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 :

[OpenGL]classe camera: mouvement(surtout la rotation) bizarre


Sujet :

OpenGL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut [OpenGL]classe camera: mouvement(surtout la rotation) bizarre
    Salut,
    j'ai implementé ma propore classe camera utilisant opengl, mais je costate que le mouvement est un peu ... bizarre .
    je sens que je ne suis pas tout a fait à l'aise quand je me deplace dans la scene, mais je ne sais pas pourquoi.
    Voici camera.h:
    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
    #ifndef CAMERA_H_INCLUDED
    #define CAMERA_H_INCLUDED
     
    #include "Vector3D.h"
    #include <math.h>
    #include <SFML/Window.hpp>
    #include <GL/gl.h>
    #include <GL/glu.h>
     
     
    class Camera {
    public:
        Camera(const Vector3D& = Vector3D(0, 0, -100));
        void Translate(const double, const double);
     
        void OnEvent(const sf::Input& , const double dt);
        void Look();
     
    protected:
        void VectorFromAngles();
     
        Vector3D m_position;//position in the world
        Vector3D m_target;
        //directions
        Vector3D m_forward;
        Vector3D m_left;
        Vector3D m_up;
     
        //the traget of the camera
        Vector3D m_traget;
     
        //rotation
        double m_theta;
        double m_phi;
        double m_speed;
     
        double m_pi;
     
        double m_oldX;
        double m_oldY;
    };
    et le camera.cpp:
    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
    #include "Camera.h"
     
    Camera::Camera(const Vector3D& position): m_position(position), m_up(0, 1, 0), m_forward(0, 0, 1), m_left(1, 0, 0) {
        m_speed = .1;
        m_oldX = -1;
        m_oldY = -1;
     
        m_pi = 3.14;
     
        m_theta = 0;
        m_phi = 0;
     
    }
     
     
    void Camera::Translate(const double x, const double z) {
        m_position += m_left * x;
        m_position += m_forward * z;
    }
     
     
     
    void Camera::VectorFromAngles() {
        double xTemp = cos(m_theta * M_PI / 180);
     
        m_forward.Y = sin(m_theta * M_PI / 180);
        m_forward.X = cos(m_phi * M_PI / 180) * xTemp;
        m_forward.Z = sin(m_phi * M_PI / 180) * xTemp;
     
     
        m_left = m_up.crossProduct(m_forward).normalize();
     
        m_target = m_position + m_forward;
    }
     
     
    void Camera::Look() {
        gluLookAt(
            m_position.X, m_position.Y, m_position.Z,
            m_target.X, m_target.Y, m_target.Z,
            m_up.X, m_up.Y, m_up.Z
        );
     
    }
     
    void Camera::OnEvent(const sf::Input& input, const double dt) {
        double z = 0, x = 0, y = 0;
        if ( input.IsKeyDown(sf::Key::Z) )
            z += m_speed * dt;
        if ( input.IsKeyDown(sf::Key::S) )
            z -= m_speed * dt;
        if ( input.IsKeyDown(sf::Key::Q) )
            x += m_speed * dt;
        if ( input.IsKeyDown(sf::Key::D) )
            x -= m_speed * dt;
     
        Translate(x, z);
     
     
        x = input.GetMouseX();
        y = input.GetMouseY();
        if (m_oldX < 0) m_oldX = x;
        if (m_oldY < 0) m_oldY = y;
     
        m_phi += (x - m_oldX) * dt * m_speed * 0.1;
        m_theta -= (y - m_oldY) * dt * m_speed *  0.1;
        VectorFromAngles();
        m_oldX = x;
        m_oldY = y;
     
     
     
    }
    PS: j'utilise SFML pour le fenetrage, meme si je doute que cela puiise vraiment aider!

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 531
    Points : 5 208
    Points
    5 208
    Par défaut
    tu pourrais détailler le côté bizarre du mouvement ?
    sacades ? imprécis ?

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 204
    Points : 67
    Points
    67
    Par défaut
    ben, il est u tout petit peu imprécis, ce qui est assez genenat.

  4. #4
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Avoir un comportement "imprécis" ne nous explique pas ce qu'elle fait ...

    Elle sautille, elle avance par saut, la avance dans la mauvaise direction, elle change tout à coup de direction ???

    Qu'est qu'elle te fait ?

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

Discussions similaires

  1. Opengl sous java : Mouvement camera
    Par Deesmon dans le forum OpenGL
    Réponses: 8
    Dernier message: 26/03/2010, 20h04
  2. Réponses: 3
    Dernier message: 25/05/2008, 14h15
  3. Class camera : problème
    Par casafa dans le forum OpenGL
    Réponses: 1
    Dernier message: 30/08/2006, 10h29
  4. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  5. Réponses: 4
    Dernier message: 31/03/2005, 10h33

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