Assimp und Nodetransformation

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Grinch
Beiträge: 25
Registriert: 16.04.2004, 22:42

Assimp und Nodetransformation

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp und Nodetransformation

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp und Nodetransformation

Beitrag 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.
Grinch
Beiträge: 25
Registriert: 16.04.2004, 22:42

Re: Assimp und Nodetransformation

Beitrag 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.
Dateianhänge
sponza.png
Grinch
Beiträge: 25
Registriert: 16.04.2004, 22:42

Re: Assimp und Nodetransformation

Beitrag 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...
Dateianhänge
sponza2.jpg
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp und Nodetransformation

Beitrag 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
Antworten