Tutorial pour DirectX 9

Tutorial pour DirectX 9 - C++ - Programmation

Marsh Posté le 08-02-2004 à 18:39:55    

Bonjour à tous,
Je suis en train de faire un moteur 3D sous directX 9. J'aimerais savoir ou je pourrais trouver un tutorial pour m'aider. L'help du SDK n'étant pas suffisante et n'ayant rien trouvé de concluant sur le net.
 
Peu être que vous seriez comment loader un fichier .X et ensuite l'afficher?
Merci bcp.

Reply

Marsh Posté le 08-02-2004 à 18:39:55   

Reply

Marsh Posté le 08-02-2004 à 18:40:48    

cherche voir sur google  
 
drunken hyena
nexe
 
(c des noms de sites sur dx)
ca devrait faire ton bonheur

Reply

Marsh Posté le 08-02-2004 à 18:52:40    

Merci je zieute cela, ca parait interessant. bien que j'ai l'impression qu'il n'y ai pas tout ce dont j'ai besoin.

Reply

Marsh Posté le 08-02-2004 à 18:53:40    

regarde aussi les samples fournis avec DX

Reply

Marsh Posté le 08-02-2004 à 18:58:38    

J'ai déjà regardé ca mais c'est beaucoup trop compliqué au premier abord. J'ai trouvé un sample qui correspond a peu près a ce que je voudrais faire mais il y a trop de lignes de code pour comprendre.
Il faut que je prenne ca étape par étape. Sinon je m'en sortirais pas.

Reply

Marsh Posté le 08-02-2004 à 19:19:00    

Hankmoon a écrit :

J'ai trouvé un sample qui correspond a peu près a ce que je voudrais faire mais il y a trop de lignes de code pour comprendre.


C'est quoi ce que tu voudrait faire?  
 
 
 

Hankmoon a écrit :


Il faut que je prenne ca étape par étape. Sinon je m'en sortirais pas.


Ca c'est clair :)

Reply

Marsh Posté le 08-02-2004 à 20:04:15    

et bien je chercher à loader un fichier .X qui contient une animation et à l'afficher tout simplement. C'est dans le projet de faire un moteur de jeu video. Enfin une API qui permettrait de loader des ficher .X et de les animer facilement sans utilisaion de code.
Il me faut donc apprendre comment marche les DirectX 9. Pour l'instant tout fonctionne, intitialisation, clavier, souris, fullscreen et là je chercher a loader un fichier .X et à l'afficher.

Reply

Marsh Posté le 09-02-2004 à 18:29:45    

Y'a un sample nommé SkinnedMesh dans le SDK mais le code est vraiment bordelique.
Vous pouvez m'aider?

Reply

Marsh Posté le 09-02-2004 à 19:37:56    

