[Assimp] Material auslesen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

[Assimp] Material auslesen

Beitrag von Jonathan »

Ich versuche einen Texturnamen auszulesen:

Code: Alles auswählen

aiString ColormapFile;
if(AI_SUCCESS==aiMaterial->Get(AI_MATKEY_TEXTURE_DIFFUSE(0), ColormapFile))
{
 // blub
Leider scheint das nicht immer zu funktionieren. Ich habe eine Obj Datei, mit einem simplen Material, aber mit dieser Funktion kann ich die Textur irgendwie nicht auslesen. Hier ist mal das Material:
# Blender3D MTL File: Spider0.blend
# Material Count: 1
newmtl Material_spider0_color.tga.png
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2
map_Kd Spider0_colormap.png
map_Kd müsste ja eine DiffuseMap sein.
Wenn ich den Assimp Viewer benutze, wird auch alles korrekt geladen und die Textur erscheint unter DiffuseMap1 genau wie die Textur von einem anderen Modell (Der .x Zwerg aus den AssimpTestmodels). Komisch ist halt, dass die Textur vom Zwerg geladen wird, die von der Spinne aber nicht. Ich meine auch, dass früher mal alles problemlos funktioniert hätte, aber das kann ich halt jetzt nicht mehr testen.
Ich habe gerade eben nochmal Assimp aktualisiert und komplett neu kompiliert, ebenso mein Projekt, aber es geht nicht. Ahja, Assimp erzeugt beim kompilieren eine Menge Warnungen, will die nicht mal jemand beheben?^^

Die Sache ist eben, ich möchte Materialien gut auslesen können und nicht einfach zig Sachen prüfen ob diese vorhanden sind, oder nicht. Ich hab in der Doku nicht einmal eine Funktion gefunden, um zu ermitteln, wie viele Texturen es wovon gibt.

Die Frage ist also: Wie lese ich die Textur korrekt aus, und wie kann ich ansonsten am besten ein AssimpMaterial laden?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Ich schau mir mal an, wie die Diffuse-Map im Obj-Material gespeichert wird. Ich meine, daß das implementiert ist ( @Aramis: hast du da nicht etwas nachgeschoben? ). Da es deinen angaben nach bei anderen richtig funktioniert, tippe ich auf einen Bug im Obj-Loader. Davon dann mehr, sobald ich mir das angesehen habe.

Gruß Kimmi
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Versuch mal map_kd statt map_Kd und sage mir, ob dir damit geholfen sein könnte. Wir sind im Obj-Loader case-sensitiv.

Guß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Die Sache ist eben, ich möchte Materialien gut auslesen können und nicht einfach zig Sachen prüfen ob diese vorhanden sind, oder nicht. Ich hab in der Doku nicht einmal eine Funktion gefunden, um zu ermitteln, wie viele Texturen es wovon gibt.
Das ist richtig, es gibt sie nicht. Die einzige Variante ist tatsächlich für einen bestimmten Texturtyp t solange AI_MATKEY_TEXTURE(t,n) abzufragen bis der Aufruf fehlschlägt - alternativ noch aiGetMaterialTexture/aiMaterial::GetTexture().

Zugegebenermaßen nicht unbedingt notwendig - viel ändern kann man am Materialsystem nicht mehr, aber eine aiGetNumTextures()-Funktion wäre tatsächlich hilfreich .. mal gucken.
Wir sind im Obj-Loader case-sensitiv.
Ich denke nicht, dass das der Fall ist - meine von dir erwähnten Änderungen haben außer der Unterstützung für die ganzen Sonder-Maptypen auch den Stringvergleich umgestellt, denke ich.
Ahja, Assimp erzeugt beim kompilieren eine Menge Warnungen, will die nicht mal jemand beheben?^^
Ja, ich weiß - Marks B3D-Loader schmeißt einige Cast-Warnungen, auf höchster Warnstufe ist es in der ganzen Lib noch viel schrecklicher. Nichts bedenkliches zwar. Könnte man der Perfektion halber mal beseitigen - leider verhält es sich da wie mit allem anderen das nichts Essentielles zur Funktionalität hinzufügt: Zeit und Motivationsmangel. Wer Lust hat da mal aufzuräumen, willkommen - andernfalls werde ich es wahrscheinlich am Tag vorm' Release machen :D

- Alex
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

@Aramis:
Stimmt, du hast recht. Der Test benutzt assimp_stricmp, da hatte ich fälschlicherweise angenommen, daß der nicht auf Case-Sensity schaut, sorry. Also kann man die Materialdefinition schon so lassen.

Wegen Compiler-Warnungen: Einige wenige sind nun weg, bleibt noch einiges übrig.

Gruß Kimmi
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Ich habe nochmal ein anderes Modell mit Blender exportiert, das Material sieht im Prinzip genauso aus und ich kann die Textur nicht laden.
Die Frage ist jetzt, ob der obj-Loader insgesamt kaputt ist, und die Textur nirgends im Material zu finden ist, oder ob ich sie vielleicht mit einem anderen key auslesen muss.
Ich schätze, da AssimpView alles korrekt anzeigt, ist der mit einer älteren Version kompiliert, wodurch es dann ja auch logisch wäre, dass es früher bei mir mal ging.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Hoi, bitte schick Kimmi oder mir mal ein solches Modell (obj und mtl).
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Danke dir! Ich schau mir die Modelle das Wochenende an und check, was da schiefgeht!

Gruß Kimmi
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Hab die Spinne und das Gewehr aus den offiziellen Assimp TestModellen getestet, dort besteht das Problem offensichtlich auch (keine Textur).
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Das ist komisch, ich habe gerade gestern abend beide mir angesehen. Da liefen die ohne Probleme. Ich habe die aktuellen Sourcen benutzt.

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Offtopic: aiGetMaterialTextureCount() und aiMaterial::GetTextureCount() sind nun verfügbar.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [Assimp] Material auslesen

Beitrag von Chromanoid »

das nenn ich echten fanservice :)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Mensch, der ist schnell, der Aramis :)...

