Code-Problem Collada modell_loader für Opengl



  • Hallo,

    ich habe angefangen eine Klasse zu schreiben, die es ermöglichen soll, Modelle aus dem Collada-xml-Format V1.4 zu laden. Ziel des Ganzen ist, die Daten direkt in eine VBO Struktur zu bringen, oder in Form einer Displayliste auszugeben. Bisher habe ich eine Funktion geschrieben, die die benötigten Vertex-Daten aus der Struktur ausliest. Nun geht es daran, die Informationen zu beschaffen, die mir sagen welche Verts zu einem Face zusammengeschlossen werden sollen. Und da fängt das Problem an:

    Da es durchaus möglich ist, das pro Mesh mehrere Materialien definiert werden speichert Collada die Information über die Faces nach Materialien geordnet ab. Das Macht ja auch durchaus Sinn. Aber es stellt sich für mich nun die Frage, ob ich die Daten nun in eine Struktur einlese, die Nach Materialien geordnet ist, oder ob ich mir Material-unabhängig die Daten zusammensuche und daraus das Mesh bastele und dann die Information, welches Face welches Material hat, irgendwie später extra lade.

    Auch würde ich gerne wissen, ob ihr so einen Modell-Loader überhaupt für sinnvoll haltet

    Anbei noch ein Ausschnitt aus der xml eines Würfels, an der man hoffentlich sieht, was ich meine (eine Fläche hat ein anderes Material, als die anderen):

    <mesh>
    				<source id="Cube-Geometry-Position">
    					<float_array count="24" id="Cube-Geometry-Position-array">1.00000 1.00000 -1.00000 1.00000 -1.00000 -1.00000
     -1.00000 -1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000 1.00000
     1.00000 -1.00000 1.00000 -1.00000 -1.00000 1.00000 -1.00000 1.00000 1.00000</float_array>
    					<technique_common>
    						<accessor count="8" source="#Cube-Geometry-Position-array" stride="3">
    							<param type="float" name="X"></param>
    							<param type="float" name="Y"></param>
    							<param type="float" name="Z"></param>
    						</accessor>
    					</technique_common>
    				</source>
    				<source id="Cube-Geometry-Normals">
    					<float_array count="18" id="Cube-Geometry-Normals-array">0.00000 0.00000 -1.00000 0.00000 -0.00000 1.00000
     1.00000 -0.00000 0.00000 -0.00000 -1.00000 -0.00000 -1.00000 0.00000 -0.00000
     0.00000 1.00000 0.00000</float_array>
    					<technique_common>
    						<accessor count="6" source="#Cube-Geometry-Normals-array" stride="3">
    							<param type="float" name="X"></param>
    							<param type="float" name="Y"></param>
    							<param type="float" name="Z"></param>
    						</accessor>
    					</technique_common>
    				</source>
    				<vertices id="Cube-Geometry-Vertex">
    					<input semantic="POSITION" source="#Cube-Geometry-Position"/>
    				</vertices>
    				<triangles count="10" material="Material">
    					<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
    					<input offset="1" semantic="NORMAL" source="#Cube-Geometry-Normals"/>
    					<p>0 0 1 0 2 0 2 0 3 0 0 0 4 1 7 1 6 1 6 1 5 1 4 1 0 2 4 2 5 2 5 2 1 2 0 2 2 4 6 4 7 4 7 4 3 4 2 4 4 5 0 5 3 5 3 5 7 5 4 5</p>
    				</triangles>
    				<triangles count="2" material="Material_001">
    					<input offset="0" semantic="VERTEX" source="#Cube-Geometry-Vertex"/>
    					<input offset="1" semantic="NORMAL" source="#Cube-Geometry-Normals"/>
    					<p>1 3 5 3 6 3 6 3 2 3 1 3</p>
    				</triangles>
    			</mesh>
    


  • Ich habe nun einfach mal die Face-Daten aus der Datei geladen, ohne zwischen den Materialien zu unterscheiden. Das Ganze funktioniert soweit auch und das komplette Mesh wird richtig auf den Bildschirm gebracht. Nur habe ich entdeckt, das, wenn ich das Programm verlasse und genau 2 Faces ausgebe, das Programm mir zum Abschied eine Fehlermeldung mit auf den Weg gibt. Dieses Problem tritt nur auf, wenn ich das Programm schließe UND genau zwei Triangles zeichne. Dann bekomme ich folgende Fehlermeldung:

    *** glibc detected *** ./1: free(): invalid pointer: 0x0000000001c722d0 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x7faa58d1bcb8]
    /lib/libc.so.6(cfree+0x76)[0x7faa58d1e276]
    /usr/lib/libX11.so.6(XkbFreeClientMap+0xbb)[0x7faa575443fb]
    /usr/lib/libX11.so.6(XkbFreeKeyboard+0x160)[0x7faa57549070]
    /usr/lib/libX11.so.6[0x7faa5753c6b5]
    /usr/lib/libX11.so.6(_XFreeDisplayStructure+0x13f)[0x7faa574d21cf]
    /usr/lib/libX11.so.6(XCloseDisplay+0xd1)[0x7faa574bda51]
    /usr/lib/libSDL-1.2.so.0[0x7faa597fd8ef]
    /usr/lib/libSDL-1.2.so.0(SDL_VideoQuit+0x42)[0x7faa597eee32]
    /usr/lib/libSDL-1.2.so.0(SDL_QuitSubSystem+0x55)[0x7faa597c78b5]
    /usr/lib/libSDL-1.2.so.0(SDL_Quit+0xe)[0x7faa597c793e]
    ./1[0x4023a3]
    /lib/libc.so.6(__libc_start_main+0xe6)[0x7faa58cc25a6]
    ./1[0x401cb9]
    ======= Memory map: ========
    00400000-00405000 r-xp 00000000 08:02 2867201 /home/isodrink/Desktop/opengl/neu/1
    00604000-00605000 r--p 00004000 08:02 2867201 /home/isodrink/Desktop/opengl/neu/1
    00605000-00606000 rw-p 00005000 08:02 2867201 /home/isodrink/Desktop/opengl/neu/1
    01ba4000-01cd2000 rw-p 01ba4000 00:00 0 [heap]
    4044d000-4044f000 rwxp 00000000 00:0f 751 /dev/zero
    7faa50000000-7faa50021000 rw-p 7faa50000000 00:00 0
    7faa50021000-7faa54000000 ---p 7faa50021000 00:00 0
    7faa553a6000-7faa555a6000 rw-s 4cdfc000 00:0f 6319 /dev/nvidia0
    7faa555a6000-7faa555aa000 rw-s 4cdf2000 00:0f 6319 /dev/nvidia0
    7faa555aa000-7faa556aa000 rw-s 4cd57000 00:0f 6319 /dev/nvidia0
    7faa556aa000-7faa556ea000 rw-s 4cc04000 00:0f 6319 /dev/nvidia0
    7faa556ea000-7faa5570a000 rw-s 4cc32000 00:0f 6319 /dev/nvidia0
    7faa5570a000-7faa55738000 rw-p 7faa5570a000 00:00 0
    7faa557de000-7faa557e3000 r-xp 00000000 08:04 2712896 /usr/lib/libXfixes.so.3.1.0
    7faa557e3000-7faa559e2000 ---p 00005000 08:04 2712896 /usr/lib/libXfixes.so.3.1.0
    7faa559e2000-7faa559e3000 rw-p 00004000 08:04 2712896 /usr/lib/libXfixes.so.3.1.0
    7faa559e3000-7faa559ec000 r-xp 00000000 08:04 2712534 /usr/lib/libXrender.so.1.3.0
    7faa559ec000-7faa55beb000 ---p 00009000 08:04 2712534 /usr/lib/libXrender.so.1.3.0
    7faa55beb000-7faa55bec000 r--p 00008000 08:04 2712534 /usr/lib/libXrender.so.1.3.0
    7faa55bec000-7faa55bed000 rw-p 00009000 08:04 2712534 /usr/lib/libXrender.so.1.3.0
    7faa55bed000-7faa55bf6000 r-xp 00000000 08:04 2712886 /usr/lib/libXcursor.so.1.0.2
    7faa55bf6000-7faa55df6000 ---p 00009000 08:04 2712886 /usr/lib/libXcursor.so.1.0.2
    7faa55df6000-7faa55df7000 rw-p 00009000 08:04 2712886 /usr/lib/libXcursor.so.1.0.2
    7faa55df7000-7faa55ee2000 r--p 00000000 08:04 2154503 /usr/lib/locale/de_DE.utf8/LC_COLLATE
    7faa55ee2000-7faa55ee7000 r-xp 00000000 08:04 2711838 /usr/lib/libXdmcp.so.6.0.0
    7faa55ee7000-7faa560e6000 ---p 00005000 08:04 2711838 /usr/lib/libXdmcp.so.6.0.0
    7faa560e6000-7faa560e7000 rw-p 00004000 08:04 2711838 /usr/lib/libXdmcp.so.6.0.0
    7faa560e7000-7faa560ee000 r-xp 00000000 08:04 1564837 /lib/librt-2.9.so
    7faa560ee000-7faa562ed000 ---p 00007000 08:04 1564837 /lib/librt-2.9.so
    7faa562ed000-7faa562ee000 r--p 00006000 08:04 1564837 /lib/librt-2.9.so
    7faa562ee000-7faa562ef000 rw-p 00007000 08:04 1564837 /lib/librt-2.9.so
    7faa562ef000-7faa5630a000 r-xp 00000000 08:04 2712028 /usr/lib/libxcb.so.1.1.0
    7faa5630a000-7faa56509000 ---p 0001b000 08:04 2712028 /usr/lib/libxcb.so.1.1.0
    7faa56509000-7faa5650a000 r--p 0001a000 08:04 2712028 /usr/lib/libxcb.so.1.1.0
    7faa5650a000-7faa5650b000 rw-p 0001b000 08:04 2712028 /usr/lib/libxcb.so.1.1.0
    7faa5650b000-7faa5650d000 r-xp 00000000 08:04 2711748 /usr/lib/libXau.so.6.0.0
    7faa5650d000-7faa5670c000 ---p 00002000 08:04 2711748 /usr/lib/libXau.so.6.0.0
    7faa5670c000-7faa5670d000 r--p 00001000 08:04 2711748 /usr/lib/libXau.so.6.0.0
    7faa5670d000-7faa5670e000 rw-p 00002000 08:04 2711748 /usr/lib/libXau.so.6.0.0
    7faa5670e000-7faa56725000 r-xp 00000000 08:04 1564813 /lib/libpthread-2.9.so
    7faa56725000-7faa56924000 ---p 00017000 08:04 1564813 /lib/libpthread-2.9.so
    7faa56924000-7faa56925000 r--p 00016000 08:04 1564813 /lib/libpthread-2.9.so
    7faa56925000-7faa56926000 rw-p 00017000 08:04 1564813 /lib/libpthread-2.9.so
    7faa56926000-7faa5692a000 rw-p 7faa56926000 00:00 0
    7faa5692a000-7faa5693e000 r-xp 00000000 08:04 2711695 /usr/lib/libdirect-1.0.so.0.1.0
    7faa5693e000-7faa56b3e000 ---p 00014000 08:04 2711695 /usr/lib/libdirect-1.0.so.0.1.0
    7faa56b3e000-7faa56b3f000 r--p 00014000 08:04 2711695 /usr/lib/libdirect-1.0.so.0.1.0
    7faa56b3f000-7faa56b40000 rw-p 00015000 08:04 2711695 /usr/lib/libdirect-1.0.so.0.1.0
    7faa56b40000-7faa56b48000 r-xp 00000000 08:04 2714664 /usr/lib/libfusion-1.0.so.0.1.0
    7faa56b48000-7faa56d47000 ---p 00008000 08:04 2714664 /usr/lib/libfusion-1.0.so.0.1.0
    7faa56d47000-7faa56d48000 r--p 00007000 08:04 2714664 /usr/lib/libfusion-1.0.so.0.1.0
    7faa56d48000-7faa56d49000 rw-p 00008000 08:04 2714664 /usr/lib/libfusion-1.0.so.0.1.0
    7faa56d49000-7faa56dba000 r-xp 00000000 08:04 2714663 /usr/lib/libdirectfb-1.0.so.0.1.0
    7faa56dba000-7faa56fb9000 ---p 00071000 08:04 2714663 /usr/lib/libdirectfb-1.0.so.0.1.0
    7faa56fb9000-7faa56fbb000 r--p 00070000 08:04 2714663 /usr/lib/libdirectfb-1.0.so.0.1.0
    7faa56fbb000-7faa56fbd000 rw-p 00072000 08:04 2714663 /usr/lib/libdirectfb-1.0.so.0.1.0
    7faa56fbd000-7faa57096000 r-xp 00000000 08:04 2711984 /usr/lib/libasound.so.2.0.0
    7faa57096000-7faa57296000 ---p 000d9000 08:04 2711984 /usr/lib/libasound.so.2.0.0
    7faa57296000-7faa57299000 r--p 000d9000 08:04 2711984 /usr/lib/libasound.so.2.0.0
    7faa57299000-7faa5729d000 rw-p 000dc000 08:04 2711984 /usr/lib/libasound.so.2.0.0
    7faa5729d000-7faa5729f000 r-xp 00000000 08:04 1564774 /lib/libdl-2.9.so
    7faa5729f000-7faa5749f000 ---p 00002000 08:04 1564774 /lib/libdl-2.9.so
    7faa5749f000-7faa574a0000 r--p 00002000 08:04 1564774 /lib/libdl-2.9.so
    7faa574a0000-7faa574a1000 rw-p 00003000 08:04 1564774 /lib/libdl-2.9.so
    7faa574a1000-7faa575a3000 r-xp 00000000 08:04 2711744 /usr/lib/libX11.so.6.2.0
    7faa575a3000-7faa577a3000 ---p 00102000 08:04 2711744 /usr/lib/libX11.so.6.2.0
    7faa577a3000-7faa577a4000 r--p 00102000 08:04 2711744 /usr/lib/libX11.so.6.2.0
    7faa577a4000-7faa577a8000 rw-p 00103000 08:04 2711744 /usr/lib/libX11.so.6.2.0
    7faa577a8000-7faa577b9000 r-xp 00000000 08:04 2711680 /usr/lib/libXext.so.6.4.0
    7faa577b9000-7faa579b8000 ---p 00011000 08:04 2711680 /usr/lib/libXext.so.6.4.0
    7faa579b8000-7faa579b9000 r--p 00010000 08:04 2711680 /usr/lib/libXext.so.6.4.0
    7faa579b9000-7faa579ba000 rw-p 00011000 08:04 2711680 /usr/lib/libXext.so.6.4.0
    7faa579ba000-7faa5875c000 r-xp 00000000 08:04 2715474 /usr/lib/libGLcore.so.180.44
    7faa5875c000-7faa5885b000 ---p 00da2000 08:04 2715474 /usr/lib/libGLcore.so.180.44
    7faa5885b000-7faa58c92000 rwxp 00da1000 08:04 2715474 /usr/lib/libGLcore.so.180.44
    7faa58c92000-7faa58ca4000 rwxp 7faa58c92000 00:00 0
    7faa58ca4000-7faa58e0c000 r-xp 00000000 08:04 1564749 /lib/libc-2.9.so
    7faa58e0c000-7faa5900c000 ---p 00168000 08:04 1564749 /lib/libc-2.9.so
    7faa5900c000-7faa59010000 r--p 00168000 08:04 1564749 /lib/libc-2.9.so
    7faa59010000-7faa59011000 rw-p 0016c000 08:04 1564749 /lib/libc-2.9.so
    7faa59011000-7faa59016000 rw-p 7faa59011000 00:00 0
    7faa59016000-7faa5902c000 r-xp 00000000 08:04 1564754 /lib/libgcc_s.so.1
    7faa5902c000-7faa5922c000 ---p 00016000 08:04 1564754 /lib/libgcc_s.so.1
    7faa5922c000-7faa5922d000 r--p 00016000 08:04 1564754 /lib/libgcc_s.so.1
    7faa5922d000-7faa5922e000 rw-p 00017000 08:04 1564754 /lib/libgcc_s.so.1
    7faa5922e000-7faa592b2000 r-xp 00000000 08:04 1564775 /lib/libm-2.9.so
    7faAborted

    Das ist die Ausgabe in meiner Konsole unter Linux Ubuntu. Leider kann ich mit diesem Fehler nichts anfangen. Wenn ich ein anderes beliebig komplexes Modell lade, funktioniert alles gut und die Anwendung schließt ohne sich zu beschweren.

    Für den Fall, das ihr den Code für die Anwendung sehen wollt, wollte ich noch fragen ob es OK ist, wenn ich die 400 Zeile hier einfach rein kopiere oder lieber in einer anderen Form poste.



  • So,

    Ich habe das Problem jetzt allein gelöst.
    Jedoch ist mir ein wenig unverständlich, warum funktioniert was ich getan habe. Zum Zeitpunkt, an dem das Problem auftrat, benutzte ich 3 Funktionen aus meiner Klasse. Eine, die die Vertexdaten aus der Datei liest, eine, die ausliest, welche Verts zu einem Face zusammengeschlossen werden sollen und eine, die diese Beiden Daten zu einem Mesh kombiniert. Zuerst habe ich die Funktion auskommentiert, die die eingelesenen Daten kombiniert, doch der Fehler ist geblieben. Dann habe ich die Funktion auskommentiert, die die Facedaten ausliest, und der Fehler verschwand. Der einzige konzeptionelle Unterschied zwischen der Funktion, die die Vertexdaten einliest, und der Funktion, die die Facedaten einliest, ist der, das ich ich für die Fehlerhafte Funktion diese Routine benutzte, um die gesamte Datei in einen String zu schreiben (ich gebe ja zu,dass das wahrscheinlich nicht das gelbe vom Ei ist..):

    string load_file(string name)
    	{
    	FILE* file;
    	file = fopen (name.c_str(),"r");
    		//is the path valid?
    		if (file!=NULL)
    		{
    		char data[1024];
    		string str;
    			while(fscanf(file,"%s",data) >= 0)
    			{
    			str.append(data);
    			str.append(" ");
    			}
    		//fclose (file);
    		return str;
    		}
    	return "false";
    	}
    

    Man beachte das auskommentierte "//fclose (file);". Sobald ich diese Funktion auskommentiert habe, funktionierte wieder alles normal. Da ich den Code nicht aufgeräumt hatte, habe ich diese Funktion nur in der "Face-Funktion" benutzt. In der "Vertex-Funktion" habe ich das nicht ausgelagert. Dort habe ich zum Schluss den file aber wieder mit "fclose" geschlossen.
    Lange Rede, kurzer Sinn: Wieso muss ich den File das eine mal wieder schließen und das andere mal nicht? (Wenn gewünscht kann ich den Source-code posten, wie oben schon gefragt.)

    Mittlerweile habe ich auch eine Funktion geschrieben, die die Normalen ausliest und mit auf den Bildschirm zaubert. Jedoch sieht das Ganze alles andere als normal aus, denn, wie ich gemerkt habe, ist Das Koordinatensystem in Blender (von wo ich meine Exporte fahre) ein anderes als bei OpenGL. Während bei Opengl die Y-Achse nach oben hin verläuft, tut dies Bei Blender die Z-Achse und die Y-Achse verläuft in die Tiefe.

    Reicht es da, wenn ich die Werte einfach anderen Achsen zuweise, oder muss ich da mit Vektoren zaubern(alles um 90Grad drehen)? Meine Versuch die Werte der x- und y-Achse zu tauschen war nicht besonders glücklich.....

    PS: Ich hoffe ich langweile euch nicht 😉

    EDIT: Bild von dem, was ich meine. Geladen ist ein 3D-Kreuz.
    http://img15.imageshack.us/img15/508/screengpd.jpg


Anmelden zum Antworten