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 :

Overlay avec Direct3D9


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut Overlay avec Direct3D9
    Bonjour !

    Je fais une sorte de visualiseur 3D. J'aimerais afficher en bas à gauche de ma vue 3 axes qui suivraient les rotations appliquées au modèle.

    La translation du modèle est simulée par un déplacement latéral de la caméra. Du coup, quand j'affiche mon "témoin d'axes", il ne reste pas en bas à gauche de ma vue en cas de translation Il bouge avec le monde, alors que j'aimerais qu'il reste en toutes circonstances en bas à gauche de ma vue...

    J'ai pensé à effectuer le rendu sur une autre surface puis l'afficher en overlay, mais je ne sais ni si c'est possible, ni comment faire

    Une idée, quelqu'un?

  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
    Par rapport à ton modèle, il suffit d'utiliser des matrices de world - view différentes pour afficher tes axes (ie. leur appliquer seulement les rotations).

  3. #3
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    Ui c'est vrai, mais comment faire pour qu'il se trouve toujours en bas à gauche de l'écran? Malgré les zooms et déplacements de la caméra, j'aimerais qu'il soit toujours visible et en bas à gauche de mon écran...
    • Est-ce que l'utilisation de CreateOffscreenPlainSurface et UpdateSurface pourrait être une bonne solution? Et si oui, comment faire le rendu de mes axes uniquement dans l'offscreen surface :
    • Y a-t-il une solution différente et/ou plus simple :

    Merci d'avance de votre aide

  4. #4
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    il suffit de remettre tes matrices de transformations a zéro
    quand tu veux tracer ton élément à une position fixe à l'écran.
    les transformations que tu appliques à l'un et l'autre des objets sont totalement indépendantes.

    En tout cas une chose est sure, l'overlay n'est pas une solution acceptable .

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    Oui je met les translations à 0 pour que rien ne bouge, mais comment de mettre de façon fixe et sûre en bas à gauche de l'écran??? Car si je dessine ça à une position fixe et que je zoom pour m'écarter du monde, par exemple, eh bien les axes vont se retrouver vers le milieu de l'écran!
    Bon, je me rends bien compte que je n'explique pas bien mon problème, donc voici un petit dessin illustrant le souci et la solution attendue :

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    tu devrais peut être songer à modifier ta matrice de projection en Matrix.Identity.

  7. #7
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    Je ne vois pas ce que tu veux dire, backfire :

    J'ai tenté le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	    if (m_pAxis)
    		{
    			D3DXMATRIX matProj, matIdentity;
    			D3DXMatrixIdentity (&matIdentity);
    			m_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );
    			m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matIdentity );
    			m_pAxis->Render ();
    			m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    		}
    Et maintenant mes axes ne sont plus visibles. C'était à ce genre de code que tu pensait Backfire ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    je me suis trompé, c'est le View que tu dois changer et rendre "fixe" par exemple (c#) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.Transform.View = Matrix.LookAtLH( new Vector3(0,0,-1), new Vector3(0,0,0), new Vector3(0,1,0));
    pour le Projection tu laisses tel quel tu l'utilises précédemment, mais pour positionner correctement tes trois axes tu dois le faire dans le World comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.Transform.World = Matrix.RotationZ(angle[i])*Matrix.Scaling(scale[i])* Matrix.Translation(pos[i]);

  9. #9
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    Alors là j'ai envie de te dire : CHAPEAU!
    J'ai juste à ajuster le From et le LookAt de la View pour positioner mes ptits axes en bas à gauche
    Merci beaucoup

  10. #10
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    AÏE
    Je pensais le problème réglé, mais subsiste un petit hic.
    Voici ce que j'ai au lancement de mon application : .
    C'est très bien, et mes petits axes bougent correctement et restent bien en place (merci encore backfire ).

    Seulement le problème apparaît lorsque j'agrandit ou rétrécit ma fenêtre. Dans ces cas là, mon système d'axes "sort" de la fenêtre (rétrécissement) ou se retrouve vers le centre (agrandissement).
    Voici les illustrations respectives du rétrécissement
    et de l'agrandissement :
    .

    Aurais-je mal fait quelque chose? Voici comment je m'y prend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	D3DXVECTOR3		vFrom		( m_vLength.x * 12.5, m_vLength.y * 6.5, -m_vLength.z * 20);
    	D3DXVECTOR3		vAt			( m_vLength.x * 12.5, m_vLength.y * 6.5, 0.0f );
    	D3DXVECTOR3		vUp			( 0.0f, 1.0f, 0.0f );
    	D3DXMatrixLookAtLH			( &m_matView, &vFrom, &vAt, &vUp );
    	m_pD3DDevice->GetTransform	( D3DTS_VIEW,  &matOldView );
    	m_pD3DDevice->SetTransform	( D3DTS_VIEW,  &m_matView );
    	Render ();
    	m_pD3DDevice->SetTransform	( D3DTS_VIEW,  &matOldView );
    (m_vLength contient la taille de chacun des axes)

  11. #11
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 47
    Par défaut
    C'est bon j'ai la solution
    Je dirais même que c'est la solution ultime Les viewports
    Alors pour ceux qui connaissent pas, en fait définir viewport permet de faire son rendu dans une partie de la render target uniquement. Ainsi, dans mon cas, je dis que souhaite effectuer le rendu dans une fenêtre de 10 * 10 à partir de la gauche de ma render target et en bas. Voici le code correspondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		D3DVIEWPORT9 vpAxes, vpOld;
    		m_pd3dDevice->GetViewport  (&vpOld);
    		vpAxes.X      = 0;
    		vpAxes.Y      = m_d3dsdBackBuffer.Height - 100;
    		vpAxes.Width  = 100;
    		vpAxes.Height = 100;
    		vpAxes.MinZ   = 0.0f;
    		vpAxes.MaxZ   = 1.0f;
    		m_pd3dDevice->SetViewport  (&vpAxes);
    		Render ();
    		m_pd3dDevice->SetViewport  (&vpOld);
    Cela couplé au code précédent, ça donne le bon résultat

    Merci encore pour votre aide. J'espère que mon problème pourra aider les autres codeurs. En tous cas, je viens d'entrevoir la puissance des viewports, et je crois que je vais m'y intéresser de plus près

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

Discussions similaires

  1. Overlay avec détection des gestes sur Android 4.x
    Par Ricoxor dans le forum Android
    Réponses: 0
    Dernier message: 05/06/2014, 11h16
  2. plugin popup avec overlay
    Par epeichette dans le forum jQuery
    Réponses: 0
    Dernier message: 22/03/2011, 10h54
  3. PDFBox erreur avec overlay
    Par zekabyle dans le forum Documents
    Réponses: 0
    Dernier message: 21/12/2010, 19h59
  4. [MooTools] Problemes avec mootools, overlay et box
    Par actionspat dans le forum Bibliothèques & Frameworks
    Réponses: 8
    Dernier message: 15/10/2010, 15h23
  5. Principe d'un overlay avec fondu,cadre central et transparence.
    Par mael94420 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/07/2007, 18h50

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