Eigenes Modelformat erstellen



  • Hallo!
    Falls das mit den Animationen mit den DirectX Files nicht so einfach ist, habe ich vor ein eigenes Format zu entwerfen. Ich hab da eine Grundidee, billig aber ich denke sie funktioniert (btw: macht das Mesh auch mit Vertex/Indexbuffern?)

    Also:

    Ich hab ne Datei (ach was?), mal angenommen es werden keine Textureigenschaften und keine Materialeigenschaften gespeichert:

    Ich speicher in einem Dateiabschnitt (im Header speicher ich wie groß dieser ist) die Daten aller Vertizen. Ihre ID ist so groß, wie die Stelle an der sie liegen (Vertex ID 75 ist der 75. gespeicherte 😉 )
    Und so save eben ALLE Vertizen des Models.

    Dann (im Header wird wieder die Größe gesavt) kommt der Indexbuffer, indem eben alle Dreiecksvertizen stehen. Jo das ist dann so das ganze Geheimnis. Was haltet ihr davon? Materialdaten habe ich vor, so zu speichern wie es JPEG macht (mit Farben :)) Ich speicher für alle vorhandenen Materialdaten einfach eine Vertex und eine Indexliste. Sobald keine neuen Materialdaten angegeben werden werden die alten beibehalten (JPEG => keine neuen Farbdaten => keine neue Farbe => 100% rotes Bild extrem kleiner als buntes Bild).

    Das DENKE ich funktioniert.

    Mein einziges Problem, bei dem ich keine Ahnung habe wie ich das realisieren könnte ist das mit der Textur. Wie soll ich speichern wie eine Textur gemappt wird? 😕

    Beim eigenen Format sind auch Animationen ganz einfach, für jedes KeyFrame einfach neue Vertexdaten (evtl. nur die geänderten Vertizen saven um Platz zu sparen - MAL SEHEN)

    SOOOO was haltet ihr von der Grundidee. Ich bin im Moment voller Eifer, also bitte macht mich nicht nieder 🙂

    Kevin

    P.S.: Wenn wer Interesse und viel Zeit und auch C++ Ahnung hat, hätte ich auch nichts dagegen wenn wir zusammenarbeiten würden. Bei Interesse -> ICQ UIN: 83046786



  • Mapping speichert man, indem man jedem Vertex Texturkoordinaten gibt...
    Animationen solltest Du nicht so machen, dass Du jedem Vertex zu verschiedenen Zeitpunkten eine Position gibst, das wird nicht funktionieren, es sei denn, Du machst extrem viele dieser "Schnappschüsse". Speichere lieber die Position, Rotation und Skalierung jedes Objekts in jedem Key-Frame und interpoliere später dazwischen.
    Ich bin übrigens gerade dabei, ein eigenes Dateiformat + 3ds max-Exporter + Loader zu entwickeln. Es ist praktisch fertig, ich teste momentan nur noch. Es unterstützt eigentlich alles, was man so braucht, inklusive Animationen und Skinning.
    Weitere Infos findest Du hier im Forum (vor ein paar Wochen habe ich einen Thread gestartet) oder in meinem Forum auf http://www.scherfgen-software.net.



  • Kann man so machen.

    Zur Textur: Einfach nur den Texturnamen speichern. Damit du auch mehr als eine Textur speichern kannst musst du deine Modelle in mehrere Teile(Faces) mit einer jeweils einer Textur aufsplitten können musst. Für diese Face kannst du dann auch separate Materialien festlegen. Wobei jeder Teil seinen Bereich im Vertexbuffer bzw. Indexbuffer bekommt (speichere startindex + Anzahl der Primitives). Die Texturkordinanaten werden ja mit den Vertices gespeichert.
    Wenn du allerdings verschiedene Vertextypen in einem Modell verwenden können willst, dann musst du mehrere VertexBuffer erzeugen und kannst dir den IndexBuffer sparen(oder auch mehrere erzeugen).
    Beim Rendern mit mehreren Texturen müsstest du eh alles wieder nach Texturen aufsplitten.

    Edit: Animationen kannst du über KeyFrames machen, die du dann beim Laden des Modells interpolierst. Bloß nicht während des Renderns interpolieren, da wirst du unglücklich, so lahm ist das. 😉



  • WIe meint ihr das mit dem Interpolieren beim Laden? Könnt ihr darauf mal näher eingehen? 🙂

    Nochmal zum Texturieren: Ich werde dann erstmal versuchen einen .X -> MeinFormat Converter zu coden. Wenn jetzt ein Teil eine bestimmte Textur hat, dieser Teil jedoch aus verschieden großen Polygonen besteht, wie definiere ich da am besten die Texturkoordinaten? Wie könnte man sowas in einem Converter realisieren? Kann ich beim Konvertieren von .X -> Meins - aus der .X Datei herauslesen welche Vertizen welche Texturkoordinaten welcher Textur besitzen? Wenn das ginge wäre das klasse 🙂

    Meint ihr ich schaffe das? In DirectX habe ich jetzt nich sooo viel Erfahrung, lebe mich aber sehr gut ein. In C++ bzw. WINAPI dagegen habe ich jahrelange Erfahrung 🙂

    Kevin



  • Warum schreibst Du nicht einen eigenen .X-Loader?
    Oder hast Du viele Sachen vor, in Dein Format zu packen, die in .X nicht reinkönnen?

    Zum Thema Interpolation:
    Also Animationen speichert man normalerweise so:

    Zum Zeitpunkt 100 hat das Objekt eine Position von (100, 50, 0)
    Zum Zeitpunkt 150 hat das Objekt eine Position von (410, 30, -10)
    ...

    Dasselbe auch für Rotation und Skalierung.

    Wenn Du dann jetzt die Animation zum Zeitpunkt 120 auswerten willst, musst Du zwischen den beiden am nächsten liegenden Key-Frames (hier 100 und 150) interpolieren.



  • D.h. wenn ich Frame 125 will muss ich das Mittel ausrechnen aller Werte wie sie sich verändert haben? Was ist da Standart? Alle 50 Keyframes neues Objekt animieren? Und ich soll dann direkt beim Laden alle möglichen Keyframes in den Speicher laden?



  • Nochma meine Fragen zusammengefasst 🙂

    1:

    Ist es möglich aus einer .X Datei herauszufinden welche Polygone / Vertizen welche Texturkoordinaten haben und von welcher Textur. Sind auch die Normalvektoren noch auszulesen?

    2:

    Beim Interpolieren, soll ich da für alle möglichen Frames die Interpolierung beim Laden durchführen? Dass ich beim Laden bei einer Animation mit 100 Frames 100 mal veränderte Figuren im Speicher habe?

    3: (doch eine mehr :))
    Ist davon auszugehen dass jedes Frame gleich viele Vertizen besitzt? Somit wäre ein weiterer Indexbuffer nämlich überflüssig!

    Kevin



  • So, die Antworten zusammengefasst.

    Surkevin schrieb:

    Ist es möglich aus einer .X Datei herauszufinden welche Polygone / Vertizen welche Texturkoordinaten haben und von welcher Textur. Sind auch die Normalvektoren noch auszulesen?

    Ja.

    Surkevin schrieb:

    Beim Interpolieren, soll ich da für alle möglichen Frames die Interpolierung beim Laden durchführen? Dass ich beim Laden bei einer Animation mit 100 Frames 100 mal veränderte Figuren im Speicher habe?

    Nein.

    Surkevin schrieb:

    Ist davon auszugehen dass jedes Frame gleich viele Vertizen besitzt? Somit wäre ein weiterer Indexbuffer nämlich überflüssig!

    Ja. Aber ein Indexbuffer reicht ohnehin.

    Bye, TGGC



  • HI!
    Danke für deine Antwort.

    Wie könnte ein Indexbuffer reichen, wenn er nicht mal wüsste welche Vertizen zu benutzen sind? 🙂

    Also ist es sicher, dass die Polygone in den Animationsframs gleich bleiben?

    Wie soll das mit dem Interpolieren denn realisiert werden? Das weiß ich leider nicht 😞

    Wäre nett wenn ihr mit da Tipps geben könntet.

    Kevin



  • Es gibt verscheidene Strategien, wie man einen Indexbuffer für verschiedene "Tri-Setups" (z.b. LOD Stufen) nutzen kann. Am einfachsten wäre z.b. alles hintereinander, es sind aber auch komplizierte Sache mit überlappenden Teilen möglich.

    Bye, TGGC



  • Aber wie funktioniert nun das mit der Interpolierung? 😕



  • Vector_1 soll in 5 Schritten nach Vector_2 nterpoliert werden

    Pseudocode:

    for(i= 1;i <= 5;++i)
    {
    Vector_Interpoliert(i).x = Vector_1.x + (Vector_2.x - Vector_1.x)* i / 5 ;
    Vector_Interpoliert(i).y = ...
    }

    jetzt klar?



  • Jo, so dacht ichs mir. Einfach mit den Daten der Keyframes die richtige Posi errechnen. Aber wann soll ich nun die Posis interpolieren? Beim Laden oder wenn sie gebraucht werden?
    Danke
    Kevin



  • Kommt drauf an was du machst.
    Hast du viele Models mit vielen Polygonen , dann kannst du angenehme Frameraten vergessen, wenn du es während des Rendern machst.
    Wenn du es beim Laden machst, hast du zwar einen hohen Speicherbereich, aber angenehme Frameraten.

    Andersherum schadet es gar nix die Berchnung in Echtzeit zu machen, wenn du eh bloß zwei Low-Poly Models hast.

    Deswegen macht man das ja auch besser mit Bone-Animation und Matrizen. Aber das führt zu weit.

    Eventuell auch noch interessant ist das Vertex-Tweening, das Direct3D einem anbietet. Schau dir mal im SDK den Renderstate D3DRS_TWEENFACTOR und das drumherum an.
    Damit lässt sich noch angenehm schnell mit Keyframes in Echtzeit interpolieren.



  • Erstmal Danke für die Auskunft!!!

    Wie hast du das in deinem Modelformat realisiert? Hast du vielleicht ICQ FALLS 🙂 ich mal Fragen haben SOLLTE 😉
    Wäre klasse

    Kevin

    P.S.: Müsst ihr euch auch immer neu einloggen beim Forum obwohl ihr sagt immer eingeloggt bleiben?



  • Was ist ICQ FALLS?!? 😕

    EDIT: Axo... *batz* 😃

    P.S.: Nein, müssen wir nicht. Ggf. Cookies löschen.


Anmelden zum Antworten