Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Hallo,
ich stehe irgendwie auf dem Schlauch. In dem Editor, den ich fuer ein Dungeon-Spiel schreibe, sollen 3DS oder Milkshape - Modelle geladen werden. Den 3DS - Loader habe ich mir aus NapalmBomber geholt, den MilkShape - Importer aus GLScene. Beide erstellen DisplayListen, die ich spaeter nur noch aufrufen muss.
Schön und gut. Das Modell, ohne Texturen, wird geladen und es werden die Displaylisten erstellt. Dies scheint fehlerfrei zu laufen, zumindestens liefert glGetError keine Fehler zurück, wenn ich den Aufruf an den unterschiedlichen Stellen plaziert habe. Aber bei Aufruf von glCallList passiert nichts. Das Drahtmodell des Dungeons wird korrekt dargestellt, nur das 3D Modell halt nicht. Zur Sicherheit stelle ich noch einen Würfel an der Position des Modelles dar, um zu sehen ob der Aufruf zum Zeichen überhaupt erfolgt. Der Würfel jedoch wird gezeichnet. Wenn ich das Modell in MilkShape lade, wird es ohne Probleme dargestellt.
Ich weis, das dies sehr wage ist, aber wo kann ich den Fehler suchen? Ich verwende kein Licht, kein Blending, kein Alphamasking.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
HomerS hat geschrieben:
Versuche mal den 3ds Loader von Lischke. Der erstellt keine DL. Zumindest für Testzwecke.
@HomerS : Dreimal darfst du raten worauf der 3DS-Loader von NapalmBomber3D basiert .Der 3DS-Loader von Mike Lischke erstellt nämlich sehr wohl DisplayListen.Er erstellt zuerst VertexArrays für die einzelnen Meshes und legt diese dann in einer Displayliste ab.
@KidPaddle : Deine Problemstellung ist wirklich sehr sehr wage...allerdings ist es dir wahrscheinlich entgangen, das der 3DS-Loader aus dem zweiten NB3D-Tut zwar die Texturen des Modelles lädt, diese allerdings nicht an die Meshes bindet. Deshalb musst du da noch eine Kleinigkeit im Loadercode ändern : <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> <span class='reserved'>for</span> J := <span class='integer'>0</span> <span class='reserved'>to</span> FaceGroups.Count - <span class='integer'>1</span> <span class='reserved'>do</span> <span class='reserved'>with</span> PFaceGroup(FaceGroups[J])^ <span class='reserved'>do</span> <span class='reserved'>begin</span> // Diese Zeile fehlt im Originalcode, und wird benötigt damit die geladenen Texturen auch gebunden werden ! TextureManager.BindTexture(Texture) <span class='reserved'>with</span> PMaterial(MatList.Objects[TextureIndex])^ <span class='reserved'>do</span> <span class='reserved'>begin</span> glEnable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glColor3f(Diffuse[<span class='integer'>0</span>],Diffuse[<span class='integer'>1</span>],Diffuse[<span class='integer'>2</span>]); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, @Diffuse); TextureManager. <span class='reserved'>end</span>; </pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3--> Sry, aber da ich im zweiten Bombermantut nur 3DS-Modelle ohne Texturen genutzt hab, ist mir das nicht aufgefallen!
Registriert: Mo Jan 20, 2003 20:10 Beiträge: 424 Wohnort: nähe Starnberg
Hallo SoS,
ja, diese Zeile fehlte, aber da ich keine Texturen verwende, macht es auch nichts aus. Denn TextureManager verwende ich nicht.
Beim debuggen viel mir auf, das beim erstellen der DisplayLists wahrscheinlich Memory Leaks entstehen. Du fügst Pointer in Listen mit MatList.AddObject(Name, Ptr) oder MeshList.Add(Ptr) ein, die aber nicht automatisch durch das Freigeben der Liste freigeben werden. So steht es in der Delphi Doku.
Zitat:
Hinweis: Das TStringList-Objekt ist nicht der Eigentümer der Objekte, die auf diese Weise hinzugefügt werden. Diese Objekte exisitieren weiter, auch wenn die TStringList-Instanz freigegeben wird. Sie müssen explizit von der Anwendung freigegeben werden.
Wie kann ich testen, ob eine DisplayListe, funktioniert oder nicht?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
KidPaddle hat geschrieben:
Hallo SoS,
ja, diese Zeile fehlte, aber da ich keine Texturen verwende, macht es auch nichts aus. Denn TextureManager verwende ich nicht.
Beim debuggen viel mir auf, das beim erstellen der DisplayLists wahrscheinlich Memory Leaks entstehen. Du fügst Pointer in Listen mit MatList.AddObject(Name, Ptr) oder MeshList.Add(Ptr) ein, die aber nicht automatisch durch das Freigeben der Liste freigeben werden. So steht es in der Delphi Doku.
Zitat:
Hinweis: Das TStringList-Objekt ist nicht der Eigentümer der Objekte, die auf diese Weise hinzugefügt werden. Diese Objekte exisitieren weiter, auch wenn die TStringList-Instanz freigegeben wird. Sie müssen explizit von der Anwendung freigegeben werden.
Ich mach da nix...ich hab die Unit ja nicht von grundauf geschrieben, und die meisten Funktionen und evtl. Memoryleaks (inklusivem dem Laden ver Mesh und Materialdaten) stammen noch aus Mike Lischkes 3DS-Loader, der mir allerdings zu unübersichtlich war, weshalb ich die NB3D-Unit angepasst hab.
Zitat:
Wie kann ich testen, ob eine DisplayListe, funktioniert oder nicht?
Das geht schlecht...wenn nichts angezeigt wird, dann fällt das Testen schwer.Du kannst höchstens anhand der ListenID prüfen ob diese überhaupt erstellt werden konnte. Wenn du dein Modell allerdings im 3DStudio MAX erstellt hast, dann solltest du es vor dem Zeichnen unbedingt stark runterskalieren, da der Objektmasstab im 3DS sehr viel größer ist.Meine Spielfiguren in NapalmBomber3D musste ich z.B. um den Faktor 0.0085 auf allen Achsen skalieren damit sie in die Szene passten.
Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.