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

Développement 2D, 3D et Jeux Discussion :

[3D] gérer les transformations de la caméra


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut [3D] gérer les transformations de la caméra
    Bonjour à tous,
    J'hésite actuellement sur la façon d'implémenter ma camera dans mon moteur 3D (petit projet perso).
    L'idée est d'appliquer aux objets du monde les transformations inverses de celle subit par la camera c'est bien ça?
    Donc si je fais un deplacement de la camera (translation), j'applique une translation inverse (inverse ds le sens valeurs opposées) sur mes objets.
    Est la bonne façon de pocéder?

    Autrement au niveau de l'implémentation elle meme, je vois souvent des classes de Camera avec les 3 axes du repere local de la camera. Lorsque l'on applique une rotation, on l'applique sur ces 3 vecteurs. Mais au moment du rendu il faudra bien retrouver la matrice correspondante à ces vecteurs (donc changement de base) pour l'appliquer aux objets du monde, mais comment faire cela?
    Moi je pensais avoir directement une matrice en prop de mon object camera à la place de ces 3 vecteurs, et multiplier les transfos que l'on applique a la cam au fur et a mesure.
    Quelle est donc l'approche la plus logique dans l'implémentation?

    Si vous avez des bons exemples de code (classe si possible) de Camera 3D cela m'interesse fortement aussi.

    Merci et bonne année à tous

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'idée est d'appliquer aux objets du monde les transformations inverses de celle subit par la camera c'est bien ça?
    Donc si je fais un deplacement de la camera (translation), j'applique une translation inverse (inverse ds le sens valeurs opposées) sur mes objets.
    Est la bonne façon de pocéder?
    Oui. En tout cas c'est comme ça que procèdent OpenGL et DirectX.

    Autrement au niveau de l'implémentation elle meme, je vois souvent des classes de Camera avec les 3 axes du repere local de la camera. Lorsque l'on applique une rotation, on l'applique sur ces 3 vecteurs. Mais au moment du rendu il faudra bien retrouver la matrice correspondante à ces vecteurs (donc changement de base) pour l'appliquer aux objets du monde, mais comment faire cela?
    J'imagine qu'il suffit de placer tes trois axes sur les trois premières colonnes de ta matrice (ou lignes, selon la manière dont tu les représentes), et la translation sur la quatrième.

    Moi je pensais avoir directement une matrice en prop de mon object camera à la place de ces 3 vecteurs, et multiplier les transfos que l'on applique a la cam au fur et a mesure.
    Quelle est donc l'approche la plus logique dans l'implémentation?
    Pas forcément top, car le jour où tu voudras faire rotater ta caméra sur elle-même tu ne pourras pas. Personnellement, une implémentation que je trouve plutôt simple est de garder la position ainsi que les angles d'Euler de la caméra, puis de ne construire la matrice correspondante qu'au moment de l'envoyer au gestionnaire de rendu.
    On peut également utiliser les quaternions, mais ce n'est pas forcément plus facile à gérer.

    Si vous avez des bons exemples de code (classe si possible) de Camera 3D cela m'interesse fortement aussi
    J'en ai déjà vu passer sous ma souris, mais je ne saurais plus te dire où. Tu as demandé à Google ? Ou recherché dans les forums et articles des sites genre devmaster ou gamedev ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Salut Loulou et merci pour ta reponse

    Oui en effet pour le coup de creer la matrice en fonction des axes J'essaierai.

    Pas forcément top, car le jour où tu voudras faire rotater ta caméra sur elle-même tu ne pourras pas.
    Heu là par contre je ne te suis pas. Comment faire tourner la cam sur elle meme peut poser probleme? Car lorsque je position ma camera en une certaine position, j'applique la matrice de translation adaptée, et ensuite si je veux faire une rotation de la cam à cette position, j'applique la matrice de rotation non? Ou alors je suis à l'ouest complet

    Yep je regardais justement sur gamedev là. Ils proposent une solution à partir de quaternions, mais moi non plus je ne trouve pas cela forcement plus pratique!


    Merci encore

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Heu là par contre je ne te suis pas. Comment faire tourner la cam sur elle meme peut poser probleme? Car lorsque je position ma camera en une certaine position, j'applique la matrice de translation adaptée, et ensuite si je veux faire une rotation de la cam à cette position, j'applique la matrice de rotation non?
    Non, car si ta caméra n'est pas positionnée à l'origine elle ne tournera pas sur elle-même. Il faut donc garder les infos de rotation et de position séparées, soit pour les appliquer vraiment à la fin, soit pour ramener la caméra à l'origine avant chaque rotation.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Oki merci pour ta réponse. J'ai peut etre pas bien pris en compte ce que tu dis.
    Je vais faire des tests de toute façon, et j'essaierai de poster mon résultat ici au cas ou cela peut interesser qq.

    Merci encore

    PS : Bizarre j'ai pas recu de notification apres ton second message :s

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Bon désolé de faire remonter ce message mais mon probleme est toujours present.
    Je vais vous donner une partie de mon code (en actionscript, ressemblant à du Java) pour illustrer au maximum.



    tout d'avord j'ai choisi la solution de representer ma camera avec une base de trois vector formant une base orthonormale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    _vOut = new Vector( 0, 0, 1);
    _vSide = new Vector( 1, 0, 0);
    _vUp = new Vector( 0, 1, 0);
    Ensuite j'ai implementé la fonction de rotation autours de l'axe X de la camera (code ci dessous) et de meme pour les autres axes en suivant la meme logique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function tilt ( nAngle:Number ):Void
    {
    _compiled = false;
    nAngle = ( nAngle < 0 ) ? 360 + nAngle : nAngle;
    var m:Matrix4 = Matrix4Math.axisRotation( _vSide.x, _vSide.y, _vSide.z, nAngle );
    Matrix4Math.vectorMult( m, _vUp);
    Matrix4Math.vectorMult( m, _vOut);
    }
    Ensuite je met à jour ma matrice de transformation en reconstituant la matrice de rotation selon les vecteurs de la base, et celle de translation en fonction de la position de la camera
    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
    private function __updateMatrix ( Void ):Matrix4
    {
    var m:Matrix4 = new Matrix4( 
    _vSide.x, _vSide.y,_vSide.z, 0, 
    _vUp.x, _vUp.y, _vUp.z, 0,
    _vOut.x, _vOut.y, _vOut.z, 0,
    0, 0, 0, 1 );
     
    var n:Matrix4 = new Matrix4( 
    1, 0, 0, -_p.x,
    0, 1, 0, -_p.y,
     0, 0, 1, -_p.z, 
    0, 0, 0, 0 );
     
    // -- multiplication Translation x Rotation !
    m = Matrix4Math.multiply( n, m );
    return m;
    }
    Ma matrice de projection est celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private function __loadProjection( Void ) : Void
    {
    _mp.n12 = _mp.n13 = _mp.n14 = _mp.n21 = _mp.n23 = _mp.n24 = _mp.n31 = _mp.n32 = _mp.n34 = _mp.n41 = _mp.n42 = _mp.n44 = 0;
    _mp.n11 = _mp.n22 = _mp.n33 = _nFocal;
    _mp.n43 = 1;
    }
    Et je compile au moment du rendu de la façon suivante afin d'obtenir la matrice finale que la camera va appliquée sur mes objets
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function compile( Void ) : Void
    {
    if( _compiled )
    return;
    // we set up the rotation/translation matrix
    _mt = __updateMatrix();
    // we combne it with the perspective matrix
    m = Matrix4Math.multiply ( _mp, _mt );
    _compiled = true;
    }
    Je met aussi ma fonction de creation de matrice de rotation autours d'un axe au cas ou l'erreur se logerai par là :

    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
    	public static function axisRotation ( u:Number, v:Number, w:Number, angle:Number ) : Matrix4
    	{
    		var m:Matrix4 	= Matrix4.createIdentity();
    		angle = NumberUtil.toRadian( angle );
    		// -- modification pour verifier qu'il n'y ai pas un probleme de precision avec la camera
    		var nCos:Number	= Math.cos( angle );
    		var nSin:Number	= Math.sin( angle );
    		var scos:Number	= 1 - nCos ;
     
    		var suv	:Number = u * v * scos ;
    		var svw	:Number = v * w * scos ;
    		var suw	:Number = u * w * scos ;
    		var sw	:Number = nSin * w ;
    		var sv	:Number = nSin * v ;
    		var su	:Number = nSin * u ;
     
    		m.n11  =   nCos + u * u * scos	;
    		m.n12  = - sw 	+ suv 			;
    		m.n13  =   sv 	+ suw			;
     
    		m.n21  =   sw 	+ suv 			;
    		m.n22  =   nCos + v * v * scos 	;
    		m.n23  = - su 	+ svw			;
     
    		m.n31  = - sv	+ suw 			;
    		m.n32  =   su	+ svw 			;
    		m.n33  =   nCos	+ w * w * scos	;
     
    		return m;
    	}
    (les indices pour les matrices commencent à 1 jusqu'a 4 pour les matrices 4x4, Matrix4 )
    Est ce que je vais qq chose de stupide niveau mathématique?
    Car le problème que je vois est lorsque je place ma camera très loin de mon objet, lorsque je fais mes rotations sur la camera, l'objet se met à tourner autours d'un point qui n'est pas la position de la camera !!

    De plus quand je fais des melanges de tilt et pan successivement, mon image se deforme comme si j'avais fais un roll. Bizarre je trouve. Je peux essayer de vous donner des captures d'ecran si vous voulez.

    Merci
    Thomas

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

Discussions similaires

  1. Comment gérer les caméras ip sous ubuntu 12.04
    Par alex89edu dans le forum Matériel
    Réponses: 1
    Dernier message: 23/10/2012, 23h33
  2. Réponses: 2
    Dernier message: 22/10/2008, 08h33
  3. Gérer les clics sur les boutons
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 08/02/2004, 15h34
  4. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

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