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 :

Déplacement de caméra dans le monde


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut Déplacement de caméra dans le monde
    Bonjour

    J'essaye de déplacer ma caméra dans un environnement 3D, mais je pêche certainement par mécompréhension au niveau des vecteurs.

    Je positionne mon vEyePt et calcule la position de mon vLookatPt en fonction d'un angle géré à la souris. En gros mon vLookatPt se promène sur une sphère autour du vEyePt. Voici le code associé :
    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
     
    static float rotAngleX,rotAngleY;
    	float rayon=10;
    	if (g_fSpinX>0.0f)
    	{
    		rotAngleX+=D3DX_PI/40.0f;
    		g_vLookatPt.x=g_vEyePt.x+rayon*sinf(rotAngleX);
    		g_vLookatPt.z=g_vEyePt.z+rayon*cosf(rotAngleX);
    	}
    	else
    	if (g_fSpinX<0.0f)
    	{
    		rotAngleX-=D3DX_PI/40.0f;
    		g_vLookatPt.x=g_vEyePt.x+rayon*sinf(rotAngleX);
    		g_vLookatPt.z=g_vEyePt.z+rayon*cosf(rotAngleX);
    	}
    	g_fSpinX=0.0f;	// raz de delta x
     
     
    	if (g_fSpinY>0.0f)
    	{
    		rotAngleY+=D3DX_PI/40.0f;
    		g_vLookatPt.y=g_vEyePt.y+rayon*sinf(rotAngleY);
    		g_vLookatPt.z=g_vEyePt.z+rayon*cosf(rotAngleY);
    	}
    	else
    	if (g_fSpinY<0.0f)
    	{
    		rotAngleY-=D3DX_PI/40.0f;
    		g_vLookatPt.y=g_vEyePt.y+rayon*sinf(rotAngleY);
    		g_vLookatPt.z=g_vEyePt.z+rayon*cosf(rotAngleY);
    	}
    	g_fSpinY=0.0f;	// raz de delta y
     
    	D3DXMatrixLookAtLH( &g_matView, &g_vEyePt, &g_vLookatPt, &g_vUpVec ); // initialisation matrice de vue 
     
     
    	hr=g_lpD3DDevice->SetTransform( D3DTS_VIEW, &g_matView );
    Je souhaite désormais pouvoir me déplacer dans le sens que donne l'axe

    g_vEyePt--> g_vLookatPt

    mais je n'arrive pas à trouver le calcul à éffectuer sur g_vEyePt pour me déplacer dans cette direction.

    Il me semble clair que ce type de problème doit se résoudre avec des vecteurs, mais en refaisant des math, je n'arrive pas à m'en sortir.

    A ce propos ce code est -il correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
    	float rayon=10;//D3DXVec3Length(&vCam);
    Si oui comment l'utiliser pour mes déplacements ?

    Y a t-il sinon une possibilité à partir de l'extraction des valeurs de la matrice D3DXMatrixLookAtLH
    le sdk dit :
    The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixLookAtLH function can be used as a parameter for another function.

    This function uses the following formula to compute the returned matrix.

    zaxis = normal(At - Eye)
    xaxis = normal(cross(Up, zaxis))
    yaxis = cross(zaxis, xaxis)

    xaxis.x yaxis.x zaxis.x 0
    xaxis.y yaxis.y zaxis.y 0
    xaxis.z yaxis.z zaxis.z 0
    -dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) l

    Espèrant que quelqu'un puisse me débloquer,
    merci d'avance

    dom

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par korsakoff69

    A ce propos ce code est -il correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
    	float rayon=10;//D3DXVec3Length(&vCam);
    Si oui comment l'utiliser pour mes déplacements ?
    Et bien il n'y a pas de problème dans ce code, je te conseillerais juste de normaliser le vCam puis de l'agrandir ensuite à la taille d'avancée que tu veux ensuite.
    Sinon, pour faire avancer ta caméra je pense qu'en multipliant simplement la matrice translation avec la matrice de vue ta camera avanceras. En gros ça donne :
    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
     
    // ton vecteur d'avancé
    D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
    D3DXVec3Normalize(&vCam,&vCam);
    vCam = vCam * rayon; // tu l'agrandis ensuite
    //tu initialise la matrice de translation ensuite
    D3DXMATRIX matTrans;
    D3DXMatrixIdentity(&matTrans);
    matTrans._41 = vCam.x;
    matTrans._42 = vCam.y;
    matTrans._43 = vCam.z;
    // puis tu multiplie la matrice
    matView = matTrans * matView;
    //enfin tu appliques ça a DX
    d3dDevice->SetTransform( D3DTS_VIEW, &matView );
    bon si ça donne un mauvais résultat, inverses les deux matrices dans la multiplication mais je suis a 87% sur de moi là.

    Y a t-il sinon une possibilité à partir de l'extraction des valeurs de la matrice D3DXMatrixLookAtLH
    le sdk dit :
    The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixLookAtLH function can be used as a parameter for another function.
    ça veut juste dire que tu peut faire :
    matView = matTrans * D3DXMatrixLookAtLH(...);
    sans faire deux lignes de code, donc rien a voir et la suite c'est juste une recopie du code.

    Sinon dans le framework il y a une classe qui est déjà implémenté et très bien faites pour les camera en first person. Regardes cette classe, a mon avis tu auras les réponses a toutes tes futures question la bas. (dans misc.h)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    merci pour la réponse
    voici plus précisément mon problème
    avec ce code, g_ViewVelocity étant la vitesse de déplacement dans l'axe de la caméra

    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
     
    	if (g_ViewVelocity!=0) // vitesse de déplacement dans la vue
    	{
    		// avance de la caméra
    		g_vLookatPt=g_vLookatPt*(1+g_ViewVelocity);// ne fonctionne pas correctement
    		g_vEyePt=g_vEyePt*(1+g_ViewVelocity);// ne fonctionne pas correctement
     
    		// ton vecteur d'avancé
    		D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
    		D3DXVec3Normalize(&vCam,&vCam);
     
    		vCam = vCam * (1+g_ViewVelocity);// tu l'agrandis ensuite 
     
    		D3DXMATRIX matTrans;//tu initialise la matrice de translation ensuite
    		D3DXMatrixIdentity(&matTrans);
    		matTrans._41 = vCam.x;
    		matTrans._42 = vCam.y;
    		matTrans._43 = vCam.z;
    		// puis tu multiplie la matrice
    		g_matView = matTrans * g_matView;//enfin tu appliques ça a DX 
    	}
     
    	D3DXMatrixLookAtLH( &g_matView, &g_vEyePt, &g_vLookatPt, &g_vUpVec ); // initialisation matrice de vue 
     
    	hr=g_lpD3DDevice->SetTransform( D3DTS_VIEW, &g_matView );
    	if (hr!=D3D_OK)	{ DXTRACE_ERR(TEXT( "Erreur g_lpD3DDevice->SetTransform( D3DTS_VIEW, &matView )"), hr );}
    la caméra se déplace mais pas dans le sens de son axe.

    Dans le prog, il sagit d'un modèle spatial avec des planètes, lorsques j'oriente la caméra ( c.a.d vLookatPt et vEyePt ) vers une planète et que je demande un déplacement avec le code au dessus, je ne me dirige pas vers cette planète. On dirait que la direction est toujours le point (0,0,0).

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    En ce qui concerne la caméra ( CD3DCamera ), on trouve des fonctions de renvoi de valeurs ( GetEyePt, Get...... ) et deux fonctions d'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        VOID SetViewParams( D3DXVECTOR3 &vEyePt, D3DXVECTOR3& vLookatPt,
                            D3DXVECTOR3& vUpVec );
        VOID SetProjParams( FLOAT fFOV, FLOAT fAspect, FLOAT fNearPlane,
                            FLOAT fFarPlane );
    qui ne gérent pas de direction ni de mouvement, donc inadaptée à un déplacement

    Quand à ma citation du SDK c'était pour donner la structure de la matrice, qui fournit apparement 3 axes de déplacement, mais pas de déplacement.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par korsakoff69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		// avance de la caméra
    		g_vLookatPt=g_vLookatPt*(1+g_ViewVelocity);// ne fonctionne pas correctement
    		g_vEyePt=g_vEyePt*(1+g_ViewVelocity);// ne fonctionne pas correctement
    Alors ça là, je ne sais pas à quoi ça sert sa mais pas a avancer dans le sens de la caméra, c'est certain. Pour les faire avancer dans le sens de la caméra il suffit juste d'ajouter le vCam (une fois agrandit pas avant) aux deux vecteurs.

    Sinon pour le framework il y a CFirstPersonCamera qui est a peu pret se que tu veux faire. Regarde juste le code de son FrameMove(), il est relativement compliqué mais la classe marche très bien. CBaseCamera est juste sa classe abstraite.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    le code ci-dessous ne fonctionne pas, te semble t-il correct vis à vis de ce que tu me dis ?

    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
     
    	if (g_ViewVelocity!=0) // vitesse de déplacement dans la vue
    	{
    		// vecteur caméra
    		D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
     
    		// g_ViewVelocity vitesse de déplacement de la caméra dans le sens de l'axe vCam
    		// donc recalcule se vecteur
    		vCam = vCam * (1+g_ViewVelocity);			
     
    		// applique le résultat sur g_vEyePt et g_vLookatPt
    		g_vLookatPt=g_vLookatPt+vCam;	
    		g_vEyePt=g_vEyePt+vCam;			
     
    		D3DXMATRIX matTrans;						//matrice de translation ensuite
    		D3DXMatrixIdentity(&matTrans);
    		matTrans._41 = vCam.x;
    		matTrans._42 = vCam.y;
    		matTrans._43 = vCam.z;
     
    		g_matView =g_matView*matTrans ;		 
     
    	}
    Avec ou sans lmodification via la matrice matTrans, pas de meilleur résultat.

    Je crois que mon prblm est que j'ai du mal avec :
    D3DVector3 (x,y,z) peut désigner un point dans un système orthonormé
    D3DVector3 (rayon,theta,phi) peut désigner un point en coordonnées sphériques
    D3DVector3 (a,b,c) peut désigner un vecteur

    mon prblm se résume à : connaissant vCam, axe de la caméra, comment la faire se déplacer selon son axe


    La partie dont tu me parles dans CFirstPersonCamera est elle celle ci ?
    [CODE][
    // Transform the position delta by the camera's rotation
    D3DXVECTOR3 vPosDeltaWorld;
    if( !m_bEnableYAxisMovement )
    {
    // If restricting Y movement, do not include pitch
    // when transforming position delta vector.
    D3DXMatrixRotationYawPitchRoll( &mCameraRot, m_fCameraYawAngle, 0.0f, 0.0f );
    }
    D3DXVec3TransformCoord( &vPosDeltaWorld, &vPosDelta, &mCameraRot );

    // Move the eye position
    m_vEye += vPosDeltaWorld;
    if( m_bClipToBoundary )
    ConstrainToBoundary( &m_vEye );

    // Update the lookAt position based on the eye position
    m_vLookAt = m_vEye + vWorldAhead;

    // Update the view matrix
    D3DXMatrixLookAtLH( &m_mView, &m_vEye, &m_vLookAt, &vWorldUp );

    D3DXMatrixInverse( &m_mCameraWorld, NULL, &m_mView );

    /CODE]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par korsakoff69
    le code ci-dessous ne fonctionne pas, te semble t-il correct vis à vis de ce que tu me dis ?

    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
     
    	if (g_ViewVelocity!=0) // vitesse de déplacement dans la vue
    	{
    		// vecteur caméra
    		D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;
     
    		// g_ViewVelocity vitesse de déplacement de la caméra dans le sens de l'axe vCam
    		// donc recalcule se vecteur
    		vCam = vCam * (1+g_ViewVelocity);			
     
    		// applique le résultat sur g_vEyePt
    		g_vEyePt=g_vEyePt+vCam;			
     
    		g_matView._41 = g_vEyePt.x;
    		g_matView._42 = g_vEyePt.y;
    		g_matView._43 = g_vEyePt.z;
    	}
    Ca devrait marcher, en considérant que tu as déjà fait le D3DXMatrixLookAtLH(...) avant pour la mise a jour de la direction. Ca manque de matrice intermédiaire qui pourront t'être utile plus tard mais je ne vois pas de problème, si il y en a encore, pourrais tu mettre l'intégralité de la fonction ?

    Sinon dans la fonction du framework théoriquement tout est interéssant à pars les if et leurs options.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    je teste
    merci++

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    Voici un code qui semble fonctionner

    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
     
    	D3DXMatrixLookAtLH( &g_matView, &g_vEyePt, &g_vLookatPt, &g_vUpVec ); // initialisation matrice de vue 
     
    	// déplacement de la caméra sur son axe 
    	// g_ViewVelocity étant la vitesse de déplacement
    	if (g_ViewVelocity!=0)								
    	{
    		D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;					// calcule vecteur caméra
    		D3DXVec3Normalize(&vCam,&vCam);// normalisation
    		if (g_ViewVelocity>0) vCam = vCam * (1.0f+g_ViewVelocity);	// changement de position du vecteur
    		if (g_ViewVelocity<0) vCam = vCam * (-1.0f+g_ViewVelocity);	// changement de position du vecteur
    		g_vLookatPt=g_vLookatPt+vCam;								// affectation nlles valeurs g_vEyePt et g_vLookatPt
    		g_vEyePt=g_vEyePt+vCam;
    	}
     
    	hr=g_lpD3DDevice->SetTransform( D3DTS_VIEW, &g_matView );
    	if (hr!=D3D_OK)	{ DXTRACE_ERR(TEXT( "Erreur g_lpD3DDevice->SetTransform( D3DTS_VIEW, &matView )"), hr );}
    Me voilà débloqué et un peu moins idiot avec les vecteurs
    Merci de ton aide , à charge de revanche

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    et le code suivant suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	D3DXMatrixLookAtLH( &g_matView, &g_vEyePt, &g_vLookatPt, &g_vUpVec ); // initialisation matrice de vue 
     
    	// déplacement caméra sur son axe, g_ViewVelocity vitesse de déplacement
    	if (g_ViewVelocity!=0)								
    	{
    		D3DXVECTOR3 vCam=g_vLookatPt - g_vEyePt;		// calcule vecteur caméra
    		D3DXVec3Normalize(&vCam,&vCam);					// normalisation
    		vCam = vCam * g_ViewVelocity;					// modif du vecteur
    		g_vLookatPt=g_vLookatPt+vCam;					// affectation nlles valeurs g_vEyePt et g_vLookatPt
    		g_vEyePt=g_vEyePt+vCam;
    	}
    	hr=g_lpD3DDevice->SetTransform( D3DTS_VIEW, &g_matView );

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

Discussions similaires

  1. déplacement caméra dans un univers 3D
    Par betsprite dans le forum OpenGL
    Réponses: 22
    Dernier message: 12/05/2010, 11h59
  2. Déplacement de lignes dans un tableau HMTL
    Par Maxime_ dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/01/2006, 09h43
  3. Réponses: 5
    Dernier message: 22/08/2005, 16h48
  4. [MFC] affichage image caméra dans un projet dialog
    Par Vestaproman dans le forum MFC
    Réponses: 3
    Dernier message: 07/02/2005, 13h27
  5. Réponses: 16
    Dernier message: 25/11/2004, 12h34

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