Gruß Kimmi
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Ok, also:

Code: Alles auswählen

Assimp::Importer Importer;
const aiScene* Scene=Importer.ReadFile(Filename, aiProcess_Triangulate | aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeGraph);

Code: Alles auswählen

for(unsigned int i=0; i<Scene->mNumMaterials; ++i)
	m_Materials.push_back(new Material(Scene->mMaterials[i], Path));

Code: Alles auswählen

cout << "Diffusemaps: " << aiMaterial->GetTextureCount(aiTextureType_DIFFUSE) << endl;
cout << "Ambientmaps: " << aiMaterial->GetTextureCount(aiTextureType_AMBIENT) << endl;
cout << "Emissivemaps: " << aiMaterial->GetTextureCount(aiTextureType_EMISSIVE) << endl;
cout << "Unknown Maps: " << aiMaterial->GetTextureCount(aiTextureType_UNKNOWN) << endl;
cout << "None Maps: " << aiMaterial->GetTextureCount(aiTextureType_NONE) << endl;
Hier wird überall 0 angezeigt, bei allen Obj-Dateien. Ich habe Assimp nochmal aktualisiert, ich benutze Rev 469 und es werden keine Texturen aus Obj Dateien geladen.

Was soll ich jetzt konkret tun? Das einzige, womit man scheinbar Fehler Abfragen kann, sind Lesefehler, bei ReadFile, aber die Datei wird ja korrekt geladen (Scene!=NULL).
Ich habe diverse andere Modellformate getestet und da funktionieren die Duffuse Maps immer.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Hm, ich habe Testweise mal alle Flags (RemoveRedundantMaterials und so) raus genommen, es hätte ja auch sein können, dass die die Materialeinstellungen irgendwie kaputt machen. Das war aber nciht der Fall, bzw. wenn sie es tuen dann waren die auch vorher schon kaputt, denn auch ohne die Flags geht es nicht.
Zusätzlich habe ich auch mal den Fehlerstring (Importer.GetErrorString()) angezeigt, auch wenn die Szene geladen wurde, der ist leer.

Aus meiner Sicht weiß ich nix mehr, was ich jetzt noch probieren könnte.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Hoi,

erklären kann ich es mir nicht. Wie auch bei Kimmi funktioniert bei mir alles wunderbar ...

- Welche Plattform eigentlich? x86 oder amd64?
- Welcher Compiler?
- Sagt Assimp's Logausgabe irgendwas interessantes (DefaultLogger.h, DefaultLogger::create)?
- funktioniert es mit aiGetMaterialString anstatt aiMaterial::Get?

Sorry dass wir bislang nicht mehr helfen konnten - ich tappe einfach etwas im Dunkeln, wo die Ursache zu suchen ist.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Ok, das mit dem Logger war ein guter Tipp :)
Info, T980: Import root directory is 'C:\Eigene Dateien\Visual Studio 2005\Projects\Mrl\MrlViewer\Bin\'
Error, T980: OBJ: Unable to locate material file C:\Eigene Dateien\Visual Studio 2005\Projects\Mrl\MrlViewer\Spider0.mtl
Ich habe auch die Datei mal umkopiert und in anderen Pfaden getestet, es scheint so, als suche er die Material Datei immer eine Ebene zu hoch. (D.h. es liegt auch nicht daran, ob ich das Programm aus der IDE mit nem anderen Pfad oder so starte).
Die Pfade in den OBJ Dateien scheinen auch alle zu stimmen.
Komisch natürlich, dass bei euch alles funktioniert, auch wenn der Fehler jetzt um einiges konkreter ist, finde ich den immer noch seltsam.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Verdammt, da hätten wir auch früher draufkommen können, denn es gab schon mehrfach Probleme mit externen Dateien. Weshalb Assimp auch seit geraumer Zeit einen Filter unter Sein Dateisystem schiebt, um externe Files zuverlässig zu finden. So wie ich das sehe, kommt der beim Obj-Loader aber gar nicht zum Einsatz.

Bitte probier es mal mit folgendem Patch (gg. r470):
Dateianhänge
obj_mtl_fix.txt
(3.41 KiB) 191-mal heruntergeladen
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

@Aramis:
Bei dem Patch hast du den getOSSeparator rausgenommen. Da ist Vorsicht geboten. Unter Linux wird das nun nicht mehr laufen, da dort Slashes statt Backslashes benutzt werden.

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Jepp, das war durchaus bewusst. Die Filterebene im Dateisystem wandelt generell alle Pfadseparatoren in Slashes bzw. Backslashes um.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Ok, dann ist das ja kein Problem und sollte auch so funktionieren. Mich wundert trotz dessen, wie da der falsche Pfad entstehen kann. Mal sehen, vielleicht kann man sowas ja reproduzieren.

Gruß Kimmi
Benutzeravatar
Jonathan
Establishment
Beiträge: 2382
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Jonathan »

Mit dem Patch geht es :)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von Aramis »

Schön, dann checke ich das mal ein :-)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [Assimp] Material auslesen

Beitrag von kimmi »

Danke für den Fix im Obj-Loader, Aramis. Den Umbau mit dme Filter im IO-System hatte ich verpennt.

Gruß,
Kimmi
Antworten