personnellement, je te conseillerais de commençer par faire ton propre loader de fichier .ASC / .ASE / .3DS.
je doutes que les fichiers .X seront utilisés en production pour un jeu, et tu apprendras plein de choses en faisant un loader pour un format connu (en encore mieux faire ton propre format et faire un plugin pour un soft connu, mais c'est plus cho)
 
sinon charger un fichier .X, la boite à outils du DirectX doit avoir ce qu'il faut normallement...

Reply

Marsh Posté le 09-02-2004 à 19:42:21    

les fichiers .ASC sont les plus triviaux à charger...

Reply

Marsh Posté le 09-02-2004 à 19:42:21   

Reply

Marsh Posté le 12-02-2004 à 16:21:25    

Salut!
J'ai un petit probleme. J'ai reussi a loader mon fichier.x et à l'afficher sur l'ecran et maintenant j'aimerais l'animer.
Le personnage que j'ai modelisé sous 3D max est deja animé et j'ai converti cette animation dans le fichier.X (du moins je crois).
Comment dois je traiter l'affichage de l'animation ensuite avec directX 9 ?

Reply

Marsh Posté le 12-02-2004 à 17:27:24    

Salut, je ne peux pas trop t'aider car je ne connais quasiment rien a Direct 3D, mais tu pourras peut-etre trouver ce que tu veux la :
 
http://www.flipcode.com/
http://www.gamedev.net/reference/l [...] yid=24#134

Reply

Marsh Posté le 14-02-2004 à 14:06:25    

Merci je regarde ca.

Reply

Marsh Posté le 14-02-2004 à 20:23:26    

J'ai une sale erreur quand je compile.
3dobject.obj : error LNK2001: unresolved external symbol _D3DXLoadMeshFromXA@32
 
Visiblement ma fonction qui load mon fichier .x est pas accepter. Je comprend pas l'erreur que j'ai fais.
 
D3DXLoadMeshFromX( "Teubet.x", D3DXMESH_SYSTEMMEM, g_peripherique3D, &pAdjacencyBuffer, &pMtrlBuffer, NULL, &m_dwNumMaterials, &m_pSysMemMesh);

Reply

Marsh Posté le 14-02-2004 à 20:59:50    

tu n'as pas inclus le .LIB du D3DX.
genre le d3dx9.lib par exemple.
 
(fo regarder dans le MSDN/DOC du SDK:  
Header d3dx9mesh.h  
Import library d3dx9.lib  
)


Message édité par bjone le 14-02-2004 à 21:02:18
Reply

Marsh Posté le 14-02-2004 à 21:01:22    

un .lib? comment on include un .lib? c'est pas un .h que l'on fait generalement?

Reply

Marsh Posté le 14-02-2004 à 21:02:40    

tu inclus le .H
et tu rajoutes à ton projet le .LIB.

Reply

Marsh Posté le 14-02-2004 à 21:05:55    

hooo merci ! :) ca marche.

Reply

Marsh Posté le 14-02-2004 à 22:57:24    

Un truc qui parrait bizarre, maintenant que j'ai loadé mon fichier.x et que je fais un Render de celui ci, a aucun moment on me demande où je souhaite l'afficher. Ce qui fait qu'au final je n'ai aucune image dans mon programme. Comment dois je faire?

Reply

Marsh Posté le 15-02-2004 à 02:16:59    

heu lol...
 
tu dois définir tes matrices de monde, de vue et de projection ;) (si tu est en T&L fixe)
 
avec un VertexShader, tout ce petit monde se retrouve cumulé dans des regitres de constantes...


Message édité par bjone le 15-02-2004 à 02:18:02
Reply

Marsh Posté le 15-02-2004 à 23:40:09    

Oki, je commence à bosser ce gros bordel pour essayer d'y capter un choux, je vous recontacte si j'ai de mauvaises plantations ;) lol

Reply

Marsh Posté le 17-02-2004 à 17:20:24    

Voila j'ai fait mais 3 matrices: La matrice monde, la matrice view et la matrice projection. Je les ai toutes initialisé et j'ai lancé mon prog.... toujours rien... :/
Je vais vous schematiser mon prog:
WinMain{
//Init de la zindoz
 
//Loading de mon fichier X: D3DXLoadMeshFromX, OptimizeInplace,D3DXCreateTextureFromFile
item = new CD3DMesh("cube.x", jeu->Get_g_peripherique3D());
//Initialisation de mes matrices mondes, ...
init_matrices();
 
while(!g_app_done){
  //gestion des messages zindoz
  //gestion des peripheriques
  jeu->DebutRendu();
  //SetMaterial, SetTexture, DrawSubset
  item->Render(jeu->Get_g_peripherique3D() ,true ,true);
  jeu->Rendu();
}
}
 
Voila en résumé. Au final je n'ai aucune erreur. Je pense pas avoir fait d'erreur au niveau théorique (voir mon schema) donc je comprend pas trop d'où vient mon problème. Pourquoi j'ai rien qui s'affiche?
 
PS: Jeu est l'objet où je stock tout mes variables concernant directX et Item est l'endroit où sont stocké mes infos de mon fichier X.


Message édité par hankmoon le 17-02-2004 à 17:21:51
Reply

Marsh Posté le 17-02-2004 à 18:40:38    

montre l'initialisation de tes matrices.
 

Reply

Marsh Posté le 18-02-2004 à 01:29:04    

Voila:
 
