Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008
-
8 déc. 2003 à 17:21
AbeLeMudokon
Messages postés15Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 2006
-
29 août 2004 à 11:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
AbeLeMudokon
Messages postés15Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 2006 29 août 2004 à 11:37
envoie ta source (hongueul@wanadoo.fr) avec le mesh et je verrai ce que je peux faire :)
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 27 août 2004 à 20:21
Bonjour à tous,
J'ai utilisé la technique de AbeLeMudokon (même si je n'est pas idée de laquelle est la meilleure ...) et je me trouve face a un comportement étrange en effet sur le Tutorial modifié comme il l'a expliquer j'ai changé :
1) ///////////////////
'Variables globales
Global Objet(1) As ModeleObjet
2) ///////////////////
Sub Main()
'Définir le répertoire par défaut
ChDir App.Path
'Initialiser DirectX
DirectX_Initialiser
'Charger le mesh
Mesh.NomFichier = "Mesh.x"
Objet3D_Charger Mesh
3) ///////////////////
'Afficher les objets
For n = 1 To 1
Objet3D_Afficher Mesh, Objet(n).Position, Objet(n).Rotation
Next n
Ceci fais comme si mon mesh (en l'occurence un avion) faisait des loopings sur place. Et le probleme est que :
Lorsque l'avion est parllèle au sol il fait une certaine longueur (~15 cm chez moi) et lorsqu'il est vertical, il est comme conpacté (ce qui fait que ca longueur est de ~13 cm chez moi)
Au secour, Je n'y comprend rien !!!!
Xav88
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 24 juin 2004 à 23:35
Salut à tous, et merci pour les mails qui me sont parvenus. Je vous informe ici, que j'ai découvert récément deux nouvelles fonctions, propres aux rotations et translations de mesh (avec la formule du tuto, j'ai vu que cela pouvait bugger).
Il faut comme dans le tutorial extraire les points du Mesh et les placer dans un tableau de points mais il faut déclarer ces points en type D3DVECTOR que ce soit pour les vecteurs de normales, que pour les vecteurs de position. Puis, au lieu d'utiliser la fonction D3DXVec4Transform pour déplacer ces vecteurs, il faut utiliser pour le déplacement des vecteurs de position la matrice : D3DXVec3TransformCoord
Pour le déplacement des vecteurs de normale il faut utiliser la fonction
D3DXVec3TransformNormal
Nota : Pour déplacer un Mesh avec ces opérations de transformation il n'est pas utile de multiplier les matrices si on veut que en une fois nos points fassent par exemple un rotation et une translation. Il suffit d'utiliser les fonctions que je vient de citer deux fois : une fois pour la rotation des points et des normales avec une matrice Rotation, et une autre fois pour la translation avec une matrice Translation.
Voilà, testez cette petite modif, si vous aviez eu des buges avec D3DXVec4Transform, ils devraient disparaitre.
A plus
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 1 mai 2004 à 15:07
Salut AbeLeMudokon,
Je voudrais bien essayer ta technique mais je n'arrive pas a la mettre en place comme tu l'explique ( Je n'ai jamais utiliser les Type...End Type)
Si tu pouvais m'envoyer le tuto avec tes modification ce serait très sympa...
Voici mon mail : xavroi2003@hotmail.com
Merci d'avance
Xav
AbeLeMudokon
Messages postés15Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 2006 5 avril 2004 à 22:18
un petit détail : g mis :
D3DXMatrixTranslation MatriceTemporaire, 0, 0, 10
mais il faudrait plutot mettre :
D3DXMatrixTranslation MatriceTemporaire, objet.position.x, objet.position.y, objet.position.z
voila c'était tout
AbeLeMudokon
Messages postés15Date d'inscriptionsamedi 13 mars 2004StatutMembreDernière intervention 5 mai 2006 5 avril 2004 à 22:12
Excellente source, ca mérite 9/10
J'aurai quand meme une petite remarque à faire à propos du module d'animation : essaye ton code avec la rotation d'une centaine de mesh à chaque frame, et tu verras que le programme va ralentir tres sérieusement.
donc voici la solution miracle (qui est d'ailleurs un peu plus courte) :
1) créer un type Objet3D dans le module principal :
Type ModeleObjet3D
Mesh As D3DXMesh
NomFichierMesh As String
Position As D3DVECTOR
Rotation As D3DVECTOR
Buffer As D3DXBuffer
Texture() As Direct3DTexture8
Material() As D3DMATERIAL8
NombreMaterial As Long
End Type
(je pense que les noms des variables sont assez explicites pour que je n'aie pas à détailler)
2) pour le chargement, on fait comme d'habitude, mais sans les 2 dernieres lignes (GetNumVertices...)
3) dans le module d'affichage créer une sub :
Sub Objet3D_Afficher(Objet As ModeleObjet3D)
Dim MatriceWorld As D3DMATRIX
Dim MatriceTemporaire As D3DMATRIX
Dim n As Byte
'Calculer les transformations de l'objet
D3DXMatrixIdentity MatriceWorld
D3DXMatrixRotationY MatriceTemporaire, Objet.Rotation.y
D3DXMatrixMultiply MatriceWorld, MatriceWorld, MatriceTemporaire
D3DXMatrixTranslation MatriceTemporaire, 0, 0, 10
D3DXMatrixMultiply MatriceWorld, MatriceWorld, MatriceTemporaire
DX.Device.SetTransform D3DTS_WORLD, MatriceWorld
'Afficher l'objet
For n = 0 To Objet.NombreMaterial - 1
DX.Device.SetMaterial Objet.Material(n)
DX.Device.SetTexture 0, Objet.Texture(n)
Objet.Mesh.DrawSubset n
Next n
End Sub
(ici il par économie de place je n'ai mis que la rotation en y, il faudrait faire de meme avec les axes x et y)
4) dans la sub Prendu, entre le BeginScene et le EndScene :
Objet3D_Afficher Voiture 'où Voiture est un objet ModeleObjet3D
5) Pour faire une rotation de l'objet on rajoute dans la boucle principale :
Voiture.Rotation.y = Voiture.Rotation.y + 0.1
voila A+
cs_gluk
Messages postés43Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 avril 2008 23 févr. 2004 à 23:09
Super bien détaillé,
merci pour ce tuto,
marche nikel Chez moi.
rumik
Messages postés1Date d'inscriptiondimanche 15 février 2004StatutMembreDernière intervention15 février 2004 15 févr. 2004 à 18:43
merci pour ce pt programme bien instructif
joelmarie
Messages postés27Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention12 juin 2008 17 janv. 2004 à 22:50
super giga carement bien merci
11/10
Pascalitou
Messages postés1Date d'inscriptionjeudi 6 mars 2003StatutMembreDernière intervention17 décembre 2003 17 déc. 2003 à 21:02
Message
Trés bon travail et trés bien explique le code source
Bref félicitations un amateur de programmation DIRECT X
A plus
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 17 déc. 2003 à 15:02
J'ai essayé de changer le mesh mais quand j'exécute le projet avec mon mesh, l'écran change de résolution reste noir 1 ou 2 seconde et revient sous visual basic comme si je n'avais rien fait.
Si quelqu'un sait pourquoi j'ai ce problème.........
Merci d'avance
Xav
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 10 déc. 2003 à 13:47
Génial !!!!!!!!
J'ai mis "D3DFMT_X8R8G8B8" en Backbuffer dans le module initialistation et ça marche !!!
Merci
Xav.
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 10 déc. 2003 à 13:22
Merci rémi du tuyau, Mauricet m'avait fait part de la même chose par message interne mais je n'avais pas pu le diffuser pour l'instant car la page buggait. J'ai remarqué également que si on ne met rien dans la variable Ppath, ça peut marcher.
Merci pour tous vos commentaires à venir. N'hésiter à dire si le programme marche ou pas chez vous, et à quel endroit ça plante, merci.
Guidelor
Messages postés236Date d'inscriptionjeudi 31 octobre 2002StatutMembreDernière intervention18 août 2006 10 déc. 2003 à 12:15
ça veut pas marcher chez moi...
J'ai eu beau changer le format , la résolution , mon nombre de bits , ...
mais toujours l' eternelle "Automation error" ou "Argument ou appel de procédure incorrect"...
cs_remi1203
Messages postés42Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 5 novembre 2005 10 déc. 2003 à 09:52
petit truc : si tu mets Ppath = App.Path
ca te renvoie le repertoire courant où de trouve l'exe
apres, je te conseille de rajouter le ligne :
If Not Right(Ppath,1) "" then Ppath Ppath & ""
ca te mets un slash à la fin si il y est pas.
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 9 déc. 2003 à 23:25
On dirait que la mise à jour de mon code ou du moins des explications du fonctionnement a permis de réparer cette page.
Donc, pour résumer, je pense avoir trouvé la solution au problème. Il faut changer le format du Backbuffer dans le module initialisation. Enlevez D3DFMT_R5G6B5, et essayez les formats D3DFMT_A8R8G8B8, ou D3DFMT_R8G8B8, ou D3DFMT_X8R8G8B8. Normalement cela devrait marcher.
A plus, et merci de laisser vos commentaires
cs_LaPatoshe
Messages postés53Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 décembre 2009 9 déc. 2003 à 23:22
essai
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 8 déc. 2003 à 19:19
C'est encore moi
J'oubliais de préciser que j'ai bien changé le chemin d'accès Ppath !!!
Xav
DragonDo
Messages postés93Date d'inscriptionlundi 8 avril 2002StatutMembreDernière intervention22 juillet 2006 8 déc. 2003 à 19:10
Salut,
J'ai également une erreur à cette ligne !
@+
Xav88
Messages postés178Date d'inscriptionmercredi 8 octobre 2003StatutMembreDernière intervention25 septembre 2008 8 déc. 2003 à 17:21
Salut
Moi j'ai un petit problème :
Quand j'execute le prog j'ai une erreur
«Argument ou appel de procédure incorrect» dans le module «géométrie» sur la ligne :
29 août 2004 à 11:37
27 août 2004 à 20:21
J'ai utilisé la technique de AbeLeMudokon (même si je n'est pas idée de laquelle est la meilleure ...) et je me trouve face a un comportement étrange en effet sur le Tutorial modifié comme il l'a expliquer j'ai changé :
1) ///////////////////
'Variables globales
Global Objet(1) As ModeleObjet
2) ///////////////////
Sub Main()
'Définir le répertoire par défaut
ChDir App.Path
'Initialiser DirectX
DirectX_Initialiser
'Charger le mesh
Mesh.NomFichier = "Mesh.x"
Objet3D_Charger Mesh
'Initialiser les différents objets
Objet(1).Position = CreerD3DVECTOR(-3, 0, 20)
'Objet(2).Position = CreerD3DVECTOR(100, 100, 100)
'Objet(3).Position = CreerD3DVECTOR(100, 100, 100)
Objet(1).Rotation.y = 3.14597 / 2 'Permet de voir le mesh de profil.
'Initialiser l'éclairage
CreerLumiereDirectionnelle CreerD3DCOLORVALUE(1, 1, 1, 1), CreerD3DVECTOR(0, 0, 1), 0
'Début de la boucle principale
Do
'Traitement des évenements Windows
DoEvents
'Effectuer les rotations des objets
Objet(1).Rotation = CreerD3DVECTOR(Objet(1).Rotation.x + 0.1, Objet(1).Rotation.y, Objet(1).Rotation.z)
' Objet(2).Rotation = CreerD3DVECTOR(Objet(2).Rotation.x, Objet(2).Rotation.y, Objet(2).Rotation.z + 0.01)
' Objet(3).Rotation = CreerD3DVECTOR(Objet(3).Rotation.x + 0.1, Objet(3).Rotation.y, Objet(3).Rotation.z)
'Rendu de la scène
DirectX_Rendu
Loop
End Sub
3) ///////////////////
'Afficher les objets
For n = 1 To 1
Objet3D_Afficher Mesh, Objet(n).Position, Objet(n).Rotation
Next n
Ceci fais comme si mon mesh (en l'occurence un avion) faisait des loopings sur place. Et le probleme est que :
Lorsque l'avion est parllèle au sol il fait une certaine longueur (~15 cm chez moi) et lorsqu'il est vertical, il est comme conpacté (ce qui fait que ca longueur est de ~13 cm chez moi)
Au secour, Je n'y comprend rien !!!!
Xav88
24 juin 2004 à 23:35
Il faut comme dans le tutorial extraire les points du Mesh et les placer dans un tableau de points mais il faut déclarer ces points en type D3DVECTOR que ce soit pour les vecteurs de normales, que pour les vecteurs de position. Puis, au lieu d'utiliser la fonction D3DXVec4Transform pour déplacer ces vecteurs, il faut utiliser pour le déplacement des vecteurs de position la matrice : D3DXVec3TransformCoord
Pour le déplacement des vecteurs de normale il faut utiliser la fonction
D3DXVec3TransformNormal
Nota : Pour déplacer un Mesh avec ces opérations de transformation il n'est pas utile de multiplier les matrices si on veut que en une fois nos points fassent par exemple un rotation et une translation. Il suffit d'utiliser les fonctions que je vient de citer deux fois : une fois pour la rotation des points et des normales avec une matrice Rotation, et une autre fois pour la translation avec une matrice Translation.
Voilà, testez cette petite modif, si vous aviez eu des buges avec D3DXVec4Transform, ils devraient disparaitre.
A plus
1 mai 2004 à 15:07
Je voudrais bien essayer ta technique mais je n'arrive pas a la mettre en place comme tu l'explique ( Je n'ai jamais utiliser les Type...End Type)
Si tu pouvais m'envoyer le tuto avec tes modification ce serait très sympa...
Voici mon mail : xavroi2003@hotmail.com
Merci d'avance
Xav
5 avril 2004 à 22:18
D3DXMatrixTranslation MatriceTemporaire, 0, 0, 10
mais il faudrait plutot mettre :
D3DXMatrixTranslation MatriceTemporaire, objet.position.x, objet.position.y, objet.position.z
voila c'était tout
5 avril 2004 à 22:12
J'aurai quand meme une petite remarque à faire à propos du module d'animation : essaye ton code avec la rotation d'une centaine de mesh à chaque frame, et tu verras que le programme va ralentir tres sérieusement.
donc voici la solution miracle (qui est d'ailleurs un peu plus courte) :
1) créer un type Objet3D dans le module principal :
Type ModeleObjet3D
Mesh As D3DXMesh
NomFichierMesh As String
Position As D3DVECTOR
Rotation As D3DVECTOR
Buffer As D3DXBuffer
Texture() As Direct3DTexture8
Material() As D3DMATERIAL8
NombreMaterial As Long
End Type
(je pense que les noms des variables sont assez explicites pour que je n'aie pas à détailler)
2) pour le chargement, on fait comme d'habitude, mais sans les 2 dernieres lignes (GetNumVertices...)
3) dans le module d'affichage créer une sub :
Sub Objet3D_Afficher(Objet As ModeleObjet3D)
Dim MatriceWorld As D3DMATRIX
Dim MatriceTemporaire As D3DMATRIX
Dim n As Byte
'Calculer les transformations de l'objet
D3DXMatrixIdentity MatriceWorld
D3DXMatrixRotationY MatriceTemporaire, Objet.Rotation.y
D3DXMatrixMultiply MatriceWorld, MatriceWorld, MatriceTemporaire
D3DXMatrixTranslation MatriceTemporaire, 0, 0, 10
D3DXMatrixMultiply MatriceWorld, MatriceWorld, MatriceTemporaire
DX.Device.SetTransform D3DTS_WORLD, MatriceWorld
'Afficher l'objet
For n = 0 To Objet.NombreMaterial - 1
DX.Device.SetMaterial Objet.Material(n)
DX.Device.SetTexture 0, Objet.Texture(n)
Objet.Mesh.DrawSubset n
Next n
End Sub
(ici il par économie de place je n'ai mis que la rotation en y, il faudrait faire de meme avec les axes x et y)
4) dans la sub Prendu, entre le BeginScene et le EndScene :
Objet3D_Afficher Voiture 'où Voiture est un objet ModeleObjet3D
5) Pour faire une rotation de l'objet on rajoute dans la boucle principale :
Voiture.Rotation.y = Voiture.Rotation.y + 0.1
voila A+
23 févr. 2004 à 23:09
merci pour ce tuto,
marche nikel Chez moi.
15 févr. 2004 à 18:43
17 janv. 2004 à 22:50
11/10
17 déc. 2003 à 21:02
Trés bon travail et trés bien explique le code source
Bref félicitations un amateur de programmation DIRECT X
A plus
17 déc. 2003 à 15:02
Si quelqu'un sait pourquoi j'ai ce problème.........
Merci d'avance
Xav
10 déc. 2003 à 13:47
J'ai mis "D3DFMT_X8R8G8B8" en Backbuffer dans le module initialistation et ça marche !!!
Merci
Xav.
10 déc. 2003 à 13:22
Merci pour tous vos commentaires à venir. N'hésiter à dire si le programme marche ou pas chez vous, et à quel endroit ça plante, merci.
10 déc. 2003 à 12:15
J'ai eu beau changer le format , la résolution , mon nombre de bits , ...
mais toujours l' eternelle "Automation error" ou "Argument ou appel de procédure incorrect"...
10 déc. 2003 à 09:52
ca te renvoie le repertoire courant où de trouve l'exe
apres, je te conseille de rajouter le ligne :
If Not Right(Ppath,1) "" then Ppath Ppath & ""
ca te mets un slash à la fin si il y est pas.
9 déc. 2003 à 23:25
Donc, pour résumer, je pense avoir trouvé la solution au problème. Il faut changer le format du Backbuffer dans le module initialisation. Enlevez D3DFMT_R5G6B5, et essayez les formats D3DFMT_A8R8G8B8, ou D3DFMT_R8G8B8, ou D3DFMT_X8R8G8B8. Normalement cela devrait marcher.
A plus, et merci de laisser vos commentaires
9 déc. 2003 à 23:22
8 déc. 2003 à 19:19
J'oubliais de préciser que j'ai bien changé le chemin d'accès Ppath !!!
Xav
8 déc. 2003 à 19:10
J'ai également une erreur à cette ligne !
@+
8 déc. 2003 à 17:21
Moi j'ai un petit problème :
Quand j'execute le prog j'ai une erreur
«Argument ou appel de procédure incorrect» dans le module «géométrie» sur la ligne :
Set Pmesh = Pd3dx.LoadMeshFromX(Ppath & "mesh.x", D3DXMESH_MANAGED, PDevice, Nothing, Pbuffer, nbmaterial)
Si quelqu'un peut m'aider......
Xav