Voir la version complète : DXUT + D3DXMatrixDecompose = erreur :s
Bonjour à tous,
Je cherche à faire bouger un objet sur l'axe z. Donc je voudrais récupérer le z, le modifier et le réappliquer à la matrice.
Donc pour le ré&cupérer, je n'ai vu que la fonction D3DXMatrixDecompose:
D3DXMATRIX _matrix;
D3DXMatrixIdentity(&_matrix);
D3DXVECTOR3* scale;
D3DXVECTOR3* position;
D3DXQUATERNION* orientation;
D3DXMatrixDecompose(scale, orientation, position, &_matrix);
Lorsque j'éxécute ce code, j'obtient une erreur:
Unhandled exception at 0x005dbe2c in BattleKart.exe: 0xC0000005: Access violation writing location 0x00000003.
sur la ligne:
GET_SET_ACCESSOR( IDirect3DDevice9*, D3DDevice ); dans dxut.cpp
Qu'est-ce que j'dois faire?
Merci :)
A bientôt
j'ai essayé de mettre ce code autrepart, ça fait toujours la même erreur, mais ça break sur des lignes différentes..
A mon avis, faut activer un truc dans le OnFrameMove, un truc pareil que le BeginScene nan?
Lenolian
25/11/2005, 01h58
Comment crée-tu ton device? si tu as choisis un pure hardware, toute les fonctions getXXX ne sont plus utilisables. C'est le prix à payer pour gagner un peu de performances.
J'ai créé le Device via DXUT:
DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );
Mais lorsque je fais un D3DXMatrixDecompose, y'a pas de Get là dedant :s
Lenolian
25/11/2005, 02h24
Pourtant la présence du :
GET_SET_ACCESSOR( IDirect3DDevice9*, D3DDevice );
semble indiquer que en interne il fait un appel à une fonction get.
De toute façon je pense que le plus simple pour toi, serait de garder la position et l'orientation directement dans la classe de l'objet que tu veut transformer. Ainsi tu n'as plus besoin de faire une operation sans doute couteuse sur les matrices.
Ouais j'vais faire ça j'pense aussi
Merci :)
Tu passes des pointeurs non initialisés à ta fonction D3DXMatrixDecompose. Il faut lui passer des adresses d'objets alloués, puisque la fonction est censée les remplir.
D3DXVECTOR3 scale;
D3DXVECTOR3 position;
D3DXQUATERNION orientation;
D3DXMatrixDecompose(&scale, &orientation, &position, &_matrix);
grob1212
25/11/2005, 09h32
Je peux me tromper, mais ta manière de procéder pour effectuer des transformations sur des objets 3D me laisse à penser que tu n'as pas une vision claire de l'infographie 3D et du pipeline de ta carte graphique. Essayes de lire quelques articles sur le sujet, et comme toujours la doc du SDK est un bon point de départ, qui de plus contient quelques références bibliographiques ;)
En général, comme l'a dit Lenolian, on sépare les paramètres de position et d'orientation de l'objet dans la scène (que l'on appelle plus généralement pose de l'objet en vision par ordinateur) de sa représentation géométrique. Cette dernière définit l'objet dans un repère local qui lui est propre. Lorsque l'on désire effectuer le rendu de cet objet, on effectue la transformation du repère local vers le repère de la scène au moyen des paramètres de pose. Pour effectuer une simple rotation suivant Z, on modifie le paramètre de pose correspondant puis on calcule la matrice de transformation local/scène qui sera appliqué à tous les vertices du maillage de l'objet. Nul n'est besoin de conserver une trace de cette matrice puisque si l'objet est dynamique, elle doit être recalculée à chaque frame.
Merci LouLou, j'ai pigé pourquoi ça merdait.
Sinon en fait, j'ai un objet Entity qui englobe un objet .X que j'ai chargé à la construction, et pour le faire bouger, bah j'ai mis une variable membre D3DXMATRIX. Dans mon OnFrameRender, j'attribut cette matrice au device et je dessine l'objet, et dans mon OnFrameMove, je décompose la matrix, je modifie les valeurs pour la mettre à jour en fonction du contexte, et je recompose cette matrice désormais prêt à l'emploi pour le rendu...
En fait j'ai travaillé dans la simulation et la réalité virtuelle pour faire un éditeur de simulation 3D, et je me rappelle que on faisait comme ça, y'avait même plusieurs matrices (la matrice local, et une matrice par contrainte, que ça soit trajectoire, au sol, asservie à un autre objet ou en visée).
On envoyait les matrices de contraintes aux modules gérants celles ci, qui les mettaient à jour, puis on finissait par mettre à jour la local en multipliant les autres matrices.
Donc j'ai reproduit ça mais aparemment faut pas?
Qu'est-ce qui serait le mieux et le plus performant pour gérer les déplacements de mon objet? Je dois aussi calculer la vitesse, l'accélération, la position en fonction du sol (si c'est une pente par exemple), donc je compte rajouter un D3DXVECTOR3 pour chaque "force" dont mon objet sera contraint...
Aussi, j'ai un objet Ground, qui lui aussi charge un .X pour représenter le sol, et les objets faisant parti du décord, est-ce que je peux accéder facilement à des données comme la normal du sol à une certaine coordonnée? Dans l'éditeur de simulation, on utilisait le picking... c'est une bonne technique ça?
Merci :)
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org