void init_matrices(void){
 D3DXMATRIX view_matrix;
 D3DXMATRIX projection_matrix;
 D3DXVECTOR3 eye_vector;
 D3DXVECTOR3 lookat_vector;
 D3DXVECTOR3 up_vector;
 D3DXMATRIX world_matrix;
 float aspect;
 
   //Here we build our View Matrix, think of it as our camera.
 
   //First we specify that our viewpoint is 8 units back on the Z-axis
   //eye_vector=D3DXVECTOR3( 0.0f, 0.0f,-8.0f );
   eye_vector=D3DXVECTOR3( 0.0f, 30.0f,39.0f );
 
 //We are looking towards the origin
   lookat_vector=D3DXVECTOR3( 0.0f, 0.0f, -5.0f );
 
   //The "up" direction is the positive direction on the y-axis
   up_vector=D3DXVECTOR3(0.0f,1.0f,0.0f);
 
   D3DXMatrixLookAtLH(&view_matrix,&eye_vector,
                                   &lookat_vector,
                                   &up_vector);
 
   //Since our 'camera' will never move, we can set this once at the
   //beginning and never worry about it again
   (jeu->Get_g_peripherique3D())->SetTransform(D3DTS_VIEW,&view_matrix);
 
   aspect=((float)800 / (float)600);
 
   D3DXMatrixPerspectiveFovLH(&projection_matrix, //Result Matrix
                              D3DX_PI/4,          //Field of View, in radians.
                              aspect,             //Aspect ratio
                              1.0f,               //Near view plane
                              100.0f );           //Far view plane
 
   //Our Projection matrix won't change either, so we set it now and never touch
   //it again.
   (jeu->Get_g_peripherique3D())->SetTransform(D3DTS_PROJECTION, &projection_matrix);
 
 
   //The World Matrix transforms Model Coordinates into World Space coordinates.
   //Setting it to Identity means there is no transformation, so Model Space is directly
   //mapped onto World Space.
   D3DXMatrixIdentity(&world_matrix);
   (jeu->Get_g_peripherique3D())->SetTransform(D3DTS_WORLD,&world_matrix);
 
 
}
 
Disons que c'est assez basic juste histoire de voir si ca marche. Mais après recherche il parait avoir des erreurs au niveaux des variables qui sont passé pour l'affichage des meshs. Faut que je regarde ca plus en détail demain.

Reply

Marsh Posté le 18-02-2004 à 11:28:19    

mouef.
 
sinon tu mets 3 points dans un vertexbuffer, et tu fais un DrawPrimitive (voir un DrawPrimitibeUp avec un structure)

Reply

Marsh Posté le 18-02-2004 à 18:36:23    

Ouai j'y ai pensé aussi mais ca me fait enlever tout ce que j'ai fait avec mon load .x file. Et j'en ai pas trop envie surtout que techniquement tout est bon.... :( Il doit y avoir un petit erreur qui s'est inséré dans un coin... la merde pour la trouver.

Reply

Marsh Posté le 18-02-2004 à 18:44:31    

bah ça permet de confirmer que tout est bon en amont...
 
enfin ché pas moé, j'ai jamais utilisé le format des mesh du D3DX  :whistle:

Reply

Marsh Posté le 19-02-2004 à 00:03:50    

Ca y est ca marche... prob de camera c'était bien ca. Le perso etait afficher en noir, sans les textures sur fond noir donc on ne voyait rien. J'ai fais des tests avec d'autres fichiers.X et finalement j'ai réussi a retrouver l'erreur.
héhé
Maintenant qui sait comment loader une animation via un fichier.x ? :)

Reply

Marsh Posté le 19-02-2004 à 10:28:47    

Bienvenue sur le topic "faites mon moteur 3d pas à pas" ;)

Reply

Marsh Posté le 19-02-2004 à 11:40:31    

:lol:
c'est un peu ça :D

Reply

Marsh Posté le 19-02-2004 à 20:33:49    

looool ben oui, comme ca apres on aura un tuto tout bien fait sur DirectX 9, c'est pas cool ca?

Reply

Marsh Posté le 27-02-2004 à 00:06:23    

J'ai un petit problème. Je déclare une spot light et quand je lance ca bug... ai je mal déclaré ma lumière?
 
