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

DirectX Discussion :

Passage de coordonnées 3D en coordoonées 2D


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut Passage de coordonnées 3D en coordoonées 2D
    J'ai définit un camembert avec des coordonnées 3D. Direct3D me l'affiche correctement.
    J'aimerai placer des textes a coté de ce camembert. Si je les cree en 3D, ils vont tourner de la même facon que mon camembert alors qu'il devrait rester face à la caméra pour être visible.

    J'ai donc décidé de les creer en 2D (Transformed vertex)

    Problème : Comment à partir des coordonnées 3D du camembert, je peux caculer son emplacement sur l'ecran (Screen Space) ?

    La multiplication par les matrice World, View, Projection et ViewPort ne semble pas me donner le resultat attendu...

    Merci pour votre aide.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La multiplication par les matrice World, View, Projection et ViewPort ne semble pas me donner le resultat attendu...
    C'est pourtant comme ça qu'il faut faire. On peut voir le code ?

    J'aimerai placer des textes a coté de ce camembert. Si je les cree en 3D, ils vont tourner de la même facon que mon camembert alors qu'il devrait rester face à la caméra pour être visible.
    Tu peux toujours ne garder que la composante de translation lorsque tu affiches le texte, et annuler les rotations.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut
    Voila le bout de 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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    	// Recup/calcul des matrices
    	D3DXMATRIX world_matrix; pd3dDevice->GetTransform(D3DTS_WORLD,&world_matrix);
    	D3DXMATRIX view_matrix; pd3dDevice->GetTransform(D3DTS_VIEW,&view_matrix);
    	D3DXMATRIX projection_matrix; pd3dDevice->GetTransform(D3DTS_PROJECTION, &projection_matrix);
     
    	D3DVIEWPORT9  stV;
    	HRESULT hr = pd3dDevice->GetViewport(&stV);
    	if (FAILED(hr))
    	{ LogDXError("_CalculePositionTexte","GetViewPort",hr); return; }
     
    	D3DXMATRIX mClip; 
    	mClip._11 =  2.0/stV.Width;          
    mClip._12=0;                        
    mClip._13=0;                              
    mClip._14=0;
    mClip._21 =    0;			         
    mClip._22=2.0/stV.Height;           
    mClip._23=0;                              
    mClip._24=0;
    mClip._31 = 0;	                 
    mClip._32=0;                        
    mClip._33=1.0/(stV.MaxZ-stV.MinZ);        
    mClip._34=0;
     
    mClip._41 = -1-2*(stV.X/stV.Width);	 
    mClip._42=1-2*(stV.Y/stV.Height); 
    mClip._43=-stV.MinZ/(stV.MaxZ-stV.MinZ);   
    mClip._44=1;
     
    	D3DXMATRIX viewport;
    	viewport._11 = stV.Width;    
    viewport._12 =               0;    
    viewport._13 = 0;    
    viewport._14 = 0;
    	viewport._21 =         0;    
    viewport._22 = -1.0*stV.Height;   
     viewport._23 = 0;   
     viewport._24 = 0;
    	viewport._31 =         0;   
     viewport._32 =               0;   
     viewport._33 = 1;    
    viewport._34 = 0;
     
    viewport._41 =         0;   
     viewport._42 =      stV.Height;   
     viewport._43 = 0;    
    viewport._44 = 1;
     
    	// Les points a transformer
    	D3DXVECTOR4  pptD3DCentre; 
    	pptD3DCentre.x = pptCoordCentre->x;	pptD3DCentre.y = pptCoordCentre->y;	pptD3DCentre.z = pptCoordCentre->z;	pptD3DCentre.w = 1;
     
    	D3DXVECTOR4	 pptD3DMilieu;	
    	pptD3DMilieu.x = pptCoordMilieu->x;	pptD3DMilieu.y = pptCoordMilieu->y;	pptD3DMilieu.z = pptCoordMilieu->z;	pptD3DMilieu.w = 1;
     
     
    	D3DXMatrixMultiply(&tmp_matrix, &viewport, &mClip);
    	D3DXMatrixMultiply(&calc_matrix, &tmp_matrix, &projection_matrix);
    	D3DXMatrixMultiply(&tmp_matrix, &calc_matrix,  &view_matrix);
    	D3DXMatrixMultiply(&calc_matrix, &tmp_matrix, &world_matrix);
     
    __TransformePoint(&ptD3DCentreEcran, &pptD3DCentre, &calc_matrix);
    __TransformePoint(&ptD3DMileuEcran, &pptD3DMilieu, &calc_matrix);
     
    //------------------------------------------------------------------------------------------------------------------------
    // Multiplication de matrice.
    __TransformePoint(D3DXVECTOR4* pPointDestination, const D3DXVECTOR4* pPointSource, D3DXMATRIX* pD3DMatrice)
    { 	
    	ASSERT (pPointDestination!=NULL);  ASSERT (pPointSource!=NULL);  ASSERT (pPointDestination!=pPointSource);
     
    	// S'il n'y a pas de matrice pour la transformation, alors c'est l'identité...
    	if ( pD3DMatrice == NULL )
    	{
    		pPointDestination->x = pPointSource->x;
    		pPointDestination->y = pPointSource->y;
    		pPointDestination->z = pPointSource->z;
    		pPointDestination->w = 1;
    		return;
    	}
     
    	// Produit ligne colonne 
    	pPointDestination->x = pD3DMatrice->_11*pPointSource->x + pD3DMatrice->_12*pPointSource->y + pD3DMatrice->_13*pPointSource->z + pD3DMatrice->_14;
    	pPointDestination->y = pD3DMatrice->_21*pPointSource->x + pD3DMatrice->_22*pPointSource->y + pD3DMatrice->_23*pPointSource->z + pD3DMatrice->_24;
    	pPointDestination->z = pD3DMatrice->_31*pPointSource->x + pD3DMatrice->_32*pPointSource->y + pD3DMatrice->_33*pPointSource->z + pD3DMatrice->_34;
    	pPointDestination->w = pD3DMatrice->_41*pPointSource->x + pD3DMatrice->_42*pPointSource->y + pD3DMatrice->_43*pPointSource->z + pD3DMatrice->_44;
    }

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi ne pas utiliser les fonctions D3DX ? Il me semble qu'il y a tout ce qu'il faut pour projeter directement un point à l'écran.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut
    Et bien si la fonction permettant de passer du Model Space (3D) en Screen Space (2D) existe, je suis preneur !
    Mais je l'ai pas vu

    une petite idée sur le nom ?

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    D3DXVec3Project

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    'Alut

    Et bien si la fonction permettant de passer du Model Space (3D) en Screen Space (2D) existe, je suis preneur !
    Mais je l'ai pas vu
    Voir D3DXVec3Project(...).
    Autre fonction utile D3DXVec3TransformCoord(...).

    Sinon, la derniere ligne du Viewport me semble incorrecte.

    ViewPort = [ 0.5*Larg 0 0 0
    0 0.5*Haut 0 0
    0 0 1 0
    X + 0.5*Larg Y + 0.5*Haut 0 1 ]

    X, Y, Larg et Haut sont relatifs au coin supérieur gauche (d'après la doc).

    Donc Viewport(4,1) = 0 donne X = -05*Larg (négatif??)

    Mais je n'en suis pas sur, je ne me sert pas du Viewport.

    [EDIT]: trop lent.......

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

Discussions similaires

  1. Passage de v1.2 a 2.0 récupérer les coordonnées du centre de ma carte
    Par bauschr dans le forum IGN API Géoportail
    Réponses: 3
    Dernier message: 19/09/2012, 09h36
  2. problème lors de passage d’un système de coordonnée à un autre
    Par nectar dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 15/09/2012, 11h31
  3. openGL: passage coordonnées 3D a coordonnées fenetre
    Par zeder59 dans le forum Moteurs 3D
    Réponses: 1
    Dernier message: 16/06/2009, 16h12
  4. Réponses: 2
    Dernier message: 13/05/2008, 11h53
  5. Passage des coordonnées polaires a cartésiennes
    Par raida8 dans le forum Débuter
    Réponses: 1
    Dernier message: 29/04/2008, 10h48

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