Modellklasse mit c++ und OpenGL - Blender Exporter Script und Model-Viewer



  • Isodrink schrieb:

    Wenn ich so eine einfachen Würfel speichern wollte klappt das in Meinem Kopf schon ganz gut, aber ein Paar Fragen habe ich noch:
    Was ist aber, wenn ich auf das Mesh vor dem Zeichnen noch Funktionen anwenden muss? Also wenn ich Farbe, Größe ändern, oder sogar mit einem Skelet arbeiten will. Dann brauche ich Funktionen, die das Mesh verändern, bevor es zum Zeichnen übergeben wird!

    Dann sind wir ja nicht mehr bei einfach. Du brauchst für das ganze ja eine Datenstruktur. Es wäre ja vollkommen Wahnsinn, das fest kodieren zu wollen. Du hättest also dein Modell und dein Skelett. Dann würdest du die Vertices in deiner Datenstruktur ja dem Skelett anpassen, also die Vertices bewegen.

    Du hättest also ein Modell bei dem du eine Liste von Vertices hast, die von den Faces referenziert werden. Dann manipulierst du die Vertices und übergibst das ganze an OpenGL. Soweit ich weiß, kann OpenGL auch mit solchen indizierten Datenstrukturen umgehen. Du müsstest mal nach der entsprechenden Funktion suchen.

    Isodrink schrieb:

    Würde man dann eine Scriptsprache verwenden? So kann man dann alles auch nach dem Compilieren noch ändern.
    Auf was ich auf keinen Fall verzichten möchte ist der objektorientierte Ansatz!

    Ja, aber du wärst wieder bei dem selben Problem: Erkläre deinem Freund, der noch nie Programmiert hat, mal deine Skriptsprache zu benutzen. Ich kann die nur raten, die Daten vom Programm sauber zu trennen.

    Isodrink schrieb:

    Was meist du damit?

    Beispiel: Quaternionen. Ich kann einfach die Rotation eines Objektes als Quaternion abspeichern.

    Außerdem kann man auf einfache Weise Zwischenergebnisse speichern.



  • Naja, mein Fahrplan sah eigentlich so aus, dass ich mir ein geeignetes Format für die Daten ausdenke, und dann ein Programm schreibe, dass solche Daten aus einer Datei, die ich mit Blender abspeichere auslese und in mein Format wandle. Dann macht es auch keine Probleme mehr das ganze fest zu codieren oder? 😕
    Und das Risiko meinem Freund erklären zu müssen, wie man Primitive mit Blender macht gehe ich ein 🙂 (Wenn du meine Freunde kennen würdest *g*)



  • Isodrink schrieb:

    Naja, mein Fahrplan sah eigentlich so aus, dass ich mir ein geeignetes Format für die Daten ausdenke, und dann ein Programm schreibe, dass solche Daten aus einer Datei, die ich mit Blender abspeichere auslese und in mein Format wandle. Dann macht es auch keine Probleme mehr das ganze fest zu codieren oder? 😕

    Was versprichst du dir davon, außer dass du Flexibilität aufgibst? Deine Daten müssten doch eh in eine Datenstruktur rein. Wenn du willst, kannst du deine Datei ja so gestalten, dass die Daten in einem Rutsch einfach nur in die Struktur rein kopiert werden müssen.



  • Es ist im Prinzip egal, da die Daten hinterher sowieso durch den Arbeitsspeicher gejagt werden. Wird beides keine Auswirkungen auf die Performance haben...
    Zumindest nicht bei kleinreren Framework's...



  • Gut nehmen wir an, ich schreibe die Positionen von Verts, Texturen, Farben und Knochen in eine txt Datei oder so.
    Wie bekomme ich daraus dann ein Objekt?



  • Isodrink schrieb:

    Gut nehmen wir an, ich schreibe die Positionen von Verts, Texturen, Farben und Knochen in eine txt Datei oder so.
    Wie bekomme ich daraus dann ein Objekt?

    Ich hab zwar nicht alles gelesen aber:
    Schreib dir doch einfach einen Loader.
    Dem übergibst du den Pfad der Datei und gibt nen Pointer auf das von dir gewünschte Objekt zurück.
    (Einfach alles auslesen und dann damit ein neues Objekt erstellen...)


  • Mod

    bei nehe gibt es einige tutorials dazu, mach dir das leben einfach und lies sie durch 😉



  • Gut nehmen wir an, ich schreibe die Positionen von Verts, Texturen, Farben und Knochen in eine txt Datei oder so.
    Wie bekomme ich daraus dann ein Objekt?

    Ganz einfach, du legst dir eine genaue Struktur an, beispielsweise:

    2 3 2 0 1
    

    2, 3 und 2 wären beispielsweise die x, y, z-Koordinaten die du ausliest. 0 und 1 sind zum Beispiel die Texturkoordinaten. Kannste so machen, lieste einfach ein und verarbeitest jede Zeile. Das war's im Prinzip schon, müsste bei nehe Tutorial 6 oder 8 sein.



  • Das ich einen Loader schreiben kann und alle Daten in das Programm einlesen kann ist mir schon klar 😉
    Nur wie erzeuge ich dann daraus eine Klasse, von der ich dann Istanzen erzeugen kann? Meiner Meinug nachgeht das nur mit einer Scriptsprache, aber ich lasse mich natürlich gerne korrigieren 🙂



  • Wozu willst du von dieser Klasse dann noch Instanzen erzeugen?
    Wenn das Model einmal im Speicher liegt, reicht das doch.



  • Naja, wenn ich zb. für ein Tower-Defence Spiel oder so, Einheiten mach, brauche ich nicht nur eine, sondern mehrere. Jede dieser Instanzen hat dann die gleichen Eigenschaften, jede aber andere Werte, wie zB. Lebenspunkte.
    Mir ist allerdings schon eine Idee gekommen, wie ich das machen könnte......mal sehen 🙂



  • Aber was haben denn bitte Eigenschaften wie Lebenspunkte etc. mit dem 3D-Modell an sich als Model zu tun? Das bleibt doch immer gleich, also musst du dieses ja nur einmal laden.



  • Das ich einen Loader schreiben kann und alle Daten in das Programm einlesen kann ist mir schon klar 😉
    Nur wie erzeuge ich dann daraus eine Klasse, von der ich dann Istanzen erzeugen kann? Meiner Meinug nachgeht das nur mit einer Scriptsprache, aber ich lasse mich natürlich gerne korrigieren 🙂

    Ich glaube du hast die Idee dahinter noch nicht so ganz verstanden.

    Isodrink schrieb:

    Naja, wenn ich zb. für ein Tower-Defence Spiel oder so, Einheiten mach, brauche ich nicht nur eine, sondern mehrere. Jede dieser Instanzen hat dann die gleichen Eigenschaften, jede aber andere Werte, wie zB. Lebenspunkte.
    Mir ist allerdings schon eine Idee gekommen, wie ich das machen könnte......mal sehen 🙂

    In der Datei stehen NUR die Daten für Vertices und Texturkoordinaten.
    Also z.B.:

    10 345 12 0 0
    

    Mehr nicht.
    Und du baust dir jetzt einfach einen Loader der die Daten Zeile für Zeile ausliest und in irgendeiner Struktur abspeichert.
    Somit hast du dein 3D Model geladen und kannst dann alles damit machen, was du willst.
    Wenn du jetzt z.B. bei einem Towerdefensegame die Gegner darstellen willst, lädst du einmal am Anfang das Model und speicherst es in (z.b.) einer EnemyManager Klasse die alle Gegner in einer Liste verwaltet. Wenn du jetzt alles rendern willst musst du nur das Model nach den Daten der einzelnen Gegner ausrichten und renderst es einfach.
    Das Model selbst hat rein gar nichts mit Lebenspunkten, Koordinaten, Waffen oder sonstwas zu tun.
    Zum Speichern der Vertices kannst du ja einfach einen Vector/Liste/Whatever verwenden.

    Das Model für jede Einheit zu laden wäre doch vollkommen sinnlos und obendrein speicherfressend.
    Die Gegner selbst haben nur eine Rotation und Position - zusätzlich zu den anderen Daten die das Spielinterne Verhalten betreffen



  • Ok, wenn ich das richtig verstanden habe, kann ich eine Klasse Enemy oder so schreiben, die dann eine Funktion loadData enthält,die die Datei ausliest und die ich nur einmal bei der Initialisierung aufrufe?



  • Na ja, du solltest das ganze trennen.
    Ne Klasse Enemy ist schonmal richtig.
    Dann hast du noch ne Klasse Model, oder so. Die beinhaltet einfach nur das 3D-Model und die entsprechenden Funktionen zum Verwalten, und die kann auch ein Model laden. Wenn du meinetwegen 5 3D-Modelle hast, erstellst du halt 5 Instanzen dieser Klasse und lädst in jeder das jeweilige Model.
    Jetzt brauchst du dem Gegner nur noch die ID des Models zuweisen.
    Das Ganze lässt sich zwar noch erweitern und verbessern, aber vom Grundprinzip ist es schonmal das, was wir meinen 😉



  • Ok, aber was ist, wenn das Modell irgendwas besonderes können muss, z.B. wenn sich einzelne Teile auf so zu sagen Kommando bewegen sollen?



  • Isodrink schrieb:

    Ok, aber was ist, wenn das Modell irgendwas besonderes können muss, z.B. wenn sich einzelne Teile auf so zu sagen Kommando bewegen sollen?

    Dann erstellst du eben dafür eine Klasse die alles von der Modelklasse erbt nur eben auf die besonderen Eigenschaften eingeht.

    Allerdings klingt das ganze eher so als solltest du dich eher mal mit der grundlegenden Logik und dem Aufbau auseinandersetzen



  • Kuldren schrieb:

    Dann erstellst du eben dafür eine Klasse die alles von der Modelklasse erbt nur eben auf die besonderen Eigenschaften eingeht.

    Ist ja gut, ich gebe mich geschlagen 🙂
    Ich fange dann mal an, was in der Richtung zu basteln und poste dann das Ergebnis hier.

    Kuldren schrieb:

    Allerdings klingt das ganze eher so als solltest du dich eher mal mit der grundlegenden Logik und dem Aufbau auseinandersetzen

    Von was? Programmieren allgemein, Klassen, OpenGL, 3D Grafik, c++...... 🙄



  • Isodrink schrieb:

    Kuldren schrieb:

    Allerdings klingt das ganze eher so als solltest du dich eher mal mit der grundlegenden Logik und dem Aufbau auseinandersetzen

    Von was? Programmieren allgemein, Klassen, OpenGL, 3D Grafik, c++...... 🙄

    Wenn du mit einem Spiel (also z.b. ein Towerdefensegame) anfängst solltest du dich mit der Sprache (hier wohl c++), OOP und OGL bzw D3D (letzere zumindest zum Teil) auskennen!

    Was ich aber gemeint habe war der prinzipielle Aufbau deines Spiels.
    Einfach losprogrammieren endet meist in einem Wirrwarr an Code. Wenn du jetzt viel Arbeit in eine bestimmte Klasse steckst und dann im Nachhinein draufkommst, dass die Klasse total überflüssig ist weil die Daten in einer Anderen besser gekapselt wären, wirst du dich nur unnötig ärgern.
    Du musst ja keine Spezifikation schreiben aber die Grundstruktur sollte klar ersichtlich sein.

    Willst du denn nun ein TowerDefenseGame programmieren? oder etwas anders? je nach dem solltest du bei einem anderen Punkt anfangen. Direkt mit dem Darstellen der Gegner anzufangen finde ich eher schlecht.



  • Von was? Programmieren allgemein, Klassen, OpenGL, 3D Grafik, c++...... 🙄

    OpenGL, 3D-Grafik und C++.


Anmelden zum Antworten