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 :

split screen - Gestion de la camera avec glViewPort


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 34
    Par défaut split screen - Gestion de la camera avec glViewPort
    Bonjour,

    J'ai commencer il y a quelques semaines un projet de bomberman réalisé en C++ avec openGL. Je suis en train d'implementer un mode split-screen pour pouvoir jouer à 2. Seulement ca me pose pas mal de problème notemment sur l'utilisation de la fonction openGL "glViewPort".

    Voici un extrait 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
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
      std::list<AObject*>::iterator itb = this->objects_.begin();
     
      glViewport (0, 0, 1920/2, 1080);
     
       for (; itb != this->objects_.end(); ++itb) // Ici c'est la liste des objets (par exemple un bloc, un joueur ...) que l'on parcoure pour l' ecran 1
        {
          if ((*itb)->getGoDraw())
            (*itb)->draw();
        }
      itb = this->objects_.begin();
      glViewport (1920/2, 0, 1920/2, 1080);
      for (; itb != this->objects_.end(); ++itb) // la meme chose pourl l'ecran 2                                                                                                                                                   
        {
          if ((*itb)->getGoDraw())
            (*itb)->draw();
        }
      this->window_.display();
    La gestion des cameras se fait dans le déplacement du joueur sur la map, en gros à chaque fois qu'on bouge le joueur1 on va bouger la caméra 1 de même pour le joueur 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void    MyGame::changePosCamera(float x, float y, float z, int player) // cette fonction est appellé par le joueur (qui est un objet), on définit si c'est le joueur 1 ou le joueur 2 à la construction du joueur
    {
      if (player == 1)
        this->cameraJ1.setPositionCamera(x, y, z);
      if (player == 2)
        this->cameraJ2.setPositionCamera(x, y, z);
    }
    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
     
    void Camera::setPositionCamera(float _x, float _y, float _z)
    {
      this->lengthView = 20;
      position_.x = _x + 1200;
      position_.y = _y + 500;
      position_.z = _z;
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();                                                                                                                                                                               
      gluPerspective(this->lengthView, 450.0f/400.0f, 1.0f, 20000.0f);
     
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
     
      gluLookAt(position_.x, position_.y, position_.z,
                position_.x, 0, position_.z,                                                                                                                                                         
                0.0f, 1.0f, 0.0f);
     
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_LEQUAL);
    }
    J'ai donc setté une caméra pour chaque joueur, mais le problème ici c'est qu'il se passe exactement la même chose sur les 2 écrans, comme s'il y avait qu'une seule caméra. En gros quand je Joueur 1 va bouger il va bouger la caméra des 2 écrans de même pour le joueur 2 et je n'arrive pas à comprendre pourquoi ...

    Voila un screen pour mieux se rendre compte :



    Je sollicite donc votre aide, merci d'avance

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    je voudrais savoir un truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    changePosCamera(float x, float y, float z, int player)
    Ou tu l'appelle ?
    Parce que si tes deux caméras partage les mêmes variables normal que ça agit comme si il y on avait qu'une seule.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 34
    Par défaut
    Merci de m'aider une nouvelle fois ^^

    Je l'appelle pour chaque objet personnage, du coup les varaibles de la caméras sont propres à chaques personnages ...

    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
     
    void            Model::Bomberman::gestCam()
    {
      int diffOffsetX = 0;
      int diffOffsetY = 0;
     
      diffOffsetX = absolute(this->offset_y - this->core->getPositionCamX(this->playerId));
      diffOffsetY = absolute(this->offset_x - (this->core->getPositionCamZ(this->playerId) - 6000));
     
        if (diffOffsetX > 1700)
        {
          if (offset_y - this->core->getPositionCamX(this->playerId) < 0)
            this->cam_x -= this->speed;
          else
            this->cam_x += this->speed;
          this->core->changePosCamera(this->cam_x, this->cam_y, this->cam_z, this->playerId); //je bouge la caméra une fois avoir fait tout les calculs en donnant a la caméra quel joueur sera affecté par le changement de caméra
        }
      if (diffOffsetY > 1200)
        {
          if (this->offset_x - (this->core->getPositionCamZ(this->playerId) - 6000) < 0)
            this->cam_z -= this->speed;
          else
            this->cam_z += this->speed;
          this->core->changePosCamera(this->cam_x, this->cam_y, this->cam_z, this->playerId);
        }
    }

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    changePosCamera(this->cam_x, this->cam_y, this->cam_z, this->playerId);
    Les variable sont les mêmes dans la ligne 16 et 24 , (après certes tu fais une incrémentation différentes).

    Après si je peux me permettre , je trouve ton 'architecture pas pratique , et surtout un peu inutile ^^'
    Je m'explique normalement ton code ne doit pas se soucier du viewport , alors que la tu fais du code qui est beaucoup trop exclusive (gère obligatoirement 2 'fenêtre').

    En gros en pseudo code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    glViewport (0, 0, 1920/2, 1080);
    camera();
    draw();
     
    glViewport (1920/2, 0, 1920/2, 1080);
    camera();
    draw();

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 34
    Par défaut
    Ah, j'ai perdu ma nuit mais j'ai refait la structure du code, du coup ca marche bien à présent merci encore des conseils ^^

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

Discussions similaires

  1. Gestion du message WM_SYSCOLORCHANGE avec WndProc
    Par yousserr dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 29/07/2005, 08h59
  2. Réponses: 4
    Dernier message: 30/12/2004, 18h04
  3. Réponses: 3
    Dernier message: 13/08/2004, 18h52
  4. [TP]Gestion des images bmp avec BMP.TPU
    Par Gabi dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 14/05/2004, 23h20
  5. [CVS]Gestion de 2 versions avec une partie commune
    Par Gromitou dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 19/02/2004, 14h32

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