begin process at 2008 07 06 18:46:26
1 205 717 membres
280 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUTO DIRECT3D 1 : INITIALISATION


Information sur la source

Catégorie :Direct X Classé sous : DirectX, Direct3D, Initialisation Niveau : Débutant Date de création : 10/05/2008 Date de mise à jour : 15/05/2008 16:09:03 Vu / téléchargé: 2 726 / 169

Note :
Aucune note

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

A la demande de Benjionline j'ai ecris ce tutorial qui traite de l'initialisation de Direct3D.
J'espere ne pas avoir fait d'erreurs, si c'etait le cas merci de me le faire savoir par un commentaire.
Je met le tutoriel dans la partie source et un code d'exemple. La source n'est pas commenté car ce n'est que la reprise du tutoriel.

Source

  • Initialisation de Direct3D
  • Direct3D est une librairie de DirectX, ici nous utiliserons DirectX 8. Direct3D va nous permettre de faire des affichages d'objets en 3 dimensions et de les projetés sur l'écran.
  • Dans ce tutorial je vais tenter de vous expliquer les bases Direc3D.
  • Pour ce tutorial il faudra disposer d'une form et d'un control PictureBox nommé Picture1
  • En premier lieu nous allons déclarer l'ensemble des variables que nous utiliserons
  • Private Declare Function GetActiveWindow Lib "user32" () As Long
  • 'On utilisera cette fonction pour faire une petite optimisation
  • Private PDirectX As New DirectX8 'Pour créer un contexte de Rendu 3d
  • Private PDirect3D As Direct3D8 'Pour utiliser le contexte de Rendu
  • Private PDevice As Direct3DDevice8 'Correspond au material d'affichage
  • Private PStructParameter As D3DPRESENT_PARAMETERS 'Parametre d'affichage
  • Private MatWorld As D3DMATRIX 'La matrice d'affichage de notre monde 3d
  • Private MatView As D3DMATRIX 'Ma matrice de visualisation de notre monde
  • Private MatProj As D3DMATRIX 'La matrice de projection de notre monde sur l'ecran
  • Private poscam As D3DVECTOR 'Position de la caméra
  • Private dircam As D3DVECTOR 'Direction du regard de la caméra
  • Private percam As D3DVECTOR 'Vers ou est le haut de la camera
  • Private RenduD3D as Boolean 'Booleen pour créer une boucle d'ffichage
  • Pour réaliser un affichage de notre monde 3d nous utiliserons une caméra cette caméra est basé sur l'utilisation d'une matrice : MatView. Elle correspond a ce que voie la caméra.
  • Pour afficher ce que voie la caméra sur notre ecran nous utiliserons une autre matrice, la matrice de projection MatProj. Enfin nous utiliserons une matrice MatWorld qui correspondra a la position de notre monde 3D.
  • Pour créer notre caméra nous utiliserons 3 vecteurs, poscam qui correspond a la position de la camera dans notre monde en faite c'est plus un point qu'un vecteur, dircam qui correspond a la direction, en gros vers ou regarde la camera, et enfin percam qui montre le sommet de la caméra.
  • Un schema sera peut etre plus parlant :
  • http://img129.imageshack.us/img129/9377/poscambc8.png
  • Passons maintenant à l'initialisation de Direct3D, pour ce faire nous ajoutons une fonction :
  • Private Sub InitD3D(hWnd As Long, FullScreen As Boolean)
  • 'hWnd correspond au hWnd d'affichage et FullScreen permet d'intialiser selon un affichage plein
  • 'ecran ou un affichage fenetré
  • Dim mode As D3DDISPLAYMODE
  • 'Cette variable va nous servir a stocker les parametres d'affichages de notre ordinateur pour la
  • 'configuration de directx
  • Set PDirect3D = PdirectX.Direct3DCreate() 'On initialise un contexte de rendu 3d
  • PDirect3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode
  • 'Ici nous récupérons dans notre variable mode les différents parametres d'affichages de notre
  • 'ordinateur
  • With PstructParameter 'Initialisation de l'affichage
  • .BackBufferCount = 1 'Un backbuffer
  • .AutoDepthStencilFormat = D3DFMT_D16
  • 'On utilise un tampon de pronfondeur en 16 couleurs
  • .EnableAutoDepthStencil = 1 'On active le tampon de profondeur
  • .BackBufferFormat = mode.Format 'Pour le BackBuffer on utilise le format recupéré
  • .hDeviceWindow = hWnd 'On utilise le hWnd passé en parametre
  • .SwapEffect = D3DSWAPEFFECT_COPY_VSYNC 'On utilise la synchronisation verticale
  • End With
  • If FullScreen Then 'Si on est en plein ecran on passe en mode plein ecran
  • PStructParameter.Windowed = False
  • Else
  • PStructParameter.Windowed = True
  • End If
  • Set PDevice = PDirect3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
  • D3DCREATE_SOFTWARE_VERTEXPROCESSING, PStructParameter)
  • 'On initialise le Device avec des parametres standard et notre structure paramétré ci-dessus.
  • ' D3DDEVTYPE_HAL permet l'utilisation de la carte graphique pour les calculs
  • D3DXMatrixPerspectiveFovLH MatProj, 3.141592654 / 4, 1, 1, 10000
  • 'On créer la matrice de projection d'angle de champ de vision pi / 4 qui est une valeur
  • 'generalement utilisé et dimension Width / Height avec en premier plan 1 et en dernier plan 1000
  • PDevice.SetTransform D3DTS_PROJECTION, MatProj
  • 'On créer la transformation lié a la matrice
  • 'On positionne notre caméra
  • poscam.x = 0
  • poscam.y = 0
  • poscam.z = 100
  • dircam.x = 0
  • dircam.y = 0
  • dircam.z = 0
  • percam.x = 0
  • percam.y = 1
  • percam.z = 0
  • 'On met notre booleen a vrai
  • RenduD3D = True
  • Call Rendu(hWnd)
  • End Sub
  • Maitenant passons a notre fonction de Rendu :
  • Private Sub Rendu(hWnd as long)
  • If PDevice Is Nothing Then Exit Sub 'Si le device n'est pas initaliser on quitte
  • While RenduD3D 'Tant que notre booleen est vrai
  • DoEvents 'On laisse le processeur traiter les evenements systemes
  • PDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HBBCCFF, 2, 1
  • 'On vide l'ecan
  • Matrice 'On appel la fonction Matrice que l'on va decrire ci-dessous
  • Pdevice.BeginScene 'On commence le rendu de la scene
  • Pdevice.EndScene 'On fini le rendu de la scene
  • PDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 'On affiche l'image a l'ecran
  • If GetActiveWindow <> hWnd Then 'Ici on teste si notre fenetre est affiché en premiere
  • RenduD3D = False 'Dans le cas contraire on arrete le rendu
  • Form1.Timer1.Enabled = True 'et on active un timer
  • End If
  • Wend
  • End Sub
  • Enfin la procédure Matrice :
  • Private Function Matrice()
  • D3DXMatrixIdentity MatWorld
  • PDevice.SetTransform D3DTS_WORLD, MatWorld 'On applique les transformation lié au
  • 'monde
  • D3DXMatrixLookAtLH MatView, poscam, dircam, percam
  • PDevice.SetTransform D3DTS_VIEW, MatView
  • 'On applique les transformations liés a la matrice de visualisation
  • End Function
  • Enfin il faut mettre dans le Form_Load le chargement de notre code :
  • InitD3D Picture1.hWnd, False, Picture1.Width, Picture1.Height
  • Petite precision le ScaleMode de notre PictureBox doit etre en pixel.
  • Notre Timer, il est fixé a un interval de 500ms et a False
  • Private Sub Timer1_Timer()
  • If GetActiveWindow = Form1.hWnd Then 'Si notre fenetre est active
  • RenduD3D = True 'on remet le rendu a true
  • Timer1.Enabled = False 'On desactive le timer
  • Call Rendu(Form1.hWnd) 'on relance le rendu
  • End If
  • End Sub
  • J'espere que cette petite explication aura était explicite sur tous les points.
