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

Mathématiques Discussion :

Problème de sin et de cos (lié a la position d'une caméra en opengl)


Sujet :

Mathématiques

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Problème de sin et de cos (lié a la position d'une caméra en opengl)
    Bonjour à tous !

    Mon prblème est sans doute relativement simple, mais comme d'habitue quand on a le nez dedans et qu'on rame depuis trop longtemps ... on ne vois rien !

    J'implémente une caméra pour mon prog openGL ( en 3D et en c++).
    Un mode 3eme personne, fonctionne parfaitement.

    Venons en au mode 1ere personne ( communément appeler FPS).

    Les fonctions qui déplacent ma caméra en Y et selon sa droite et s gauche, son avant et son arrière, marchent très bien.
    Les fonctions qui permettent de "tourner la tete" a droite et a gauche, en haut et en bas, marchent très bien aussi.

    Seul problème : l'initialisation de mes variables de calculs lorsque la position n'est pas 0,0,0 .
    En fait une seule variable me fait défaut.

    Je possède au départ :
    - la position de ma caméra en x,y,z
    - la direction en Y est de 0
    - le vecteur UP apres sera (0,1,0)
    - la focalisation initiale en x,y,z ( utile pour les calcul en z,x apres)

    Il me faut calculer :
    - un vecteur direction ( ou regarde la camera )
    - un vecteur UP, désignant le haut
    - un angle en Y, représentant le fait que l'on puisse sans bouger la caméra regarder en haut et en bas.
    - un angle X, ( enfin plutot : ZX ) qui sert a modéliser le fait que l'on puisse tourner la caméra a droite ou a gauche par rapport a sa direction actuelle .
    - un veteur Right , qui est juste le produit vectoriel de UP et de DIRECTION ... c'est donc la droite de notre caméra .

    La suele chose que je n'arrive pas à calculer c'est l'angle en X. Si je ne me trompe aps il va etre fonction de direction en Z et/ou en X, mais je ne vois pas le calcul exacte. ( en faisant des schea j'était arrivé à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_AngleX = acos(m_Direction.z);
    On ma suggérerde rajouter cela apres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	if(m_Direction.x<0)
    		m_AngleX += M_PI;
    Mais ca ne marche pas.

    Voila tout le code de ma fonction d'initialisation si cela eput vous aider. J'espère avoir été assez clair !

    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
     
    // Float's as param for position
    Camera::Camera(float x, float y, float z ) : m_DefaultFocus(0.0, 0.0, 0.0 ), m_Orientation(0.0,1.0, 0.0), m_Focalisation(&m_DefaultFocus) , m_Position( x, y, z ), m_Alpha(0), m_Phi(0), m_Norm(0), m_FpsMode(true),m_MouseXOld(-1), m_MouseYOld(-1), m_AngleX(0), m_AngleY(0)
    {
    	// 3D PERSON MODE
    	m_Norm = m_Position.Length();
    	m_Alpha = atan(std::abs(m_Position.z)/std::abs(m_Position.x));
    	m_Phi = acos(std::abs(m_Position.y)/m_Norm);
     
    	if( m_Position.y <0) 
    		m_Phi += (float)M_PI;
     
    	if ( m_Position.z <0)
    		m_Alpha += (float)M_PI ;
     
    	if ( m_Position.x <0)
    		m_Alpha += (float)M_PI ;
     
       while (m_Phi > M_PI)
    		m_Phi -= (float)(2*M_PI);
     
    	if ( m_Phi < 0 )
    		m_Orientation = Vector3D<float>(0.0,-1,0.0) ;
     
    	// FPS MODE
    	m_Up = m_Orientation ;
    	m_Direction =   *m_Focalisation - m_Position ;
    	m_Direction.y = 0 ;
    	m_Direction.Normalize();
    	m_Right = VectorCross(m_Up,m_Direction);
    	m_Right.Normalize();
     
    	m_AngleX = acos(m_Direction.z);
     
    	if(m_Direction.x<0)
    		m_AngleX += M_PI;
    }

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Clad3 Voir le message
    La suele chose que je n'arrive pas à calculer c'est l'angle en X. Si je ne me trompe aps il va etre fonction de direction en Z et/ou en X, mais je ne vois pas le calcul exacte.
    Hum... j'ai pas tout compris dans les explications mais, a priori, vu de dessus ca ressemble a un cercle trigo.



    Dans ton cas, les axes sont X et Z, et le centre du cercle représente la position de la camera. L'angle que tu cherches est "t" sur le schéma.

    si (z>0) t=acos(m_Direction.x); sinon t=2PI-acos(m_Direction.x);
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Mon sauveur ... je doit dire avoir essayé beaucoup de combinaisons de ce style mais je n'était jamais arrivé sur la bonne ... ( ralala maudite trigo )

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/09/2008, 10h48
  2. Réponses: 15
    Dernier message: 06/05/2008, 17h02
  3. Problème avec une caméra utilisant les quaternions
    Par Bakura dans le forum Développement 2D, 3D et Jeux
    Réponses: 17
    Dernier message: 15/12/2007, 19h26
  4. Réponses: 4
    Dernier message: 27/11/2007, 15h32
  5. Réponses: 7
    Dernier message: 01/05/2007, 21h46

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