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 :

Class Caméra -> vecteur position & pointeur


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut Class Caméra -> vecteur position & pointeur
    Bonjour,

    Pour me déplacer dans l'espace, j'ai mis au point une classe Caméra sans vecteurs ( exemple -> pour la position de la caméra on a px,py,pz ).

    J'aimerais rendre ça plus rigoureux et utiliser des vecteurs. Seulement, j'ai quelques problèmes pour m'en sortir avec les pointeurs ou références.

    Voici une partie de mon 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
    26
    27
    28
    29
    8  #include <vector>
     
    10  using namespace std;
     
    12  class Camera
    {
    14  private:
     
    16	// Vecteur position de la caméra (px,py,pz) :
    17      vector<float> positionCam(3);
     
    19      // Angle de rotation de la caméra :
    20      float angle;
     
    public:
     
    24      Camera(vector<float>& positionCam, float angle);
             void avance();
    26      void recule();
             void deplacementLateralG();
    28      void deplacementLateralD();
             void rotationG();
    30      void rotationD();
             vector<float>* getpositionCam(void);
    32      float getangle(void);
             void setangle(float m);
     
     
    };
    Puis un bout de mon .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
    3  #include <vector>
     
    5  using namespace std;
     
    7  Camera::Camera(vector<float>& positionCam, float angle)
    {
    9      this->positionCam[0]=positionCam[0];
            this->positionCam[1]=positionCam[1];
    11     this->positionCam[2]=positionCam[2];
            this->angle=angle;
    }
     
    15  void Camera::avance()
    {
        this->positionCam[0] += 0.1F*sin(angle);
        this->positionCam[2] += 0.1F*cos(angle);
    }
     
    49  float Camera::getpositionCam(void)
    {
    	return this->*positionCam;
    }
    Mais bon, j'ai de nombreuses erreurs du genre :

    error C2059: erreur de syntaxe*: 'constant' camera.h 17

    error C3867: &'Camera::positionCam'*: liste d'arguments manquante dans l'appel de fonction*; utilisez 'Camera::positionCam' pour créer un pointeur vers membre camera.cpp

    error C2109: un indice requiert un type tableau ou pointeur camera.cpp 9
    error C2040: 'Camera::getpositionCam'*: les niveaux d'indirection de 'float (void)' et de 'std::vector<_Ty> *(void)' sont différents camera.cpp 50

    error C2556: 'float Camera::getpositionCam(void)'*: la fonction surchargée ne diffère que par le type de retour de 'std::vector<_Ty> *Camera::getpositionCam(void)' camera.cpp 50
    Voila, ces erreurs se répètent un bon nombre de fois -> 26 erreurs en tout de ce genre. Je pense que c'est un problème de compréhension sur les pointeurs et références que je n'ai pas correctement assimilé.
    J'ai eu beau faire des recherches pour voir des exemples de vecteur entrer en paramètres de fonctions ou retourner mais malgré tout j'ai du mal à me corriger :s

    En espérant que vous pourriez m'aider Merci beaucoup !

  2. #2
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut,

    Sur developpez il y a de la doc sur les conteneurs et donc sur les vector de la STL va y faire un tour c'est bien expliqué.

    Après les erreurs que je vois au premier coup d'oeil.
    Dans ton header il faut seulement déclarer les variables et les méthodes de ta classe et rien d'autre (pas d'initialisation, pas d'appel aux constructeurs particuliers...)

    Or dans la déclaration de ta classe quand tu déclares ton vector<flaot> tu fais en même temps appel à un constructeur (autre que le constructeur par défaut) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    16	// Vecteur position de la caméra (px,py,pz) :
    17      vector<float> positionCam(3); //Erreur appel d'un constructeur de vector autre que le constructeur par défaut
    Il faut seulement déclarer tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    16	// Vecteur position de la caméra (px,py,pz) :
    17      vector<float> positionCam; //déclaration de ma variable de type vector<float> (constructeur par defaut)
    si tu veux initialiser ton vecteur avec 3 coordonnées il faut le spécifier dans le constructeur de ta classe en rajoutant dans Camera::Camera() :
    En suite dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float Camera::getpositionCam(void)
    {
    	return this->*positionCam;
    }
    Ici il y a plusieurs erreurs. Ta fonction retourne un float donc une valeur or si j'ai bien compris tu souhaites retournée l'ensemble de tes coordonnées de ton vector surement par adresse, c'est donc plus avec un retour float* de ta fonction.
    Ensuite tu retourne this->*positionCam la je sais pas trop ce que ca retourne mais ca retourne pas ce que tu souhaites retourner

    Pour faire simple, il faut retourner l'adresse de la première coordonnée de ton vecteur, ce qui donne la fonction getPosition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float *Camera::getpositionCam(void)
    {
    	return &(this->positionCam[0]);
    }

    Il y a des tutoriels sur les pointeur et référence ainsi que des faq sur developpez, le mieux c'est d'y aller faire un tour, ca sera surement plus claire que mes pseudo explications.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Merci Robxley pour ton aide !

    J'ai pu corriger de nombreuses erreurs ! il m'en reste une seule correspondant au bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<float>* Camera::getpositionCam(void)
    {
    	return this->positionCam[0];
    }
    error C2440: 'return'*: impossible de convertir de 'float' en 'std::vector<_Ty> *'
    J'ai modifié ton float* en vector<float>* car je veux en fait que la fonction getpositionCam me retourne le vecteur position de la caméra (après je sais pas si on peut faire un "return" sans retourner le pointeur vers le vecteur ou seulement le vecteur sans pointeur dessus :s

    Sinon oui je vais me mettre à un tuto pour plus de compréhension sur le sujet !

    Je vous remercie !

    J'édite car j'ai essayé la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vector<float>* Camera::getpositionCam(void)
    {
        vector<float>* position = NULL;
        (*position)[0] = positionCam[0];
        (*position)[1] = positionCam[1];
        (*position)[2] = positionCam[2];
     
        return position;
    }
    Mais j'ai deux nouvelles erreurs que sont :

    error LNK2019: symbole externe non résolu _main référencé dans la fonction ___tmainCRTStartup MSVCRTD.lib

    fatal error LNK1120: 1 externes non résolus
    Ces messages d'erreurs n'ont pas l'air trés sympa :p

    Si vous avez des idées n'hésitez pas ! Merci

  4. #4
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Encore moi,

    Dans ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<float>* Camera::getpositionCam(void)
    {
    	return this->positionCam[0];
    }
    Ici ce que tu fais c'est que tu retournes la valeur de la première coordonnée de ton vecteur et non le vecteur lui même.

    Si tu veux retourner l'adresse du vecteur lui même, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<float>* Camera::getpositionCam(void)
    {
    	return &(this->positionCam); //retourne l'adresse de ta variable positionCam
    }
    un bref rappel sur les adresses :
    le & devant une variable permet de retourner l'adresse de cette variable(1).
    le * devant une adresse permet de retourner la valeur de la variable situé à l'adresse indiquée(2). A ne pas confondre avec la déclaration d'une adresse qui est précédé du type de l'objet sur le quel pointe l'adresse(3).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int * adresse_sur_int; // (3) déclaration d'une adresse pointant sur un int
    int mon_entier = 10;
    adresse_sur_int = &mon_entier; //(1) enregistre l'adresse de ma variable mon_entier
    cout<< (*adresse_sur_int);//(2) affiche la valeur de l'entier à l'adresse adresse_sur_int, la valeur entier à cette adresse est 10.
    En espérant que ce soit un peu plus claire, mais le mieux c'est d'aller voir les faq et le tutoriel de developpez


    Ensuite pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vector<float>* Camera::getpositionCam(void)
    {
        vector<float>* position = NULL;
        (*position)[0] = positionCam[0];
        (*position)[1] = positionCam[1];
        (*position)[2] = positionCam[2];
     
        return position;
    }
    Il y a pas mal d'erreur, du au fait de la mauvaise compréhension des adresses/pointeurs.

    Quand tu déclares :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     vector<float>* position = NULL;
    ton pointeur position pointe sur aucune adresse (NULL);

    Donc toutes opération sur est aberrant.

    Voilà en espérant que ca soit plus claire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 14
    Par défaut
    Merci encore Robxley je comprends mieux maintenant

    Par contre j'aurais voulu savoir :

    Comment fait-on pour faire un produit scalaire de deux vector ? il existe une fonction pour faire ça ? (j'ai fait des recherches et j'ai vu "dot" mais j'ai testé et s'est introuvable comme identificateur...)


    Merci !

  6. #6
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    je crois que tu confonds un vecteur (structure cpp) et un vecteur mathématiques. Tu peux effectivement stocker un vecteur mathématiques dans un vecteur C++, comme tu l'as fait, mais t'auras aucune fonctionnalité dans la lib standard pour les manipuler, c'est 2 choses complètement différentes.
    Tu devrais chercher une classe Vector sur le net, tu verras un peu les fonctions qu'il y a dedans et comment sont stockées les coordonnées.

    Sinon pour le dot product, tu multiplies simplement les coordonnées de 2 vecteurs, en 2d ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public float dotProduct(Vector2d vector)	{
    	return (this.x * vector.getX() + this.y * vector.getY());
    }
    J'ajouterais qu'utiliser un vector pour stocker un vecteur est inutile, autant utiliser un tableau. T'as pas besoin des fonctions dynamiques car ton vecteur fera toujours la même taille.

Discussions similaires

  1. prb tellg() deplace la position du pointeur
    Par neismarspra dans le forum C++
    Réponses: 2
    Dernier message: 01/08/2008, 21h02
  2. [vecteur] adresse et pointeur
    Par ZaaN dans le forum C++
    Réponses: 1
    Dernier message: 28/03/2007, 15h15
  3. changer de class de style selon la position du pointeur
    Par yann_p dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/08/2006, 18h38
  4. vecteur/tableau de pointeur?
    Par anykeyh dans le forum SL & STL
    Réponses: 2
    Dernier message: 29/03/2006, 13h20
  5. Réponses: 2
    Dernier message: 06/02/2006, 23h15

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