Initialisation de Direct3D

Direct3D est une librairie de DirectX, ici nous utiliserons DirectX 8. Direct3D va nous permettre de faire des affichages d'objets en 3 dimensions et de les projetés sur l'écran.
Dans ce tutorial je vais tenter de vous expliquer les bases Direc3D.

Pour ce tutorial il faudra disposer d'une form et d'un control PictureBox nommé Picture1

En premier lieu nous allons déclarer l'ensemble des variables que nous utiliserons 

Private Declare Function GetActiveWindow Lib "user32" () As Long
'On utilisera cette fonction pour faire une petite optimisation

Private PDirectX As New DirectX8		'Pour créer un contexte de Rendu 3d
Private PDirect3D As Direct3D8		'Pour utiliser le contexte de Rendu
Private PDevice As Direct3DDevice8	'Correspond au material d'affichage 
Private PStructParameter As D3DPRESENT_PARAMETERS	'Parametre d'affichage

Private MatWorld As D3DMATRIX		'La matrice d'affichage de notre monde 3d
Private MatView As D3DMATRIX		'Ma matrice de visualisation de notre monde
Private MatProj As D3DMATRIX		'La matrice de projection de notre monde sur l'ecran
Private poscam As D3DVECTOR 		'Position de la caméra
Private dircam As D3DVECTOR 		'Direction du regard de la caméra
Private percam As D3DVECTOR 		'Vers ou est le haut de la camera

