Seite 1 von 1

Assimp und Nodetransformation

Verfasst: 27.11.2011, 12:16
von Grinch
Hallo zusammen,
nach langer Zeit habe ich endlich mal wieder Zeit mich mit DirectX zu beschäftigen. Ich habe angefangen ein kleines Framework zu schreiben, um ein wenig mit Shadern in DX11 rumzuspielen. Um mal mehr als nur ein Terrain anzuzeigen.
Um Models zu laden habe ich mir Assimp angeschaut und eingebunden. Es ist wirklich einfach die Bibliothek einzubinden. Da die Macher von Assimp hier auch unterwegs sind sage ich schon mal großen Respekt dafür :D

Nun zum Problem:
Zum Testen habe ich das Crytek Sponza Modell genommen und noch anderes Sponzamodell gefunden. Ich baue die Hierarchie aus den aiNodes auf.
Folgendermaßen lade ich die Matrix ein:

Code: Alles auswählen

	D3DXMATRIX* mat = (D3DXMATRIX*)&node->mTransformation;
	D3DXMATRIX world;
	D3DXMatrixTranspose(&world,mat);
Um die Submeshes richtig zu positionieren benutze ich folgenden Code:

Code: Alles auswählen

	pworld = (D3DXMATRIX*)dev->getEffectParameter(String(L"MATRIX_WORLD"));
	if(pworld)
	{
		origworld=*pworld;
		D3DXMatrixMultiply(&world,pworld,&m_world);
	}

	dev->updateEffectParameter(String(L"MATRIX_WORLD"),&world);
pworld ist die aktuelle Worldmatrix, m_world ist die transponierte mTransformation-Matrix.
Die Objekte sind nun auch alle da, aber nicht da, wo sie hingehören.
Ich habe auch im AssimpViewer-Code geschaut, wie es dort gemacht wird, habe aber keine Stelle gefunden, wo die mTransformation benutzt wird. Der Viewer kann allerdings die Models richtig anzeigen.

Hat jemand einen Tipp für mich, was ich falsch mache?

Grüße

Re: Assimp und Nodetransformation

Verfasst: 29.11.2011, 13:37
von kimmi
Hi,

schau einfach mal im Assimp-Viewer in die Methode CDisplay::RenderNode( .. ). Der Code sollte dir weeiterhelfen können. Dort wird die Hierarchie gesetzt.

Gruß Kimmi

Re: Assimp und Nodetransformation

Verfasst: 29.11.2011, 14:56
von Aramis
Multiplizierst du die Knoten hierarchisch zusammen? Um es zu vereinfachen, wuerde ich dafuer ggf. Assimp's Matrixcode benutzen und dann nur einmal nach DX konvertieren (oder umgekehrt), denn dort ist die Matrizen-Konvention ja (imho) anders/transponiert.

Re: Assimp und Nodetransformation

Verfasst: 29.11.2011, 19:37
von Grinch
Danke schon mal für die Antworten.
Ich habe in der Zwischenzeit etwas weiterprobiert und es hinbekommen, dass das Modell quasi richtig darzustellen. Allerdings gehen mir noch ein paar Vertices ab (mittlere Säule im Bild)
Folgendes mache ich derzeit:
Ich lade per Assimp-Readfile mit folgenden Parametern

Code: Alles auswählen

aiProcess_Triangulate|aiProcess_JoinIdenticalVertices|aiProcess_SortByPType|aiProcess_ConvertToLeftHanded|aiProcess_GenNormals|aiProcess_GenSmoothNormals
Die lokale Matrix mTransformation wandle ich folgendermaßen um und speichere sie pro Hierarchieknoten:

Code: Alles auswählen

	D3DXMATRIX* mat = (D3DXMATRIX*)&node->mTransformation;
	D3DXMATRIX world=*mat;
	D3DXMatrixTranspose(&world,mat);
Die lokale Matrix setze ich nun nur noch pro Mesh. Die Childs werden also nicht mehr multipliziert sondern setzen nur noch ihre lokale Matrix.
Das dürfte so eigentlich nicht richtig sein, das Modell sieht aber richtig aus.
Eigentlich bedeutet dies, dass die Vertices nicht in der lokalen Matrix gespeichert sind sondern schon vortransformiert oder? Reicht es dann die lokale Matrix mit der invertierten Parentknotenmatrix zu multiplizieren und diese zu speichern? Dann sollten die Childmatrizen ja wieder multiplizierbar sein und das selbe Ergebnis wie der jetzige Code produzieren. Das werde ich mal ausprobieren.

Ich würde gern beim Laden die Matrizen konvertieren und dann beim Rendern nur noch die internen verwenden, ohne ein Zweitsystem durchzuschleifen.

Re: Assimp und Nodetransformation

Verfasst: 30.11.2011, 01:32
von Grinch
Das mit dem Invertieren der Parentmatrix funktioniert, allerdings ändert sich dadurch nicht das Endresultat. Die Säule ist immer noch kaputt
Ich habe das Ganze mal mit dem OBJ-Modell probiert und damit funktioniert alles super :D
Allerdings gibts dort auch keine Matrizen...

Re: Assimp und Nodetransformation

Verfasst: 30.11.2011, 10:35
von kimmi
Das mit den Matrizen wird mienes Wissens nach vom Obj-Format unterstützt, allerdings habe ich das bisher noch nicht implementiert. Ich brauche dringend mehr Zeit :(.

Gruß Kimmi