Light_Spot::Light_Spot(LPDIRECT3DDEVICE9 pd3dDevice){
 m_pd3dDevice = pd3dDevice;
 
 ZeroMemory( &m_light, sizeof(m_light) );
 m_light.Type = D3DLIGHT_SPOT;
 
 
 m_light.Diffuse.r  = 1.0f;
 m_light.Diffuse.g  = 1.0f;
 m_light.Diffuse.b  = 1.0f;
 m_light.Ambient.r  = 1.0f;
 m_light.Ambient.g  = 1.0f;
 m_light.Ambient.b  = 1.0f;
 m_light.Specular.r = 1.0f;
 m_light.Specular.g = 1.0f;
 m_light.Specular.b = 1.0f;
 
 m_light.Position.x = 0.0f;
 m_light.Position.y = 0.0f;
 m_light.Position.z = -300.0f;
 
 
 m_light.Theta        = 5.0f;
    m_light.Phi          = 6.0f;
    m_light.Falloff      = 1.0f;
 
 m_light.Attenuation0 = 1.0f;  
 m_light.Range        = 1000.0f;
 
 
 m_vecDir = D3DXVECTOR3(0.0f,
       0.0f,
       1.0f );
 D3DXVec3Normalize( (D3DXVECTOR3*)&m_light.Direction, &m_vecDir );
 
 m_pd3dDevice->SetLight( 1, &m_light );
 
}

Reply

Marsh Posté le 27-02-2004 à 00:07:42    

Ensuite je l'affiche avec cette fonction que j'ai repris du tutorial du SDK.
 
void Light_Spot::render(LPDIRECT3DDEVICE9 pd3dDevice){
 
 
 m_pd3dDevice->LightEnable( 1, TRUE);
 
 m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
 m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
 
}
 
Quand je lance mon programme, il s'arrete desuite sans me faire d'erreur. Bizarre....

Reply

Marsh Posté le 27-02-2004 à 10:48:02    

bah tu lances en debug, et tu regardes si ça cries....
tu compiles avec quoi VS ou autre ?

Reply

Marsh Posté le 28-02-2004 à 14:57:22    

VS oui, mais c'est bon j'ai réussi à trouver l'erreur. Par contre ma lumière éclaire les surfaces de devant et de derrières. Visiblement toutes les surfaces sont dessiner alors que celle qui se trouvent derrière ne devraient pas l'être.
Ce qui fait que ma lumière fait ressortir les surfaces de l'arrière et ca fait un truc très moche.
Il n'y a pas un truc à faire à l'initialisation pour empécher ca?

Reply

Marsh Posté le 29-02-2004 à 18:50:48    

régler le culling ?

Reply

Marsh Posté le 29-02-2004 à 19:35:40    

C'est la distance a partir de laquel les polygones sont affiché?
En openGL y'a une fonction qui dit que les triangles dessinés a l'envers ne sont pas rendu, donc qu'il n'y aura pas de lumière dessus. Il n'y aurait pas un truc similaire en DirectX ?

Reply

Marsh Posté le 29-02-2004 à 22:13:24    

non. c'est pas lié à la distance...
le backface culling...
 
http://msdn.microsoft.com/archive/ [...] 3dcull.asp
 
http://msdn.microsoft.com/archive/ [...] tetype.asp
 
->SetRenderState( D3DRS_CULLMODE, ... );
 

Reply

Marsh Posté le 01-03-2004 à 19:08:01    

Non apparament c'est pas ca. J'ai testé toute les valeurs du CULLMODE et rien de bien convaincant.
 
Est que vous savez par hasard comment lire une animation venant d'un fichier.X. C'est une partie pas du tout expliqué dans le SDK et pas traiter par les tuto d'internet, ni même par mon book du directX. Il m'explique comment est fait le fichier mais pas comment le lire et traiter l'animation frame par frame.

Reply

Marsh Posté le 01-03-2004 à 22:45:19    

bin à mon avis tu dois spécifier le temps au niveau du D3DX Mesh, et lors du rend, le D3DX doit configurer tout ce qu'il faut...
 
y'a un exemple dans le SDK...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed