|
begin process at 2008 07 06 18:46:26
Derniers logiciels
|
Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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
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.
Fichier Zip
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
Historique
- 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
Sources de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 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 | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|
|