MD2-Format skaliert!?



  • Hi Leute,
    ich hab eine Frage. Und zwar würd ich mal gern wissen, warum man das MD2-Format
    erst skalieren muss, anstatt es gleich auszulesen und in Bytes zu packen. Hat das einen bestimmten Grund? Man könnte das Model doch dann gleich nach dem modellieren
    komprimieren und skalieren oder nicht?
    Danke im Voraus!


  • Mod

    ich komme da irgendwie nicht mit. wann muss man was skalieren? beziehst du dich auf irgend nen speziellen artikel oder sourcecoder oder...?



  • Allgemein bei der Implentierung der Frames. Jedes Frame wird ja in einem
    Byte gespeichert, welches nicht wirklich die Texturkoordinaten enthält. Deswegen
    skaliert man die Bytes um die richtigen Koordinaten zu bekommen. Später addiert man ja noch zur skalierung den translate Wert der Texturen. Leider finde ich nur selten Vermutung wie zum Beispiel:"Die Bytes werden skaliert um das Model klein zu halten und jedes Frame in einem Byte zu speichern". Bezogen habe ich mich auf CppJunkys Tutorial: http://home.arcor.de/cppjunky/tutorials/md2/tutor_md2.htm

    "frameSize"
    Grösse eines Frames in Byte
    
    struct MD2_Vertex
    {
        BYTE vertex[3];
        BYTE lightNormalIndex;
    };
    

  • Mod

    WiredCoder schrieb:

    Allgemein bei der Implentierung der Frames. Jedes Frame wird ja in einem
    Byte gespeichert, welches nicht wirklich die Texturkoordinaten enthält. Deswegen
    skaliert man die Bytes um die richtigen Koordinaten zu bekommen. Später addiert man ja noch zur skalierung den translate Wert der Texturen. Leider finde ich nur selten Vermutung wie zum Beispiel:"Die Bytes werden skaliert um das Model klein zu halten und jedes Frame in einem Byte zu speichern". Bezogen habe ich mich auf CppJunkys Tutorial: http://home.arcor.de/cppjunky/tutorials/md2/tutor_md2.htm

    "frameSize"
    Grösse eines Frames in Byte
    

    ich glaube das hast du vielleicht nur falsch interpretiert, hier wird nicht ein frame in einem byte gespeichert, der wert gibt lediglich an wieviel byte ein frame braucht.
    Und ja, man macht das ganze um speicher zu sparen, du hast locker ein paar hundert frames und wenn jedes ein paar KB zieht, sprengst du die megabyte grenze, dabei sollte das spiel ab 8MB ram laufen wenn ich mich recht erinnere.



  • Ich wusste gar nicht, das überhaupt jemand meine Tutorials liest 😃 Wie schon gesagt dient dies zur Daten-Komprimierung. So verbraucht man lediglich 3x1 Byte pro Vertex im Vergleich zu den gängigen 3 floats o.ä. BTW brauchst du dir bei meiner Implementierung über die Framesize keine Gedanken machen.



  • Also ist es doch richtig, dass mit den "virtuellen Bytes" die echten Bytes verkleinert, also komprimiert werden!?



  • nix virtuell..
    byte = byte = byte = byte..
    Der Vorteil des md2-Formats ist der, dass es unkomprimiert ist. Es versucht den besten Kompromiss zwischen Rechenzeit und Speicherverbrauch zu schließen. Alles wird möglichst in Byteform gespeichert.

    @junky: Deine Beschreibung ist zuar ganz ordentlich, aber damit man den Aufbau der md2-Dateien (und ich sag ja immer, das isn Format aus dem letzten Jahrtausend) besser versteht, solltest du deine grafischen Fähigkeiten nutzen..

    Hier mal grob skizziert, wie die Datei aufgebaut ist..

    [HEADER]
       ...
    [SKINS]
       ...
    [TEXCOORDS]
       ...
    [TRIANGLES]
       [TRIANGLE0]
       [TRIANGLE1]   
       ...
    [FRAMES]
       [FRAME0]
          [VERTEX0]
          [VERTEX1]
          [VERTEX2]      
          [VERTEX3]
          [VERTEX4]            
       [FRAME1]
          [VERTEX0]
          [VERTEX1]
          [VERTEX2]      
          [VERTEX3]
          [VERTEX4]                  
          ...
       [FRAMExx]
          [VERTEX0]
          [VERTEX1]
          [VERTEX2]      
          [VERTEX3]
          [VERTEX4]                  
    [GLCOMMANDS]      
    ...
    

    @Wired : Ich sag doch immer Pen & Paper sind die beste IT.. Setz dich hin und skizzier dir was du verstanden hast. Der bildhafte Lerntyp ist am weitesten verbreitet 🙂



  • Erstmal danke euch allen, meiner Meinung nach hab ich es jetzt aber verstanden.
    Zumindest einen kleinen Teil, ich fang mal an, könnt mich gerne korrigieren!
    Also,
    ein Frame ist ein Punkt eines Triangles, welches mit einem
    BYTE-Typ skaliert wird, weil die Speicheradresse(!?) damit
    kleiner ist und nicht so viel Bit anfordert. Das heisst unsere
    Punkte werden schneller in den Binären Speicher geladen und damit
    auch schneller verfügbar. Ein Vertex ist in diesem Falle ein
    von im Dreickliegender Punkt. Weil jeder Vertex 3 eigene Koordinaten
    hat, setzt man hier eine Variable in einem BYTE(!) an, nämlich:

    BYTE vertex[3];
    

    Da dieser Speicherzugriff Binär und so klein wie möglich sein
    sollte, wird er in einem BYTE-Speicher gespeichert und später skaliert!

    Aber meine Frage ist dabei, warum wird ein Frame skaliert, anstatt
    direkt den BYTE, der die Koordinaten hat zu skalieren? Das ist doch
    eigentlich nur eine Variablenzeiger.

    Seh ich das falsch?


Anmelden zum Antworten