Private RenduD3D as Boolean      'Booleen pour créer une boucle d'ffichage

Pour réaliser un affichage de notre monde 3d nous utiliserons une caméra cette caméra est basé sur l'utilisation d'une matrice  : MatView. Elle correspond  a ce que voie la caméra.
Pour afficher ce que voie la caméra sur notre ecran nous utiliserons une autre matrice, la matrice de projection MatProj. Enfin nous utiliserons une matrice MatWorld qui correspondra a la position de notre monde 3D.

Pour créer notre caméra nous utiliserons 3 vecteurs,  poscam qui correspond a la position de la camera dans notre monde en faite c'est plus un point qu'un vecteur, dircam qui correspond a la direction, en gros vers ou regarde la camera, et enfin percam qui montre le sommet de la caméra.

Un schema sera peut etre plus parlant :
http://img129.imageshack.us/img129/9377/poscambc8.png





Passons maintenant à l'initialisation de Direct3D, pour ce faire nous ajoutons une fonction :

Private Sub InitD3D(hWnd As Long, FullScreen As Boolean)
'hWnd correspond au hWnd d'affichage et FullScreen permet d'intialiser selon un affichage plein 
'ecran ou un affichage fenetré

    Dim mode As D3DDISPLAYMODE		
    'Cette variable va nous servir a stocker les parametres d'affichages de notre ordinateur pour la 
    'configuration de directx

    Set PDirect3D = PdirectX.Direct3DCreate()	'On initialise un contexte de rendu 3d
    PDirect3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode
    'Ici nous récupérons dans notre variable mode les différents parametres d'affichages de notre        
    'ordinateur
 
    With PstructParameter	'Initialisation de l'affichage
        .BackBufferCount = 1	'Un backbuffer
        .AutoDepthStencilFormat = D3DFMT_D16 	
	'On utilise un tampon de pronfondeur en 16 couleurs
        .EnableAutoDepthStencil = 1			'On active le tampon de profondeur
        .BackBufferFormat = mode.Format		'Pour le BackBuffer on utilise le format recupéré
        .hDeviceWindow = hWnd			'On utilise le hWnd passé en parametre
        .SwapEffect = D3DSWAPEFFECT_COPY_VSYNC	'On utilise la synchronisation verticale
    End With
    
    If FullScreen Then			'Si on est en plein ecran on passe en mode plein ecran 
        PStructParameter.Windowed = False
    Else
        PStructParameter.Windowed = True
    End If

    Set PDevice = PDirect3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
                                D3DCREATE_SOFTWARE_VERTEXPROCESSING, PStructParameter)
    
    'On initialise le Device avec des parametres standard et notre structure paramétré ci-dessus.
    ' D3DDEVTYPE_HAL permet l'utilisation de la carte graphique pour les calculs
    
    D3DXMatrixPerspectiveFovLH MatProj, 3.141592654 / 4, 1, 1, 10000
    'On créer la matrice de projection d'angle de champ de vision pi / 4 qui est une valeur 
    'generalement utilisé et dimension Width / Height avec en premier plan 1 et en dernier plan 1000
    PDevice.SetTransform D3DTS_PROJECTION, MatProj
   'On créer la transformation lié a la matrice

   'On positionne notre caméra 
    poscam.x = 0
    poscam.y = 0
    poscam.z = 100
    
    dircam.x = 0
    dircam.y = 0
    dircam.z = 0
    
    percam.x = 0
    percam.y = 1
    percam.z = 0
    
   'On met notre booleen a vrai
    RenduD3D = True
    
   Call Rendu(hWnd)

End Sub

Maitenant passons a notre fonction de Rendu : 

Private Sub Rendu(hWnd as long)
    If PDevice Is Nothing Then Exit Sub		'Si le device n'est pas initaliser on quitte
    
    While RenduD3D		'Tant que notre booleen est vrai
        
        DoEvents		'On laisse le processeur traiter les evenements systemes
        PDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HBBCCFF, 2, 1
       'On vide l'ecan
        Matrice		'On appel la fonction Matrice que l'on va decrire ci-dessous
        Pdevice.BeginScene	'On commence le rendu de la scene
        Pdevice.EndScene	'On fini le rendu de la scene
        PDevice.Present ByVal 0, ByVal 0, 0, ByVal 0		'On affiche l'image a l'ecran
       
        If GetActiveWindow <> hWnd Then	'Ici on teste si notre fenetre est affiché en premiere
            RenduD3D = False			'Dans le cas contraire on arrete le rendu
            Form1.Timer1.Enabled = True	'et on active un timer
        End If

    Wend
    
End Sub

Enfin la procédure Matrice :

Private Function Matrice()
    
    D3DXMatrixIdentity MatWorld
    PDevice.SetTransform D3DTS_WORLD, MatWorld	'On applique les transformation lié au 
    'monde
    
    D3DXMatrixLookAtLH MatView, poscam, dircam, percam
    PDevice.SetTransform D3DTS_VIEW, MatView
   'On applique les transformations liés a la matrice de visualisation
    
End Function

Enfin il faut mettre dans le Form_Load le chargement de notre code :

InitD3D Picture1.hWnd, False, Picture1.Width, Picture1.Height

Petite precision le ScaleMode de notre PictureBox doit etre en pixel.

Notre Timer, il est fixé a un interval de 500ms et a False

Private Sub Timer1_Timer()
    If GetActiveWindow = Form1.hWnd Then	'Si notre fenetre est active	
        RenduD3D = True				'on remet le rendu a true
        Timer1.Enabled = False				'On desactive le timer
        Call Rendu(Form1.hWnd)			'on relance le rendu
    End If
End Sub


J'espere que cette petite explication aura était explicite sur tous les points.

Conclusion

Le prochain tutorial traitera de l'affichage d'objet, des textures, et des deplacements dans le monde 3d.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

12 mai 2008 18:25:41 :
Rajout d'un lien vers le schema explicatif
15 mai 2008 16:09:03 :
Correction d'une erreur concernant l'aspect de la projection : D3DXMatrixPerspectiveFovLH
  • signaler à un administrateur
    Commentaire de benjionline le 11/05/2008 23:33:42

    Génial!!! J'ai tout compris! Bravo et encore merci

  • signaler à un administrateur
    Commentaire de mrfabrice le 12/05/2008 19:29:24

    J'essai de tranferer ce code sur VB 2008 avec directx9.

    Les déclarations DirectX8, Direct3D8 et D3DMATRIX ne sont pas reconnues.
    ou sont les références à ces objets ? quel éléments dois-je référencer ?

    Je cherche aussi à ouvrir en vb 2008 des fichiers 3DS (et collada) sans forcement les afficher mais pour les modifier (translation, renommage etc) Comment peut on faire ?

  • signaler à un administrateur
    Commentaire de ciberrique le 12/05/2008 20:32:36

    Pour le code vb2008 j'en ai aucune idée, pour ce qui est des fichiers 3ds une recherche sur le moteur de codes sources te donnera ta reponse.

  • signaler à un administrateur
    Commentaire de alex_vino le 13/05/2008 09:48:05

    Sinon il y a des exemplestrès bien détaillés de programmation de jeu 3D sur le site de Microsoft avec DirectX ou OpenGL.

Ajouter un commentaire

Pub



Appels d'offres

WEB DESIGN
Budget : 1 000€
Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS